/* * Pupil, Hitomi.la viewer for Android * Copyright (C) 2019 tom5079 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package xyz.quaver.pupil import android.app.Application import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build import androidx.appcompat.app.AppCompatDelegate import androidx.preference.PreferenceManager import com.google.android.gms.common.GooglePlayServicesNotAvailableException import com.google.android.gms.common.GooglePlayServicesRepairableException import com.google.android.gms.security.ProviderInstaller import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.ktx.Firebase import io.ktor.client.* import io.ktor.client.engine.okhttp.* import io.ktor.client.features.* import io.ktor.client.features.cache.* import io.ktor.client.features.json.* import io.ktor.client.features.json.serializer.* import okhttp3.Protocol import org.kodein.di.* import org.kodein.di.android.x.androidXModule import xyz.quaver.io.FileX import xyz.quaver.pupil.proto.settingsDataStore import xyz.quaver.pupil.sources.sourceModule import xyz.quaver.pupil.sources.util.NetworkCache import xyz.quaver.pupil.util.* import java.util.* class Pupil : Application(), DIAware { override val di: DI by DI.lazy { import(androidXModule(this@Pupil)) import(sourceModule(this@Pupil)) bind { singleton { NetworkCache(applicationContext) } } bindSingleton { settingsDataStore } bind { singleton { HttpClient(OkHttp) { engine { config { protocols(listOf(Protocol.HTTP_1_1)) } } install(JsonFeature) { serializer = KotlinxSerializer() } install(HttpTimeout) { requestTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS socketTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS connectTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS } BrowserUserAgent() } } } } private lateinit var firebaseAnalytics: FirebaseAnalytics override fun onCreate() { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) preferences = PreferenceManager.getDefaultSharedPreferences(this) val userID = Preferences["user_id", ""].let { userID -> if (userID.isEmpty()) UUID.randomUUID().toString().also { Preferences["user_id"] = it } else userID } firebaseAnalytics = Firebase.analytics FirebaseCrashlytics.getInstance().setUserId(userID) try { Preferences.get("download_folder").also { if (it.startsWith("content")) contentResolver.takePersistableUriPermission( Uri.parse(it), Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) if (!FileX(this, it).canWrite()) throw Exception() } } catch (e: Exception) { Preferences.remove("download_folder") } if (!Preferences["reset_secure", false]) { Preferences["security_mode"] = false Preferences["reset_secure"] = true } if (BuildConfig.DEBUG) FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(false) try { ProviderInstaller.installIfNeeded(this) } catch (e: GooglePlayServicesRepairableException) { e.printStackTrace() } catch (e: GooglePlayServicesNotAvailableException) { e.printStackTrace() } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager manager.createNotificationChannel(NotificationChannel("download", getString(R.string.channel_download), NotificationManager.IMPORTANCE_LOW).apply { description = getString(R.string.channel_download_description) enableLights(false) enableVibration(false) lockscreenVisibility = Notification.VISIBILITY_SECRET }) manager.createNotificationChannel(NotificationChannel("downloader", getString(R.string.channel_downloader), NotificationManager.IMPORTANCE_LOW).apply { description = getString(R.string.channel_downloader_description) enableLights(false) enableVibration(false) lockscreenVisibility = Notification.VISIBILITY_SECRET }) manager.createNotificationChannel(NotificationChannel("update", getString(R.string.channel_update), NotificationManager.IMPORTANCE_HIGH).apply { description = getString(R.string.channel_update_description) enableLights(true) enableVibration(true) lockscreenVisibility = Notification.VISIBILITY_SECRET }) manager.createNotificationChannel(NotificationChannel("import", getString(R.string.channel_update), NotificationManager.IMPORTANCE_LOW).apply { description = getString(R.string.channel_update_description) enableLights(false) enableVibration(false) lockscreenVisibility = Notification.VISIBILITY_SECRET }) } AppCompatDelegate.setDefaultNightMode(when (Preferences.get("dark_mode")) { true -> AppCompatDelegate.MODE_NIGHT_YES false -> AppCompatDelegate.MODE_NIGHT_NO }) super.onCreate() } }