From b04a5fc1509051b4bb4b8c95005085c5729a222a Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 19 Jun 2020 15:18:16 +0900 Subject: [PATCH 01/24] Dependency upgrade --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index ad7f92dd..22a85fe7 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff8fd741..29e5e6d4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Feb 29 09:07:20 KST 2020 +#Thu Jun 18 15:48:09 KST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt b/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt index bd3661a6..40b99b3c 100644 --- a/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt +++ b/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt @@ -82,7 +82,7 @@ class UnitTest { @Test fun test_hiyobi() { - val reader = xyz.quaver.hiyobi.getReader(1574736) + val reader = xyz.quaver.hiyobi.getReader(1663418) print(reader) } From 2f8445fb836d1317faa40d701bd21afd50931bfd Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 19 Jun 2020 16:34:05 +0900 Subject: [PATCH 02/24] Dependency upgrade --- app/build.gradle | 11 ++++++----- .../xyz/quaver/pupil/adapters/ReaderAdapter.kt | 8 ++++---- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 9 +++++---- .../java/xyz/quaver/pupil/ui/ReaderActivity.kt | 6 ++---- .../java/xyz/quaver/pupil/util/download/Cache.kt | 4 ++-- .../quaver/pupil/util/download/DownloadWorker.kt | 16 ++++++++-------- app/src/main/java/xyz/quaver/pupil/util/proxy.kt | 2 +- build.gradle | 5 ++--- libpupil/build.gradle | 4 ++-- .../src/main/java/xyz/quaver/hiyobi/reader.kt | 2 +- 10 files changed, 33 insertions(+), 34 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bd3755c2..fe92da49 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ apply plugin: 'kotlinx-serialization' if (file("google-services.json").exists() && file("src/debug/google-services.json").exists()) { logger.lifecycle("Firebase Enabled") apply plugin: 'com.google.gms.google-services' - apply plugin: 'io.fabric' + apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.google.firebase.firebase-perf' } else { logger.lifecycle("Firebase Disabled") @@ -50,12 +50,12 @@ android { } dependencies { - def markwonVersion = "3.0.1" + def markwonVersion = '3.1.0' implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7" implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' @@ -66,8 +66,9 @@ dependencies { implementation "com.daimajia.swipelayout:library:1.2.0@aar" implementation 'com.google.android.material:material:1.3.0-alpha01' implementation 'com.google.firebase:firebase-core:17.4.3' + implementation 'com.google.firebase:firebase-analytics:17.4.3' + implementation 'com.google.firebase:firebase-crashlytics:17.1.0' implementation 'com.google.firebase:firebase-perf:19.0.7' - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'com.github.arimorty:floatingsearchview:2.1.1' implementation 'com.github.clans:fab:1.6.4' implementation 'com.github.bumptech.glide:glide:4.11.0' diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt index 04c3aa44..f6b90722 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -25,8 +25,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.RequestManager import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.crashlytics.android.Crashlytics -import io.fabric.sdk.android.Fabric +import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.android.synthetic.main.item_reader.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -105,8 +104,9 @@ class ReaderAdapter(private val glide: RequestManager, glide.clear(holder.view.image) if (progress?.isNaN() == true) { - if (Fabric.isInitialized()) - Crashlytics.logException(DownloadWorker.getInstance(holder.view.context).exception[galleryID]?.get(position)) + FirebaseCrashlytics.getInstance().recordException( + DownloadWorker.getInstance(holder.view.context).exception[galleryID]?.get(position)!! + ) glide .load(R.drawable.image_broken_variant) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 714d4fb2..20e6e9b3 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -18,6 +18,7 @@ package xyz.quaver.pupil.ui +import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.graphics.drawable.Animatable @@ -46,9 +47,8 @@ import com.arlib.floatingsearchview.FloatingSearchView import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion import com.arlib.floatingsearchview.util.view.SearchInputView import com.bumptech.glide.Glide -import com.crashlytics.android.Crashlytics import com.google.android.material.appbar.AppBarLayout -import io.fabric.sdk.android.Fabric +import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main_content.* import kotlinx.coroutines.* @@ -421,6 +421,7 @@ class MainActivity : AppCompatActivity() { loadBlocks() } + @SuppressLint("ClickableViewAccessibility") private fun setupRecyclerView() { with(main_recyclerview) { adapter = GalleryBlockAdapter(Glide.with(this@MainActivity), galleries).apply { @@ -1058,8 +1059,8 @@ class MainActivity : AppCompatActivity() { } } catch (e: Exception) { - if (Fabric.isInitialized() && e.message != "No result") - Crashlytics.logException(e) + if (e.message != "No result") + FirebaseCrashlytics.getInstance().recordException(e) withContext(Dispatchers.Main) { main_noresult.visibility = View.VISIBLE diff --git a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt index 64cb2b5d..61d04c2f 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt @@ -33,9 +33,8 @@ import androidx.recyclerview.widget.RecyclerView import androidx.vectordrawable.graphics.drawable.Animatable2Compat import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import com.bumptech.glide.Glide -import com.crashlytics.android.Crashlytics import com.google.android.material.snackbar.Snackbar -import io.fabric.sdk.android.Fabric +import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.android.synthetic.main.activity_reader.* import kotlinx.android.synthetic.main.activity_reader.view.* import kotlinx.android.synthetic.main.dialog_numberpicker.view.* @@ -91,8 +90,7 @@ class ReaderActivity : AppCompatActivity() { handleIntent(intent) - if (Fabric.isInitialized()) - Crashlytics.setInt("GalleryID", galleryID) + FirebaseCrashlytics.getInstance().setCustomKey("GalleryID", galleryID) if (galleryID == 0) { onBackPressed() diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt index 617d3dd3..be055c1e 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt @@ -24,7 +24,7 @@ import android.util.Base64 import android.util.Log import android.util.SparseArray import androidx.preference.PreferenceManager -import com.crashlytics.android.Crashlytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.coroutines.* import xyz.quaver.Code import xyz.quaver.hitomi.GalleryBlock @@ -187,7 +187,7 @@ class Cache(context: Context) : ContextWrapper(context) { retval = try { source.value.invoke() } catch (e: Exception) { - Crashlytics.logException(e) + FirebaseCrashlytics.getInstance().recordException(e) null } diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt index 5c279c3b..29c23471 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt @@ -29,8 +29,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.app.TaskStackBuilder import androidx.preference.PreferenceManager -import com.crashlytics.android.Crashlytics -import io.fabric.sdk.android.Fabric +import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.coroutines.* import okhttp3.* import okio.* @@ -77,7 +76,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont private var bufferedSource : BufferedSource? = null override fun contentLength() = responseBody.contentLength() - override fun contentType() = responseBody.contentType() ?: null + override fun contentType() = responseBody.contentType() override fun source(): BufferedSource { if (bufferedSource == null) @@ -154,8 +153,9 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont val response = chain.proceed(request) response.newBuilder() - .body(ProgressResponseBody(request.tag(), response.body(), progressListener)) - .build() + .body(response.body()?.let { + ProgressResponseBody(request.tag(), it, progressListener) + }).build() } val client = @@ -289,8 +289,8 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont val callback = object : Callback { override fun onFailure(call: Call, e: IOException) { Log.i("PUPILD", "FAIL ${call.request().tag()} (${e.message})") - if (Fabric.isInitialized() && e.message != "Canceled") - Crashlytics.logException(e) + if (e.message != "Canceled") + FirebaseCrashlytics.getInstance().recordException(e) progress[galleryID]?.set(i, Float.NaN) exception[galleryID]?.set(i, e) @@ -316,7 +316,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont try { response.body().use { - Cache(this@DownloadWorker).putImage(galleryID, i, ext, it.byteStream()) + Cache(this@DownloadWorker).putImage(galleryID, i, ext, it!!.byteStream()) } progress[galleryID]?.set(i, Float.POSITIVE_INFINITY) diff --git a/app/src/main/java/xyz/quaver/pupil/util/proxy.kt b/app/src/main/java/xyz/quaver/pupil/util/proxy.kt index 229c5e90..c471d992 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/proxy.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/proxy.kt @@ -42,7 +42,7 @@ data class ProxyInfo( } fun authenticator() = Authenticator { _, response -> - val credential = Credentials.basic(username, password) + val credential = Credentials.basic(username ?: "", password ?: "") response.request().newBuilder() .header("Proxy-Authorization", credential) diff --git a/build.gradle b/build.gradle index 22a85fe7..5eb988a2 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,6 @@ buildscript { repositories { google() jcenter() - maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'com.android.tools.build:gradle:4.0.0' @@ -15,7 +14,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath 'io.fabric.tools:gradle:1.31.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0' classpath 'com.google.firebase:perf-plugin:1.3.1' } } @@ -25,7 +24,7 @@ allprojects { google() jcenter() maven { url "https://jitpack.io" } - maven { url 'http://guardian.github.com/maven/repo-releases' } + maven { url 'https://guardian.github.com/maven/repo-releases' } } } diff --git a/libpupil/build.gradle b/libpupil/build.gradle index b886c59e..f943ef77 100644 --- a/libpupil/build.gradle +++ b/libpupil/build.gradle @@ -5,9 +5,9 @@ apply plugin: 'kotlinx-serialization' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7' implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" - implementation 'org.jsoup:jsoup:1.12.1' + implementation 'org.jsoup:jsoup:1.13.1' testImplementation 'junit:junit:4.13' } diff --git a/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt index 07babd9d..acf21a2a 100644 --- a/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt +++ b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt @@ -74,7 +74,7 @@ fun getReader(galleryID: Int) : Reader { with(URL(url).openConnection(proxy) as HttpsURLConnection) { setRequestProperty("User-Agent", user_agent) setRequestProperty("Cookie", cookie) - connectTimeout = 2000 + connectTimeout = 1000 connect() inputStream.bufferedReader().use { it.readText() } From 01a01d481d3134c156e4da83e8f28deae7d61b2a Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 13:13:57 +0900 Subject: [PATCH 03/24] Version up --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fe92da49..cccb7ec9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { applicationId "xyz.quaver.pupil" minSdkVersion 16 targetSdkVersion 29 - versionCode 52 - versionName "4.17" + versionCode 53 + versionName "4.18-beta1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables.useSupportLibrary = true From 349da7aa81eae77cbaa0c56a465204857086bb49 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 13:08:03 +0900 Subject: [PATCH 04/24] Pupil-78 Shorten the timout when hiyobi is down --- .../xyz/quaver/pupil/util/download/Cache.kt | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt index be055c1e..f44c7ae8 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt @@ -39,6 +39,7 @@ import java.io.File import java.io.FileOutputStream import java.io.InputStream import java.net.URL +import java.util.* import java.util.concurrent.locks.Lock import java.util.concurrent.locks.ReentrantLock @@ -166,8 +167,8 @@ class Cache(context: Context) : ContextWrapper(context) { val mirrors = preference.getString("mirrors", null)?.split('>') ?: listOf() val sources = mapOf( - Code.HITOMI to { xyz.quaver.hitomi.getReader(galleryID) }, - Code.HIYOBI to { xyz.quaver.hiyobi.getReader(galleryID) } + Code.HITOMI to { Log.i("PUPILD", "READER - HITOMI"); xyz.quaver.hitomi.getReader(galleryID) }, + Code.HIYOBI to { Log.i("PUPILD", "READER - HIYOBI"); xyz.quaver.hiyobi.getReader(galleryID) } ).let { if (mirrors.isNotEmpty()) it.toSortedMap( @@ -180,23 +181,25 @@ class Cache(context: Context) : ContextWrapper(context) { } val reader = if (metadata?.reader == null) { - CoroutineScope(Dispatchers.IO).async { - var retval: Reader? = null + var retval: Reader? = null - for (source in sources) { - retval = try { - source.value.invoke() - } catch (e: Exception) { - FirebaseCrashlytics.getInstance().recordException(e) - null + for (source in sources) { + retval = try { + withContext(Dispatchers.IO) { + withTimeoutOrNull(1000) { + source.value.invoke() + } } - - if (retval != null) - break + } catch (e: Exception) { + FirebaseCrashlytics.getInstance().recordException(e) + null } - retval - }.await() ?: return null + if (retval != null) + break + } + + retval } else metadata.reader From 772e9daf57e77d0430bd12b8c942ee76c2efef25 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 14:04:46 +0900 Subject: [PATCH 05/24] App Link Updated --- app/src/main/AndroidManifest.xml | 134 +++++++++++++++--- .../xyz/quaver/pupil/ui/ReaderActivity.kt | 10 +- .../xyz/quaver/pupil/util/download/Cache.kt | 4 +- 3 files changed, 117 insertions(+), 31 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b61f152c..dab7dfb3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -53,6 +53,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - @@ -97,21 +196,10 @@ - - - - - - - - + android:scheme="https" /> lastPathSegment.replace(nonNumber, "").toInt() - "히요비.asia" -> lastPathSegment.toInt() - "xn--9w3b15m8vo.asia" -> lastPathSegment.toInt() + "hitomi.la" -> + Regex("([0-9]+).html").find(lastPathSegment)?.groupValues?.get(1)?.toIntOrNull() ?: 0 + "hiyobi.me" -> lastPathSegment.toInt() "e-hentai.org" -> uri.pathSegments[1].toInt() - else -> return + else -> 0 } } } else { diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt index f44c7ae8..c1e53abd 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt @@ -167,8 +167,8 @@ class Cache(context: Context) : ContextWrapper(context) { val mirrors = preference.getString("mirrors", null)?.split('>') ?: listOf() val sources = mapOf( - Code.HITOMI to { Log.i("PUPILD", "READER - HITOMI"); xyz.quaver.hitomi.getReader(galleryID) }, - Code.HIYOBI to { Log.i("PUPILD", "READER - HIYOBI"); xyz.quaver.hiyobi.getReader(galleryID) } + Code.HITOMI to { xyz.quaver.hitomi.getReader(galleryID) }, + Code.HIYOBI to { xyz.quaver.hiyobi.getReader(galleryID) } ).let { if (mirrors.isNotEmpty()) it.toSortedMap( From 51a9bf2570f8908f68ca57a78d8ce089d12ad116 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 14:30:20 +0900 Subject: [PATCH 06/24] Pupil-76 Add Page count --- .../quaver/pupil/adapters/GalleryBlockAdapter.kt | 11 +++++++++++ app/src/main/res/layout/item_galleryblock.xml | 13 ++++++++++++- app/src/main/res/values/strings.xml | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt index 618bbe72..1cdf9301 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -42,7 +42,9 @@ import kotlinx.android.synthetic.main.item_galleryblock.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import xyz.quaver.hitomi.GalleryBlock +import xyz.quaver.hitomi.getReader import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R @@ -237,6 +239,15 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri } galleryblock_id.text = galleryBlock.id.toString() + galleryblock_pagecount.text = "-" + CoroutineScope(Dispatchers.IO).launch { + val pageCount = kotlin.runCatching { + getReader(galleryBlock.id).galleryInfo.files.size + }.getOrNull() ?: return@launch + withContext(Dispatchers.Main) { + galleryblock_pagecount.text = context.getString(R.string.galleryblock_pagecount, pageCount) + } + } if (!::favorites.isInitialized) favorites = (context.applicationContext as Pupil).favorites diff --git a/app/src/main/res/layout/item_galleryblock.xml b/app/src/main/res/layout/item_galleryblock.xml index bef8a183..5ba0e685 100644 --- a/app/src/main/res/layout/item_galleryblock.xml +++ b/app/src/main/res/layout/item_galleryblock.xml @@ -197,7 +197,8 @@ android:paddingLeft="8dp" android:paddingRight="8dp" android:paddingBottom="8dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:gravity="center_vertical"> + + + + Series: %1$s Type: %1$s Language: %1$s + %dP From 5bc4610061e5fc610bdf1d897e87a0647e947fd1 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 15:28:01 +0900 Subject: [PATCH 07/24] Pupil-84 Title doesn't show up when using hiyobi --- libpupil/src/main/java/xyz/quaver/Utils.kt | 2 +- .../java/xyz/quaver/hiyobi/galleryblock.kt | 45 ++++++++++++++----- .../src/main/java/xyz/quaver/hiyobi/reader.kt | 19 +++++--- .../test/java/xyz/quaver/hitomi/UnitTest.kt | 2 +- 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/libpupil/src/main/java/xyz/quaver/Utils.kt b/libpupil/src/main/java/xyz/quaver/Utils.kt index c598f697..86fd5b9e 100644 --- a/libpupil/src/main/java/xyz/quaver/Utils.kt +++ b/libpupil/src/main/java/xyz/quaver/Utils.kt @@ -20,7 +20,7 @@ import kotlinx.serialization.UnstableDefault import kotlinx.serialization.json.Json import java.net.Proxy -var proxy = Proxy.NO_PROXY +var proxy : Proxy = Proxy.NO_PROXY @OptIn(UnstableDefault::class) var json = Json { diff --git a/libpupil/src/main/java/xyz/quaver/hiyobi/galleryblock.kt b/libpupil/src/main/java/xyz/quaver/hiyobi/galleryblock.kt index 6b324ce9..72e4cf48 100644 --- a/libpupil/src/main/java/xyz/quaver/hiyobi/galleryblock.kt +++ b/libpupil/src/main/java/xyz/quaver/hiyobi/galleryblock.kt @@ -16,31 +16,54 @@ package xyz.quaver.hiyobi -import org.jsoup.Jsoup +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.intOrNull import xyz.quaver.Code import xyz.quaver.hitomi.GalleryBlock import xyz.quaver.hitomi.protocol +import xyz.quaver.json import xyz.quaver.proxy +import java.net.URL +import javax.net.ssl.HttpsURLConnection fun getGalleryBlock(galleryID: Int) : GalleryBlock? { - val url = "$protocol//$hiyobi/info/$galleryID" + val url = "$protocol//api.$hiyobi/gallery/$galleryID" - val doc = Jsoup.connect(url).proxy(proxy).get() + val galleryBlock = with (URL(url).openConnection(proxy) as HttpsURLConnection) { + setRequestProperty("User-Agent", user_agent) + setRequestProperty("Cookie", cookie) + connectTimeout = 1000 + connect() - val galleryBlock = doc.selectFirst(".gallery-content") + inputStream.bufferedReader().use { it.readText() } + }.let { + json.parseJson(it).jsonObject + } - val galleryUrl = galleryBlock.selectFirst("a").attr("href") + val galleryUrl = "reader/$galleryID" - val thumbnails = listOf(galleryBlock.selectFirst("img").attr("abs:src")) + val thumbnails = listOf("$protocol//cdn.$hiyobi/tn/$galleryID.jpg") - val title = galleryBlock.selectFirst("b").text() - val artists = galleryBlock.select("tr:matches(작가) a[href~=artist]").map { it.text() } - val series = galleryBlock.select("tr:matches(원작) a").map { it.attr("href").substringAfter("series:").replace('_', ' ') } - val type = galleryBlock.selectFirst("tr:matches(종류) a").attr("href").substringAfter("type:").replace('_', ' ') + val title = galleryBlock["title"]?.contentOrNull ?: "" + val artists = galleryBlock["artists"]?.jsonArray?.mapNotNull { + it.jsonObject["value"]?.contentOrNull + } ?: listOf() + val series = galleryBlock["parodys"]?.jsonArray?.mapNotNull { + it.jsonObject["value"]?.contentOrNull + } ?: listOf() + val type = when (galleryBlock["type"]?.intOrNull) { + 1 -> "doujinshi" + 2 -> "manga" + 3 -> "artistcg" + 4 -> "gamecg" + else -> "" + } val language = "korean" - val relatedTags = galleryBlock.select("tr:matches(태그) a").map { it.attr("href").substringAfterLast('/').replace('_', ' ') } + val relatedTags = galleryBlock["tags"]?.jsonArray?.mapNotNull { + it.jsonObject["value"]?.contentOrNull + } ?: listOf() return GalleryBlock(Code.HIYOBI, galleryID, galleryUrl, thumbnails, title, artists, series, type, language, relatedTags) } \ No newline at end of file diff --git a/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt index acf21a2a..5ed65661 100644 --- a/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt +++ b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt @@ -18,7 +18,7 @@ package xyz.quaver.hiyobi import kotlinx.serialization.UnstableDefault import kotlinx.serialization.builtins.list -import org.jsoup.Jsoup +import kotlinx.serialization.json.contentOrNull import xyz.quaver.Code import xyz.quaver.hitomi.GalleryFiles import xyz.quaver.hitomi.GalleryInfo @@ -64,14 +64,23 @@ fun renewCookie() : String { @OptIn(UnstableDefault::class) fun getReader(galleryID: Int) : Reader { - val reader = "https://$hiyobi/reader/$galleryID" - val url = "https://cdn.hiyobi.me/data/json/${galleryID}_list.json" + val data = "https://cdn.$hiyobi/data/json/$galleryID.json" + val list = "https://cdn.$hiyobi/data/json/${galleryID}_list.json" - val title = Jsoup.connect(reader).proxy(proxy).get().title() + val title = with(URL(data).openConnection(proxy) as HttpsURLConnection) { + setRequestProperty("User-Agent", user_agent) + setRequestProperty("Cookie", cookie) + connectTimeout = 1000 + connect() + + inputStream.bufferedReader().use { it.readText() } + }.let { + json.parseJson(it).jsonObject["n"]?.contentOrNull + } val galleryFiles = json.parse( GalleryFiles.serializer().list, - with(URL(url).openConnection(proxy) as HttpsURLConnection) { + with(URL(list).openConnection(proxy) as HttpsURLConnection) { setRequestProperty("User-Agent", user_agent) setRequestProperty("Cookie", cookie) connectTimeout = 1000 diff --git a/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt b/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt index 40b99b3c..b818b7fb 100644 --- a/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt +++ b/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt @@ -82,7 +82,7 @@ class UnitTest { @Test fun test_hiyobi() { - val reader = xyz.quaver.hiyobi.getReader(1663418) + val reader = xyz.quaver.hiyobi.getReader(1664762) print(reader) } From 293ca5b31dafa2dd684557ca46886e5e271564c4 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 22:48:47 +0900 Subject: [PATCH 08/24] Added PIN Lock --- app/build.gradle | 3 +- app/libs/pinlockview-release.aar | Bin 0 -> 40695 bytes .../java/xyz/quaver/pupil/ui/LockActivity.kt | 203 ++++++++++++++---- .../quaver/pupil/ui/fragment/LockFragment.kt | 52 ++++- .../pupil/ui/fragment/PINLockFragment.kt | 53 +++++ .../pupil/ui/fragment/SettingsFragment.kt | 60 +++--- app/src/main/res/anim/shake.xml | 24 +++ app/src/main/res/anim/shake_cycle.xml | 21 ++ app/src/main/res/color/lock_fab.xml | 23 ++ .../main/res/drawable/backspace_outline.xml | 8 + app/src/main/res/drawable/fingerprint.xml | 2 +- app/src/main/res/drawable/lastpass.xml | 2 +- app/src/main/res/drawable/lock_pattern.xml | 2 +- app/src/main/res/drawable/pin_filled.xml | 23 ++ app/src/main/res/layout/activity_lock.xml | 13 +- app/src/main/res/layout/fragment_pin_lock.xml | 42 ++++ 16 files changed, 441 insertions(+), 90 deletions(-) create mode 100644 app/libs/pinlockview-release.aar create mode 100644 app/src/main/java/xyz/quaver/pupil/ui/fragment/PINLockFragment.kt create mode 100644 app/src/main/res/anim/shake.xml create mode 100644 app/src/main/res/anim/shake_cycle.xml create mode 100644 app/src/main/res/color/lock_fab.xml create mode 100644 app/src/main/res/drawable/backspace_outline.xml create mode 100644 app/src/main/res/drawable/pin_filled.xml create mode 100644 app/src/main/res/layout/fragment_pin_lock.xml diff --git a/app/build.gradle b/app/build.gradle index cccb7ec9..c7f6a513 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -52,7 +52,7 @@ android { dependencies { def markwonVersion = '3.1.0' - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7" @@ -80,6 +80,7 @@ dependencies { implementation 'net.rdrei.android.dirchooser:library:3.2@aar' implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.andrognito.patternlockview:patternlockview:1.0.0' + //implementation 'com.andrognito.pinlockview:pinlockview:2.1.0' implementation "ru.noties.markwon:core:${markwonVersion}" testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.1' diff --git a/app/libs/pinlockview-release.aar b/app/libs/pinlockview-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..646f97a4b542c0f71566dc1fb62decb9c541937e GIT binary patch literal 40695 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 { + val result = lockManager.check(it) + + if (result == true) { + setResult(Activity.RESULT_OK) + finish() + } else + lock_pattern_view.setViewMode(PatternLockView.PatternViewMode.WRONG) + } + "add_lock" -> { + if (lastPass.isEmpty()) { + lastPass = it + + Snackbar.make(view!!, R.string.settings_lock_confirm, Snackbar.LENGTH_LONG).show() + } else { + if (lastPass == it) { + LockManager(context!!).add(Lock.generate(Lock.Type.PATTERN, it)) + finish() + } else { + lock_pattern_view.setViewMode(PatternLockView.PatternViewMode.WRONG) + lastPass = "" + + Snackbar.make(view!!, R.string.settings_lock_wrong_confirm, Snackbar.LENGTH_LONG).show() + } + } + } + } + } + } + + private val pinLockFragment = PINLockFragment().apply { + var lastPass = "" + onPINEntered = { + when(mode) { + null -> { + val result = lockManager.check(it) + + if (result == true) { + setResult(Activity.RESULT_OK) + finish() + } else { + indicator_dots.startAnimation(AnimationUtils.loadAnimation(context, R.anim.shake).apply { + setAnimationListener(object: Animation.AnimationListener { + override fun onAnimationEnd(animation: Animation?) { + pin_lock_view.resetPinLockView() + pin_lock_view.isEnabled = true + } + + override fun onAnimationStart(animation: Animation?) { + pin_lock_view.isEnabled = false + } + + override fun onAnimationRepeat(animation: Animation?) { + // Do Nothing + } + }) + }) + } + } + "add_lock" -> { + if (lastPass.isEmpty()) { + lastPass = it + + pin_lock_view.resetPinLockView() + Snackbar.make(view!!, R.string.settings_lock_confirm, Snackbar.LENGTH_LONG).show() + } else { + if (lastPass == it) { + LockManager(context!!).add(Lock.generate(Lock.Type.PIN, it)) + finish() + } else { + indicator_dots.startAnimation(AnimationUtils.loadAnimation(context, R.anim.shake).apply { + setAnimationListener(object: Animation.AnimationListener { + override fun onAnimationEnd(animation: Animation?) { + pin_lock_view.resetPinLockView() + pin_lock_view.isEnabled = true + } + + override fun onAnimationStart(animation: Animation?) { + pin_lock_view.isEnabled = false + } + + override fun onAnimationRepeat(animation: Animation?) { + // Do Nothing + } + }) + }) + lastPass = "" + + Snackbar.make(view!!, R.string.settings_lock_wrong_confirm, Snackbar.LENGTH_LONG).show() + } + } + } + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_lock) - val lockManager = try { + lockManager = try { LockManager(this) } catch (e: Exception) { AlertDialog.Builder(this).apply { @@ -50,12 +157,7 @@ class LockActivity : AppCompatActivity() { return } - val mode = intent.getStringExtra("mode") - - lock_pattern.isEnabled = false - lock_pin.isEnabled = false - lock_fingerprint.isEnabled = false - lock_password.isEnabled = false + mode = intent.getStringExtra("mode") when(mode) { null -> { @@ -64,52 +166,63 @@ class LockActivity : AppCompatActivity() { finish() return } + + lock_pattern.apply { + isEnabled = lockManager.contains(Lock.Type.PATTERN) + setOnClickListener { + supportFragmentManager.beginTransaction().replace( + R.id.lock_content, patternLockFragment + ).commit() + } + } + lock_pin.apply { + isEnabled = lockManager.contains(Lock.Type.PIN) + setOnClickListener { + supportFragmentManager.beginTransaction().replace( + R.id.lock_content, pinLockFragment + ).commit() + } + } + lock_fingerprint.isEnabled = false + lock_password.isEnabled = false + + when (lockManager.locks!!.first().type) { + Lock.Type.PIN -> { + + supportFragmentManager.beginTransaction().add( + R.id.lock_content, pinLockFragment + ).commit() + } + Lock.Type.PATTERN -> { + supportFragmentManager.beginTransaction().add( + R.id.lock_content, patternLockFragment + ).commit() + } + else -> return + } } "add_lock" -> { + lock_pattern.isEnabled = false + lock_pin.isEnabled = false + lock_fingerprint.isEnabled = false + lock_password.isEnabled = false + when(intent.getStringExtra("type")!!) { "pattern" -> { - + lock_pattern.isEnabled = true + supportFragmentManager.beginTransaction().add( + R.id.lock_content, patternLockFragment + ).commit() + } + "pin" -> { + lock_pin.isEnabled = true + supportFragmentManager.beginTransaction().add( + R.id.lock_content, pinLockFragment + ).commit() } } } } - - supportFragmentManager.beginTransaction().add( - R.id.lock_content, - PatternLockFragment().apply { - var lastPass = "" - onPatternDrawn = { - when(mode) { - null -> { - val result = lockManager.check(it) - - if (result == true) { - setResult(Activity.RESULT_OK) - finish() - } else - lock_pattern_view.setViewMode(PatternLockView.PatternViewMode.WRONG) - } - "add_lock" -> { - if (lastPass.isEmpty()) { - lastPass = it - - Snackbar.make(view!!, R.string.settings_lock_confirm, Snackbar.LENGTH_LONG).show() - } else { - if (lastPass == it) { - LockManager(context!!).add(Lock.generate(Lock.Type.PATTERN, it)) - finish() - } else { - lock_pattern_view.setViewMode(PatternLockView.PatternViewMode.WRONG) - lastPass = "" - - Snackbar.make(view!!, R.string.settings_lock_wrong_confirm, Snackbar.LENGTH_LONG).show() - } - } - } - } - } - } - ).commit() } } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt index b95900c1..022fe5ae 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt @@ -28,18 +28,25 @@ import xyz.quaver.pupil.ui.LockActivity import xyz.quaver.pupil.util.Lock import xyz.quaver.pupil.util.LockManager -class LockFragment : PreferenceFragmentCompat() { +class LockFragment : + PreferenceFragmentCompat() { override fun onResume() { super.onResume() - val lockManager = LockManager(context!!) + val lockManager = LockManager(requireContext()) findPreference("lock_pattern")?.summary = if (lockManager.contains(Lock.Type.PATTERN)) getString(R.string.settings_lock_enabled) else "" + + findPreference("lock_pin")?.summary = + if (lockManager.contains(Lock.Type.PIN)) + getString(R.string.settings_lock_enabled) + else + "" } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -48,14 +55,14 @@ class LockFragment : PreferenceFragmentCompat() { with(findPreference("lock_pattern")) { this!! - if (LockManager(context!!).contains(Lock.Type.PATTERN)) + if (LockManager(requireContext()).contains(Lock.Type.PATTERN)) summary = getString(R.string.settings_lock_enabled) onPreferenceClickListener = Preference.OnPreferenceClickListener { - val lockManager = LockManager(context!!) + val lockManager = LockManager(requireContext()) if (lockManager.contains(Lock.Type.PATTERN)) { - AlertDialog.Builder(context).apply { + AlertDialog.Builder(requireContext()).apply { setTitle(R.string.warning) setMessage(R.string.settings_lock_remove_message) @@ -66,7 +73,7 @@ class LockFragment : PreferenceFragmentCompat() { setNegativeButton(android.R.string.no) { _, _ -> } }.show() } else { - val intent = Intent(context, LockActivity::class.java).apply { + val intent = Intent(requireContext(), LockActivity::class.java).apply { putExtra("mode", "add_lock") putExtra("type", "pattern") } @@ -77,5 +84,38 @@ class LockFragment : PreferenceFragmentCompat() { true } } + + with(findPreference("lock_pin")) { + this!! + + if (LockManager(requireContext()).contains(Lock.Type.PIN)) + summary = getString(R.string.settings_lock_enabled) + + onPreferenceClickListener = Preference.OnPreferenceClickListener { + val lockManager = LockManager(requireContext()) + + if (lockManager.contains(Lock.Type.PIN)) { + AlertDialog.Builder(requireContext()).apply { + setTitle(R.string.warning) + setMessage(R.string.settings_lock_remove_message) + + setPositiveButton(android.R.string.yes) { _, _ -> + lockManager.remove(Lock.Type.PIN) + onResume() + } + setNegativeButton(android.R.string.no) { _, _ -> } + }.show() + } else { + val intent = Intent(requireContext(), LockActivity::class.java).apply { + putExtra("mode", "add_lock") + putExtra("type", "pin") + } + + startActivity(intent) + } + + true + } + } } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/PINLockFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/PINLockFragment.kt new file mode 100644 index 00000000..b058840d --- /dev/null +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/PINLockFragment.kt @@ -0,0 +1,53 @@ +/* + * Pupil, Hitomi.la viewer for Android + * Copyright (C) 2020 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.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.andrognito.pinlockview.PinLockListener +import kotlinx.android.synthetic.main.fragment_pin_lock.view.* +import xyz.quaver.pupil.R + +class PINLockFragment : Fragment(), PinLockListener { + + var onPINEntered: ((String) -> Unit)? = null + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_pin_lock, container, false).apply { + pin_lock_view.attachIndicatorDots(indicator_dots) + pin_lock_view.setPinLockListener(this@PINLockFragment) + } + } + + override fun onComplete(pin: String?) { + onPINEntered?.invoke(pin!!) + } + + override fun onEmpty() { + + } + + override fun onPinChange(pinLength: Int, intermediatePin: String?) { + + } + +} \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt index 7f6b8004..a3dec70e 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt @@ -56,13 +56,13 @@ class SettingsFragment : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this) + PreferenceManager.getDefaultSharedPreferences(requireContext()).registerOnSharedPreferenceChangeListener(this) } override fun onResume() { super.onResume() - val lockManager = LockManager(context!!) + val lockManager = LockManager(requireContext()) findPreference("app_lock")?.summary = if (lockManager.locks.isNullOrEmpty()) { getString(R.string.settings_lock_none) @@ -92,9 +92,9 @@ class SettingsFragment : checkUpdate(activity as SettingsActivity, true) } "delete_cache" -> { - val dir = File(context.cacheDir, "imageCache") + val dir = File(requireContext().cacheDir, "imageCache") - AlertDialog.Builder(context).apply { + AlertDialog.Builder(requireContext()).apply { setTitle(R.string.warning) setMessage(R.string.settings_clear_cache_alert_message) setPositiveButton(android.R.string.yes) { _, _ -> @@ -107,9 +107,9 @@ class SettingsFragment : }.show() } "delete_downloads" -> { - val dir = getDownloadDirectory(context) + val dir = getDownloadDirectory(requireContext()) - AlertDialog.Builder(context).apply { + AlertDialog.Builder(requireContext()).apply { setTitle(R.string.warning) setMessage(R.string.settings_clear_downloads_alert_message) setPositiveButton(android.R.string.yes) { _, _ -> @@ -122,9 +122,9 @@ class SettingsFragment : }.show() } "clear_history" -> { - val histories = (context.applicationContext as Pupil).histories + val histories = (requireContext().applicationContext as Pupil).histories - AlertDialog.Builder(context).apply { + AlertDialog.Builder(requireContext()).apply { setTitle(R.string.warning) setMessage(R.string.settings_clear_history_alert_message) setPositiveButton(android.R.string.yes) { _, _ -> @@ -135,10 +135,10 @@ class SettingsFragment : }.show() } "dl_location" -> { - DownloadLocationDialog(activity!!).show() + DownloadLocationDialog(requireActivity()).show() } "default_query" -> { - DefaultQueryDialog(context).apply { + DefaultQueryDialog(requireContext()).apply { onPositiveButtonClickListener = { newTags -> sharedPreferences.edit().putString("default_query", newTags.toString()).apply() summary = newTags.toString() @@ -146,20 +146,20 @@ class SettingsFragment : }.show() } "app_lock" -> { - val intent = Intent(context, LockActivity::class.java) + val intent = Intent(requireContext(), LockActivity::class.java) activity?.startActivityForResult(intent, REQUEST_LOCK) } "mirrors" -> { - MirrorDialog(context) + MirrorDialog(requireContext()) .show() } "proxy" -> { - ProxyDialog(context) + ProxyDialog(requireContext()) .show() } "backup" -> { - File(ContextCompat.getDataDir(context), "favorites.json").copyTo( - File(getDownloadDirectory(context), "favorites.json"), + File(ContextCompat.getDataDir(requireContext()), "favorites.json").copyTo( + File(getDownloadDirectory(requireContext()), "favorites.json"), true ) @@ -177,8 +177,8 @@ class SettingsFragment : "old_import_galleries" -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_WRITE_PERMISSION_AND_SAF) + if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) + ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_WRITE_PERMISSION_AND_SAF) else { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { putExtra("android.content.extra.SHOW_ADVANCED", true) @@ -192,7 +192,7 @@ class SettingsFragment : .allowNewDirectoryNameModification(true) .build() - val intent = Intent(context, DirectoryChooserActivity::class.java).apply { + val intent = Intent(requireContext(), DirectoryChooserActivity::class.java).apply { putExtra(DirectoryChooserActivity.EXTRA_CONFIG, config) } @@ -232,10 +232,10 @@ class SettingsFragment : when (key) { "proxy" -> { - summary = getProxyInfo(context).type.name + summary = getProxyInfo(requireContext()).type.name } "dl_location" -> { - summary = getDownloadDirectory(context!!).canonicalPath + summary = getDownloadDirectory(requireContext()).canonicalPath } } } @@ -260,42 +260,42 @@ class SettingsFragment : when (key) { "app_version" -> { - val manager = context.packageManager - val info = manager.getPackageInfo(context.packageName, 0) - summary = context.getString(R.string.settings_app_version_description, info.versionName) + val manager = requireContext().packageManager + val info = manager.getPackageInfo(requireContext().packageName, 0) + summary = requireContext().getString(R.string.settings_app_version_description, info.versionName) onPreferenceClickListener = this@SettingsFragment } "delete_cache" -> { - val dir = File(context.cacheDir, "imageCache") + val dir = File(requireContext().cacheDir, "imageCache") summary = getDirSize(dir) onPreferenceClickListener = this@SettingsFragment } "delete_downloads" -> { - val dir = getDownloadDirectory(context) + val dir = getDownloadDirectory(requireContext()) summary = getDirSize(dir) onPreferenceClickListener = this@SettingsFragment } "clear_history" -> { - val histories = (activity!!.application as Pupil).histories + val histories = (requireActivity().application as Pupil).histories summary = getString(R.string.settings_clear_history_summary, histories.size) onPreferenceClickListener = this@SettingsFragment } "dl_location" -> { - summary = getDownloadDirectory(context).canonicalPath + summary = getDownloadDirectory(requireContext()).canonicalPath onPreferenceClickListener = this@SettingsFragment } "default_query" -> { - summary = PreferenceManager.getDefaultSharedPreferences(context).getString("default_query", "") ?: "" + summary = PreferenceManager.getDefaultSharedPreferences(requireContext()).getString("default_query", "") ?: "" onPreferenceClickListener = this@SettingsFragment } "app_lock" -> { - val lockManager = LockManager(context) + val lockManager = LockManager(requireContext()) summary = if (lockManager.locks.isNullOrEmpty()) { getString(R.string.settings_lock_none) @@ -315,7 +315,7 @@ class SettingsFragment : onPreferenceClickListener = this@SettingsFragment } "proxy" -> { - summary = getProxyInfo(context).type.name + summary = getProxyInfo(requireContext()).type.name onPreferenceClickListener = this@SettingsFragment } diff --git a/app/src/main/res/anim/shake.xml b/app/src/main/res/anim/shake.xml new file mode 100644 index 00000000..323768dd --- /dev/null +++ b/app/src/main/res/anim/shake.xml @@ -0,0 +1,24 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/shake_cycle.xml b/app/src/main/res/anim/shake_cycle.xml new file mode 100644 index 00000000..13dcab54 --- /dev/null +++ b/app/src/main/res/anim/shake_cycle.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/color/lock_fab.xml b/app/src/main/res/color/lock_fab.xml new file mode 100644 index 00000000..197313e3 --- /dev/null +++ b/app/src/main/res/color/lock_fab.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/backspace_outline.xml b/app/src/main/res/drawable/backspace_outline.xml new file mode 100644 index 00000000..201e2e9b --- /dev/null +++ b/app/src/main/res/drawable/backspace_outline.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fingerprint.xml b/app/src/main/res/drawable/fingerprint.xml index ffa8a34b..bfc10e9f 100644 --- a/app/src/main/res/drawable/fingerprint.xml +++ b/app/src/main/res/drawable/fingerprint.xml @@ -4,5 +4,5 @@ android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/lastpass.xml b/app/src/main/res/drawable/lastpass.xml index 9dbf638b..40265510 100644 --- a/app/src/main/res/drawable/lastpass.xml +++ b/app/src/main/res/drawable/lastpass.xml @@ -4,5 +4,5 @@ android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/lock_pattern.xml b/app/src/main/res/drawable/lock_pattern.xml index f1be51c2..f88355fb 100644 --- a/app/src/main/res/drawable/lock_pattern.xml +++ b/app/src/main/res/drawable/lock_pattern.xml @@ -4,5 +4,5 @@ android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/pin_filled.xml b/app/src/main/res/drawable/pin_filled.xml new file mode 100644 index 00000000..98fe185c --- /dev/null +++ b/app/src/main/res/drawable/pin_filled.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_lock.xml b/app/src/main/res/layout/activity_lock.xml index 00cd2898..db5b51be 100644 --- a/app/src/main/res/layout/activity_lock.xml +++ b/app/src/main/res/layout/activity_lock.xml @@ -36,7 +36,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:layout_marginBottom="32dp" android:gravity="center" app:layout_constraintTop_toBottomOf="@id/lock_content" app:layout_constraintBottom_toTopOf="@id/lock_button_layout"> @@ -46,9 +45,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/fingerprint" + app:backgroundTint="@color/lock_fab" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" - app:backgroundTint="@color/dark_gray" + app:tint="@null" app:fabSize="mini"/> @@ -67,26 +67,29 @@ android:id="@+id/lock_pattern" android:layout_width="wrap_content" android:layout_height="wrap_content" + app:tint="@null" app:srcCompat="@drawable/lock_pattern" - app:backgroundTint="@color/colorPrimary" + app:backgroundTint="@color/lock_fab" app:fabSize="mini"/> diff --git a/app/src/main/res/layout/fragment_pin_lock.xml b/app/src/main/res/layout/fragment_pin_lock.xml new file mode 100644 index 00000000..7099e499 --- /dev/null +++ b/app/src/main/res/layout/fragment_pin_lock.xml @@ -0,0 +1,42 @@ + + + + + + + + + + \ No newline at end of file From 567eec8bc5f6c05445a6ef73fdedf87816de4cde Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 23:23:07 +0900 Subject: [PATCH 09/24] Added Fingerprint Lock --- .../java/xyz/quaver/pupil/ui/LockActivity.kt | 41 ++++++++++++++++++- .../xyz/quaver/pupil/ui/SettingsActivity.kt | 4 +- ...ockFragment.kt => LockSettingsFragment.kt} | 22 +++++++++- app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/lock_preferences.xml | 2 +- 7 files changed, 67 insertions(+), 5 deletions(-) rename app/src/main/java/xyz/quaver/pupil/ui/fragment/{LockFragment.kt => LockSettingsFragment.kt} (86%) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt index 990ae08f..010397d9 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt @@ -24,6 +24,10 @@ import android.os.Bundle import android.view.animation.Animation import android.view.animation.AnimationUtils import androidx.appcompat.app.AppCompatActivity +import androidx.biometric.BiometricManager +import androidx.biometric.BiometricPrompt +import androidx.core.content.ContextCompat +import androidx.preference.PreferenceManager import com.andrognito.patternlockview.PatternLockView import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.activity_lock.* @@ -140,6 +144,29 @@ class LockActivity : AppCompatActivity() { } } + private fun showBiometricPrompt() { + val promptInfo = BiometricPrompt.PromptInfo.Builder() + .setTitle("Biometric login for my app") + .setSubtitle("Log in using your biometric credential") + .setNegativeButtonText("Cancel") + .setConfirmationRequired(false) + .build() + + val biometricPrompt = BiometricPrompt(this, ContextCompat.getMainExecutor(this), + object : BiometricPrompt.AuthenticationCallback() { + override fun onAuthenticationSucceeded( + result: BiometricPrompt.AuthenticationResult) { + super.onAuthenticationSucceeded(result) + setResult(RESULT_OK) + finish() + return + } + }) + + // Displays the "log in" prompt. + biometricPrompt.authenticate(promptInfo) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_lock) @@ -167,6 +194,19 @@ class LockActivity : AppCompatActivity() { return } + if ( + PreferenceManager.getDefaultSharedPreferences(this).getBoolean("lock_fingerprint", false) + && BiometricManager.from(this).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS + ) { + lock_fingerprint.apply { + isEnabled = true + setOnClickListener { + showBiometricPrompt() + } + } + showBiometricPrompt() + } + lock_pattern.apply { isEnabled = lockManager.contains(Lock.Type.PATTERN) setOnClickListener { @@ -183,7 +223,6 @@ class LockActivity : AppCompatActivity() { ).commit() } } - lock_fingerprint.isEnabled = false lock_password.isEnabled = false when (lockManager.locks!!.first().type) { diff --git a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt index 20621e38..7bc79d66 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt @@ -35,7 +35,7 @@ import kotlinx.serialization.builtins.serializer import net.rdrei.android.dirchooser.DirectoryChooserActivity import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R -import xyz.quaver.pupil.ui.fragment.LockFragment +import xyz.quaver.pupil.ui.fragment.LockSettingsFragment import xyz.quaver.pupil.ui.fragment.SettingsFragment import xyz.quaver.pupil.util.* import java.io.File @@ -84,7 +84,7 @@ class SettingsActivity : AppCompatActivity() { if (resultCode == Activity.RESULT_OK) { supportFragmentManager .beginTransaction() - .replace(R.id.settings, LockFragment()) + .replace(R.id.settings, LockSettingsFragment()) .addToBackStack("Lock") .commitAllowingStateLoss() } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt similarity index 86% rename from app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt rename to app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt index 022fe5ae..4b0c8f26 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt @@ -20,15 +20,17 @@ package xyz.quaver.pupil.ui.fragment import android.content.Intent import android.os.Bundle +import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat import xyz.quaver.pupil.R import xyz.quaver.pupil.ui.LockActivity import xyz.quaver.pupil.util.Lock import xyz.quaver.pupil.util.LockManager -class LockFragment : +class LockSettingsFragment : PreferenceFragmentCompat() { override fun onResume() { @@ -117,5 +119,23 @@ class LockFragment : true } } + + with(findPreference("lock_fingerprint")) { + this!! + + setOnPreferenceChangeListener { _, newValue -> + this as SwitchPreferenceCompat + + if (newValue == true && LockManager(requireContext()).isEmpty()) { + isChecked = false + + Toast.makeText(requireContext(), R.string.settings_lock_fingerprint_without_lock, Toast.LENGTH_SHORT).show() + } + + isChecked = newValue as Boolean + + false + } + } } } \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 710540e2..ed2e442e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -141,4 +141,5 @@ 旧ギャラリーインポート中… インポート完了 ランダムギャラリーを開く + 予備のロックが設定されていないと指紋ロックは使用できません \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 598da2cc..e5a50e62 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -141,4 +141,5 @@ 이전 버전 갤러리 가져오는 중… 가져오기 완료 무작위 갤러리 열기 + 지문 잠금은 다른 잠금 방식이 활성화 되어 있을 때만 사용 가능합니다 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e43da536..cb068cf7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -188,6 +188,7 @@ Password Biometrics Fingerprint + Fingerprint can be only enabled if one of the other locks are enabled Enabled Input same lock once more to confirm Lock Do you want to remove lock? diff --git a/app/src/main/res/xml/lock_preferences.xml b/app/src/main/res/xml/lock_preferences.xml index 3c3baab3..f17e5c01 100644 --- a/app/src/main/res/xml/lock_preferences.xml +++ b/app/src/main/res/xml/lock_preferences.xml @@ -17,7 +17,7 @@ - From 2b553d1116b633e2358f90dc47d952b927ead390 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 23:32:38 +0900 Subject: [PATCH 10/24] Changed Title/Subtitle --- app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt | 4 ++-- app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt index 010397d9..5c11e63d 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt @@ -146,8 +146,8 @@ class LockActivity : AppCompatActivity() { private fun showBiometricPrompt() { val promptInfo = BiometricPrompt.PromptInfo.Builder() - .setTitle("Biometric login for my app") - .setSubtitle("Log in using your biometric credential") + .setTitle(getText(R.string.settings_lock_fingerprint_prompt)) + .setSubtitle(getText(R.string.settings_lock_fingerprint_prompt_subtitle)) .setNegativeButtonText("Cancel") .setConfirmationRequired(false) .build() diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ed2e442e..ee6ea54d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -142,4 +142,6 @@ インポート完了 ランダムギャラリーを開く 予備のロックが設定されていないと指紋ロックは使用できません + Pupil指紋ロック™ + こうかはばつぐんだ! \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index e5a50e62..9c6fe9ab 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -142,4 +142,6 @@ 가져오기 완료 무작위 갤러리 열기 지문 잠금은 다른 잠금 방식이 활성화 되어 있을 때만 사용 가능합니다 + Pupil 지문 인식™ + 힘세고 강한 지문 인식 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cb068cf7..874a083c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -189,6 +189,7 @@ Biometrics Fingerprint Fingerprint can be only enabled if one of the other locks are enabled + Pupil Fingerprint Lock™ Enabled Input same lock once more to confirm Lock Do you want to remove lock? @@ -217,5 +218,6 @@ Importing old galleries… %1$d/%2$d Importing completed + Ah Shit, Here we go again From 0b1c9b097ccd0cdb7ff07fcdeb58d973748fc135 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 11:24:30 +0900 Subject: [PATCH 11/24] Disable fingerprint when all the locks are disabled --- .../quaver/pupil/ui/fragment/LockSettingsFragment.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt index 4b0c8f26..c4a76ee0 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt @@ -24,6 +24,7 @@ import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceManager import androidx.preference.SwitchPreferenceCompat import xyz.quaver.pupil.R import xyz.quaver.pupil.ui.LockActivity @@ -49,6 +50,12 @@ class LockSettingsFragment : getString(R.string.settings_lock_enabled) else "" + + if (lockManager.isEmpty()) { + (findPreference("lock_fingerprint") as SwitchPreferenceCompat).isChecked = false + + PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("lock_fingerprint", false).apply() + } } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -130,9 +137,8 @@ class LockSettingsFragment : isChecked = false Toast.makeText(requireContext(), R.string.settings_lock_fingerprint_without_lock, Toast.LENGTH_SHORT).show() - } - - isChecked = newValue as Boolean + } else + isChecked = newValue as Boolean false } From 90e1dc59bd5457481afe755e39cdc90ca12d4a9b Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 11:31:37 +0900 Subject: [PATCH 12/24] Disable fingerprint when all the locks are disabled --- app/build.gradle | 2 +- app/release/output.json | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c7f6a513..a9fbf7d9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ android { minSdkVersion 16 targetSdkVersion 29 versionCode 53 - versionName "4.18-beta1" + versionName "4.18-alpha1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables.useSupportLibrary = true diff --git a/app/release/output.json b/app/release/output.json index 41aaa36f..246862e8 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1,20 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":52,"versionName":"4.17","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release","dirName":""},"path":"app-release.apk","properties":{}}] \ No newline at end of file +{ + "version": 1, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "xyz.quaver.pupil", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "properties": [], + "versionCode": 53, + "versionName": "53", + "enabled": true, + "outputFile": "app-release.apk" + } + ] +} \ No newline at end of file From d28c5741d0d5a32a935d4b2dd9761686ca2a707e Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 11:42:38 +0900 Subject: [PATCH 13/24] SuppressLint --- app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt index 273922e9..91362fb6 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt @@ -18,6 +18,7 @@ package xyz.quaver.pupil.adapters +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.MotionEvent @@ -60,6 +61,7 @@ class MirrorAdapter(context: Context) : RecyclerView.Adapter Unit)? = null var onItemMoved : ((List) -> (Unit))? = null + @SuppressLint("ClickableViewAccessibility") override fun onBindViewHolder(holder: ViewHolder, position: Int) { with(holder.view) { mirror_name.text = mirrors[list.elementAt(position)] From ec2e0ef773b975d6b77f582b6e70e9d5cbd8c423 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 11:42:50 +0900 Subject: [PATCH 14/24] SuppressLint --- app/src/main/res/drawable/fingerprint.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/drawable/fingerprint.xml b/app/src/main/res/drawable/fingerprint.xml index bfc10e9f..3418d25d 100644 --- a/app/src/main/res/drawable/fingerprint.xml +++ b/app/src/main/res/drawable/fingerprint.xml @@ -1,8 +1,10 @@ - + \ No newline at end of file From 902f705e89434a2f6d469d73382590ce005797f0 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 11:55:34 +0900 Subject: [PATCH 15/24] Added Filter --- .../pupil/ui/dialog/DefaultQueryDialog.kt | 14 ++++++++++ .../main/res/layout/dialog_default_query.xml | 26 +++++++++++++++++++ app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 43 insertions(+) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DefaultQueryDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DefaultQueryDialog.kt index 3d39c6e4..94029cd5 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DefaultQueryDialog.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DefaultQueryDialog.kt @@ -45,6 +45,7 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { private val excludeBL = "-male:yaoi" private val excludeGuro = listOf("-female:guro", "-male:guro") + private val excludeLoli = listOf("-female:loli", "-male:shota") var onPositiveButtonClickListener : ((Tags) -> (Unit))? = null @@ -68,6 +69,11 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { newTags.add(tag) } + if (default_query_dialog_loli_checkbox.isChecked) + excludeLoli.forEach { tag -> + newTags.add(tag) + } + onPositiveButtonClickListener?.invoke(newTags) } @@ -120,6 +126,14 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { } } + with(view.default_query_dialog_loli_checkbox) { + isChecked = excludeLoli.all { tags.contains(it) } + if (excludeLoli.all { tags.contains(it) }) + excludeLoli.forEach { + tags.remove(it) + } + } + with(view.default_query_dialog_edittext) { setText(tags.toString(), android.widget.TextView.BufferType.EDITABLE) addTextChangedListener(object : TextWatcher { diff --git a/app/src/main/res/layout/dialog_default_query.xml b/app/src/main/res/layout/dialog_default_query.xml index f907f3f4..b98151e9 100644 --- a/app/src/main/res/layout/dialog_default_query.xml +++ b/app/src/main/res/layout/dialog_default_query.xml @@ -107,4 +107,30 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ee6ea54d..9cea3240 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -144,4 +144,5 @@ 予備のロックが設定されていないと指紋ロックは使用できません Pupil指紋ロック™ こうかはばつぐんだ! + 登場人物を全て18歳以上にする \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 9c6fe9ab..ddce14a2 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -144,4 +144,5 @@ 지문 잠금은 다른 잠금 방식이 활성화 되어 있을 때만 사용 가능합니다 Pupil 지문 인식™ 힘세고 강한 지문 인식 + 히익 페도 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 874a083c..39c6f654 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -201,6 +201,7 @@ Language: Filter BL Filter Guro + I\'m not a pedophile Any Mirrors From 065845f1be20debf5cd8b18257e1815b293b8a4e Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 14:45:57 +0900 Subject: [PATCH 16/24] Cache disable setting added --- .../pupil/adapters/GalleryBlockAdapter.kt | 3 +- .../quaver/pupil/adapters/ReaderAdapter.kt | 14 +++-- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 18 +++--- .../xyz/quaver/pupil/ui/ReaderActivity.kt | 17 ++++-- .../xyz/quaver/pupil/util/download/Cache.kt | 60 ++++++++++++------- .../pupil/util/download/DownloadWorker.kt | 15 ++++- .../main/java/xyz/quaver/pupil/util/update.kt | 3 +- app/src/main/res/values-ja/strings.xml | 2 + app/src/main/res/values-ko/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/root_preferences.xml | 4 ++ 11 files changed, 93 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt index 1cdf9301..c795763c 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -28,6 +28,7 @@ import android.view.ViewGroup import android.widget.LinearLayout import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.CircularProgressDrawable import androidx.vectordrawable.graphics.drawable.Animatable2Compat @@ -77,7 +78,7 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri val reader = Cache(context).getReaderOrNull(galleryID) CoroutineScope(Dispatchers.Main).launch { - if (reader == null) { + if (reader == null || PreferenceManager.getDefaultSharedPreferences(context).getBoolean("cache_disable", false)) { view.galleryblock_progressbar.visibility = View.GONE view.galleryblock_progress_complete.visibility = View.GONE return@launch diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt index f6b90722..5869043e 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -32,7 +32,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import xyz.quaver.hitomi.Reader import xyz.quaver.pupil.R -import xyz.quaver.pupil.util.download.Cache import xyz.quaver.pupil.util.download.DownloadWorker import java.util.* import kotlin.concurrent.schedule @@ -50,6 +49,8 @@ class ReaderAdapter(private val glide: RequestManager, class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) + var downloadWorker: DownloadWorker? = null + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return LayoutInflater.from(parent.context).inflate( R.layout.item_reader, parent, false @@ -61,6 +62,9 @@ class ReaderAdapter(private val glide: RequestManager, override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.view as ConstraintLayout + if (downloadWorker == null) + downloadWorker = DownloadWorker.getInstance(holder.view.context) + if (isFullScreen) { holder.view.layoutParams.height = RecyclerView.LayoutParams.MATCH_PARENT holder.view.container.layoutParams.height = ConstraintLayout.LayoutParams.MATCH_PARENT @@ -82,15 +86,15 @@ class ReaderAdapter(private val glide: RequestManager, holder.view.reader_index.text = (position+1).toString() - val images = Cache(holder.view.context).getImage(galleryID, position) - val progress = DownloadWorker.getInstance(holder.view.context).progress[galleryID]?.get(position) + val image = downloadWorker!!.results[galleryID]?.get(position) + val progress = downloadWorker!!.progress[galleryID]?.get(position) - if (progress?.isInfinite() == true && images != null) { + if (progress?.isInfinite() == true && image != null) { holder.view.reader_item_progressbar.visibility = View.INVISIBLE holder.view.image.post { glide - .load(images) + .load(image) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .fitCenter() diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 20e6e9b3..172f4896 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -31,10 +31,7 @@ import android.view.MotionEvent import android.view.View import android.view.WindowManager import android.view.inputmethod.EditorInfo -import android.widget.EditText -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView +import android.widget.* import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.cardview.widget.CardView @@ -439,13 +436,16 @@ class MainActivity : AppCompatActivity() { onDownloadClickedHandler = { position -> val galleryID = galleries[position].id val worker = DownloadWorker.getInstance(context) - - if (Cache(context).isDownloading(galleryID)) //download in progress - worker.cancel(galleryID) + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("cache_disable", false)) + Toast.makeText(context, R.string.settings_download_when_cache_disable_warning, Toast.LENGTH_SHORT).show() else { - Cache(context).setDownloading(galleryID, true) + if (Cache(context).isDownloading(galleryID)) //download in progress + worker.cancel(galleryID) + else { + Cache(context).setDownloading(galleryID, true) - worker.queue.add(galleryID) + worker.queue.add(galleryID) + } } closeAllItems() diff --git a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt index 4bd346f4..14306eea 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt @@ -23,6 +23,7 @@ import android.graphics.drawable.Animatable import android.graphics.drawable.Drawable import android.os.Bundle import android.view.* +import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat @@ -321,13 +322,17 @@ class ReaderActivity : AppCompatActivity() { animateDownloadFAB(Cache(context).isDownloading(galleryID)) //If download in progress, animate button setOnClickListener { - if (Cache(context).isDownloading(galleryID)) { - Cache(context).setDownloading(galleryID, false) + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("cache_disable", false)) + Toast.makeText(context, R.string.settings_download_when_cache_disable_warning, Toast.LENGTH_SHORT).show() + else { + if (Cache(context).isDownloading(galleryID)) { + Cache(context).setDownloading(galleryID, false) - animateDownloadFAB(false) - } else { - Cache(context).setDownloading(galleryID, true) - animateDownloadFAB(true) + animateDownloadFAB(false) + } else { + Cache(context).setDownloading(galleryID, true) + animateDownloadFAB(true) + } } } } diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt index c1e53abd..3b78315b 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt @@ -34,10 +34,8 @@ import xyz.quaver.pupil.util.getCachedGallery import xyz.quaver.pupil.util.getDownloadDirectory import xyz.quaver.pupil.util.isParentOf import xyz.quaver.pupil.util.json -import java.io.BufferedInputStream import java.io.File import java.io.FileOutputStream -import java.io.InputStream import java.net.URL import java.util.* import java.util.concurrent.locks.Lock @@ -47,6 +45,7 @@ class Cache(context: Context) : ContextWrapper(context) { companion object { private val moving = mutableListOf() + private val readers = SparseArray() } private val locks = SparseArray() @@ -68,7 +67,7 @@ class Cache(context: Context) : ContextWrapper(context) { // Search in this order // Download -> Cache fun getCachedGallery(galleryID: Int) = getCachedGallery(this, galleryID).also { - if (!it.exists()) + if (!it.exists() && !preference.getBoolean("cache_disable", false)) it.mkdirs() } @@ -88,6 +87,9 @@ class Cache(context: Context) : ContextWrapper(context) { } fun setCachedMetadata(galleryID: Int, metadata: Metadata) { + if (preference.getBoolean("cache_disable", false)) + return + val file = File(getCachedGallery(galleryID), ".metadata").also { if (!it.exists()) it.createNewFile() @@ -99,6 +101,7 @@ class Cache(context: Context) : ContextWrapper(context) { suspend fun getThumbnail(galleryID: Int): String? { val metadata = Cache(this).getCachedMetadata(galleryID) + @Suppress("BlockingMethodInNonBlockingContext") val thumbnail = if (metadata?.thumbnail == null) withContext(Dispatchers.IO) { val thumbnails = getGalleryBlock(galleryID)?.thumbnails @@ -159,7 +162,7 @@ class Cache(context: Context) : ContextWrapper(context) { } fun getReaderOrNull(galleryID: Int): Reader? { - return getCachedMetadata(galleryID)?.reader + return readers[galleryID] ?: getCachedMetadata(galleryID)?.reader } suspend fun getReader(galleryID: Int): Reader? { @@ -180,28 +183,33 @@ class Cache(context: Context) : ContextWrapper(context) { it } - val reader = if (metadata?.reader == null) { - var retval: Reader? = null + val reader = + if (readers[galleryID] != null) + return readers[galleryID] + else if (metadata?.reader == null) { + var retval: Reader? = null - for (source in sources) { - retval = try { - withContext(Dispatchers.IO) { - withTimeoutOrNull(1000) { - source.value.invoke() + for (source in sources) { + retval = try { + withContext(Dispatchers.IO) { + withTimeoutOrNull(1000) { + source.value.invoke() + } } + } catch (e: Exception) { + FirebaseCrashlytics.getInstance().recordException(e) + null } - } catch (e: Exception) { - FirebaseCrashlytics.getInstance().recordException(e) - null + + if (retval != null) + break } - if (retval != null) - break - } + retval + } else + metadata.reader - retval - } else - metadata.reader + readers.put(galleryID, reader) setCachedMetadata( galleryID, @@ -242,18 +250,24 @@ class Cache(context: Context) : ContextWrapper(context) { } - fun putImage(galleryID: Int, index: Int, ext: String, data: InputStream) { + fun putImage(galleryID: Int, index: Int, ext: String, data: ByteArray) { + if (preference.getBoolean("cache_disable", false)) + return + val cache = File(getCachedGallery(galleryID), "%05d.$ext".format(index)).also { if (!it.exists()) it.createNewFile() } - BufferedInputStream(data).use { - it.copyTo(FileOutputStream(cache)) + FileOutputStream(cache).use { + it.write(data) } } fun moveToDownload(galleryID: Int) { + if (preference.getBoolean("cache_disable", false)) + return + if (moving.contains(galleryID)) return diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt index 29c23471..63226ab6 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt @@ -143,6 +143,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont * null -> Download in progress / Loading */ val exception = SparseArray?>() + val results = SparseArray?>() val notification = SparseArray() private val loop = loop() @@ -189,6 +190,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont progress.clear() exception.clear() + results.clear() notification.clear() notificationManager.cancelAll() } @@ -205,6 +207,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont progress.remove(galleryID) exception.remove(galleryID) + results.remove(galleryID) notification.remove(galleryID) notificationManager.cancel(galleryID) @@ -253,6 +256,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont if (reader == null) { progress.put(galleryID, null) exception.put(galleryID, null) + results.put(galleryID, null) Cache(this@DownloadWorker).setDownloading(galleryID, false) return@launch @@ -267,6 +271,9 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont 0F }.toMutableList()) exception.put(galleryID, reader.galleryInfo.files.map { null }.toMutableList()) + results.put(galleryID, reader.galleryInfo.files.indices.map { index -> + cache?.firstOrNull { it?.nameWithoutExtension?.toIntOrNull() == index }?.readBytes() + }.toMutableList()) if (notification[galleryID] == null) initNotification(galleryID) @@ -316,13 +323,19 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont try { response.body().use { - Cache(this@DownloadWorker).putImage(galleryID, i, ext, it!!.byteStream()) + it!! + + results[galleryID]?.set(i, it.source().readByteArray()) } progress[galleryID]?.set(i, Float.POSITIVE_INFINITY) notify(galleryID) CoroutineScope(Dispatchers.IO).launch { + results[galleryID]?.get(i)?.also { + Cache(this@DownloadWorker).putImage(galleryID, i, ext, it) + } + if (isCompleted(galleryID)) { with(Cache(this@DownloadWorker)) { if (isDownloading(galleryID)) { diff --git a/app/src/main/java/xyz/quaver/pupil/util/update.kt b/app/src/main/java/xyz/quaver/pupil/util/update.kt index f56a0540..406837cd 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -50,7 +50,6 @@ import java.io.File import java.io.IOException import java.net.URL import java.util.* -import java.util.concurrent.Executors import java.util.concurrent.TimeUnit fun getReleases(url: String) : JsonArray { @@ -320,7 +319,7 @@ fun importOldGalleries(context: Context, folder: File) = CoroutineScope(Dispatch @Suppress("NAME_SHADOWING") val index = it.nameWithoutExtension.toIntOrNull() ?: return@forEach - Cache(context).putImage(galleryID, index, it.extension, it.inputStream()) + Cache(context).putImage(galleryID, index, it.extension, it.readBytes()) } } diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9cea3240..3c2e9311 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -145,4 +145,6 @@ Pupil指紋ロック™ こうかはばつぐんだ! 登場人物を全て18歳以上にする + キャッシュを使用しない + キャッシュを使用しないため、ダウンロードできません \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index ddce14a2..e8aa216c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -145,4 +145,6 @@ Pupil 지문 인식™ 힘세고 강한 지문 인식 히익 페도 + 캐시 비활성화 + 캐시를 활성화 해야 다운로드를 진행할 수 있습니다 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 39c6f654..3fbdaa51 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -153,6 +153,8 @@ %s available Custom Location This folder is not writable. Please select another folder. + Disable Cache + Download is disabled when the cache is disabled Low quality images Load low quality images to improve load speed and data usage diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index cd28fb7b..89a0203c 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -47,6 +47,10 @@ app:key="dl_location" app:title="@string/settings_dl_location"/> + + Date: Sun, 21 Jun 2020 15:00:05 +0900 Subject: [PATCH 17/24] APCJSA enabling dialog added --- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 24 +++++++++++++++++++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 3 +++ 4 files changed, 31 insertions(+) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 172f4896..0838470e 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -143,6 +143,30 @@ class MainActivity : AppCompatActivity() { preference.edit().putBoolean("https_block_alert", true).apply() } + + if (!preference.getBoolean("apcjsa_option", false)) { + android.app.AlertDialog.Builder(this).apply { + setTitle(R.string.apcjsa_option_title) + setMessage(R.string.apcjsa_option_message) + setPositiveButton(android.R.string.yes) { _, _ -> + val tags = Tags.parse( + preference.getString("default_query", "") ?: "" + ) + + tags.add("-female:loli") + tags.add("-male:shota") + + preference.edit() + .putString("default_query", tags.toString()) + .putBoolean("cache_disable", true) + .putBoolean("apcjsa_option", true) + .apply() + } + setNegativeButton(android.R.string.no) { _, _ -> } + }.show() + + preference.edit().putBoolean("apcjsa_option", true).apply() + } } with(application as Pupil) { diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3c2e9311..4063b569 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -147,4 +147,6 @@ 登場人物を全て18歳以上にする キャッシュを使用しない キャッシュを使用しないため、ダウンロードできません + (Korean only) + (Korean only) \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index e8aa216c..4df85236 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -147,4 +147,6 @@ 히익 페도 캐시 비활성화 캐시를 활성화 해야 다운로드를 진행할 수 있습니다 + 아청법 대응 옵션 추가 + 경찰서 정모 확률을 줄여보고자 캐시 비활성화/태그 필터를 추가하였습니다. 적용하시겠습니까? \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3fbdaa51..7e2dc9f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,9 @@ (Korean only) (Korean only) + (Korean only) + (Korean only) + Update failed Please install manually by visiting github release page :{ (or try again!) Cannot auto update because permission is denied. Please download manually from the webpage. From 4db0022d6a5933a5ed1a151e54890de13b3cf94a Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 15:32:55 +0900 Subject: [PATCH 18/24] Fixed nomedia creation menu --- .../java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt | 6 ++++++ app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - app/src/main/res/xml/root_preferences.xml | 5 ++--- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt index a3dec70e..29eb39b3 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt @@ -157,6 +157,9 @@ class SettingsFragment : ProxyDialog(requireContext()) .show() } + "nomedia" -> { + File(getDownloadDirectory(context), ".nomedia").createNewFile() + } "backup" -> { File(ContextCompat.getDataDir(requireContext()), "favorites.json").copyTo( File(getDownloadDirectory(requireContext()), "favorites.json"), @@ -322,6 +325,9 @@ class SettingsFragment : "dark_mode" -> { onPreferenceChangeListener = this@SettingsFragment } + "nomedia" -> { + onPreferenceClickListener = this@SettingsFragment + } "backup" -> { onPreferenceClickListener = this@SettingsFragment } diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 4063b569..3ad95d3d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -99,7 +99,6 @@ タグ サムネイル おすすめ - イメージをギャラリーから見えなくする イメージを隠す ヘルプ 削除 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4df85236..d7c72021 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -97,7 +97,6 @@ 태그 관련 갤러리 미리보기 - 갤러리에서 이미지 검색이 되지 않도록 합니다 이미지 숨기기 도움말 삭제 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e2dc9f0..96ba80c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -176,7 +176,6 @@ Dark mode Protect yourself against light attacks! Hide image from gallery - Hides image from gallery Backup favorites Backup file created Check out diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 89a0203c..234899ce 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -91,10 +91,9 @@ app:title="@string/settings_dark_mode_title" app:summary="@string/settings_dark_mode_summary"/> - + app:title="@string/settings_nomedia_title"/> Date: Sun, 21 Jun 2020 16:30:10 +0900 Subject: [PATCH 19/24] SearchView Dark Theme --- .../FloatingSearchViewDayNight.kt | 35 ++++++++++++++++++ .../java/xyz/quaver/pupil/ui/MainActivity.kt | 19 +++++----- .../res/drawable-hdpi/ic_account_group.png | Bin 1332 -> 0 bytes .../res/drawable-hdpi/ic_account_star.png | Bin 1255 -> 0 bytes .../main/res/drawable-hdpi/ic_book_open.png | Bin 620 -> 0 bytes app/src/main/res/drawable-hdpi/ic_brush.png | Bin 975 -> 0 bytes .../res/drawable-hdpi/ic_gender_female.png | Bin 1113 -> 0 bytes .../main/res/drawable-hdpi/ic_gender_male.png | Bin 1249 -> 0 bytes app/src/main/res/drawable-hdpi/ic_tag.png | Bin 965 -> 0 bytes .../main/res/drawable-hdpi/ic_translate.png | Bin 1531 -> 0 bytes .../res/drawable-ldpi/ic_account_group.png | Bin 793 -> 0 bytes .../res/drawable-ldpi/ic_account_star.png | Bin 802 -> 0 bytes .../main/res/drawable-ldpi/ic_book_open.png | Bin 495 -> 0 bytes app/src/main/res/drawable-ldpi/ic_brush.png | Bin 639 -> 0 bytes .../res/drawable-ldpi/ic_gender_female.png | Bin 733 -> 0 bytes .../main/res/drawable-ldpi/ic_gender_male.png | Bin 817 -> 0 bytes app/src/main/res/drawable-ldpi/ic_tag.png | Bin 670 -> 0 bytes .../main/res/drawable-ldpi/ic_translate.png | Bin 934 -> 0 bytes .../res/drawable-mdpi/ic_account_group.png | Bin 1036 -> 0 bytes .../res/drawable-mdpi/ic_account_star.png | Bin 979 -> 0 bytes .../main/res/drawable-mdpi/ic_book_open.png | Bin 636 -> 0 bytes app/src/main/res/drawable-mdpi/ic_brush.png | Bin 760 -> 0 bytes .../res/drawable-mdpi/ic_gender_female.png | Bin 947 -> 0 bytes .../main/res/drawable-mdpi/ic_gender_male.png | Bin 1001 -> 0 bytes app/src/main/res/drawable-mdpi/ic_tag.png | Bin 848 -> 0 bytes .../main/res/drawable-mdpi/ic_translate.png | Bin 1259 -> 0 bytes .../res/drawable-xhdpi/ic_account_group.png | Bin 1760 -> 0 bytes .../res/drawable-xhdpi/ic_account_star.png | Bin 1678 -> 0 bytes .../main/res/drawable-xhdpi/ic_book_open.png | Bin 892 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_brush.png | Bin 1098 -> 0 bytes .../res/drawable-xhdpi/ic_gender_female.png | Bin 1593 -> 0 bytes .../res/drawable-xhdpi/ic_gender_male.png | Bin 1657 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_tag.png | Bin 1257 -> 0 bytes .../main/res/drawable-xhdpi/ic_translate.png | Bin 2052 -> 0 bytes .../res/drawable-xxhdpi/ic_account_group.png | Bin 2439 -> 0 bytes .../res/drawable-xxhdpi/ic_account_star.png | Bin 2382 -> 0 bytes .../main/res/drawable-xxhdpi/ic_book_open.png | Bin 948 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_brush.png | Bin 1576 -> 0 bytes .../res/drawable-xxhdpi/ic_gender_female.png | Bin 2250 -> 0 bytes .../res/drawable-xxhdpi/ic_gender_male.png | Bin 2454 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_tag.png | Bin 1642 -> 0 bytes .../main/res/drawable-xxhdpi/ic_translate.png | Bin 2643 -> 0 bytes .../res/drawable-xxxhdpi/ic_account_group.png | Bin 3327 -> 0 bytes .../res/drawable-xxxhdpi/ic_account_star.png | Bin 3138 -> 0 bytes .../res/drawable-xxxhdpi/ic_book_open.png | Bin 1301 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_brush.png | Bin 2030 -> 0 bytes .../res/drawable-xxxhdpi/ic_gender_female.png | Bin 2856 -> 0 bytes .../res/drawable-xxxhdpi/ic_gender_male.png | Bin 3131 -> 0 bytes app/src/main/res/drawable-xxxhdpi/ic_tag.png | Bin 2306 -> 0 bytes .../res/drawable-xxxhdpi/ic_translate.png | Bin 3596 -> 0 bytes app/src/main/res/drawable/account_group.xml | 8 ++++ app/src/main/res/drawable/account_star.xml | 8 ++++ app/src/main/res/drawable/book_open.xml | 8 ++++ app/src/main/res/drawable/brush.xml | 8 ++++ app/src/main/res/drawable/gender_female.xml | 8 ++++ app/src/main/res/drawable/gender_male.xml | 8 ++++ app/src/main/res/drawable/tag.xml | 8 ++++ app/src/main/res/drawable/translate.xml | 8 ++++ .../main/res/layout/activity_main_content.xml | 13 +++++-- 59 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt delete mode 100644 app/src/main/res/drawable-hdpi/ic_account_group.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_account_star.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_book_open.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_brush.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_gender_female.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_gender_male.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_tag.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_translate.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_account_group.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_account_star.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_book_open.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_brush.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_gender_female.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_gender_male.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_tag.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_translate.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_account_group.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_account_star.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_book_open.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_brush.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_gender_female.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_gender_male.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_tag.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_translate.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_account_group.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_account_star.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_book_open.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_brush.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_gender_female.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_gender_male.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_tag.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_translate.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_account_group.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_account_star.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_book_open.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_brush.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_gender_female.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_gender_male.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_tag.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_translate.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_account_group.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_account_star.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_book_open.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_brush.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_gender_female.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_gender_male.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_tag.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_translate.png create mode 100644 app/src/main/res/drawable/account_group.xml create mode 100644 app/src/main/res/drawable/account_star.xml create mode 100644 app/src/main/res/drawable/book_open.xml create mode 100644 app/src/main/res/drawable/brush.xml create mode 100644 app/src/main/res/drawable/gender_female.xml create mode 100644 app/src/main/res/drawable/gender_male.xml create mode 100644 app/src/main/res/drawable/tag.xml create mode 100644 app/src/main/res/drawable/translate.xml diff --git a/app/src/main/java/com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt b/app/src/main/java/com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt new file mode 100644 index 00000000..3fe1fb31 --- /dev/null +++ b/app/src/main/java/com/arlib/floatingsearchview/FloatingSearchViewDayNight.kt @@ -0,0 +1,35 @@ +/* + * Pupil, Hitomi.la viewer for Android + * Copyright (C) 2020 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 com.arlib.floatingsearchview + +import android.content.Context +import android.os.Parcelable +import android.util.AttributeSet + +class FloatingSearchViewDayNight @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null) + : FloatingSearchView(context, attrs) { + + // hack to remove color attributes which should not be reused + override fun onSaveInstanceState(): Parcelable? { + super.onSaveInstanceState() + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 0838470e..65f37e9e 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -41,6 +41,7 @@ import androidx.core.view.GravityCompat import androidx.preference.PreferenceManager import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import com.arlib.floatingsearchview.FloatingSearchView +import com.arlib.floatingsearchview.FloatingSearchViewDayNight import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion import com.arlib.floatingsearchview.util.view.SearchInputView import com.bumptech.glide.Glide @@ -767,7 +768,7 @@ class MainActivity : AppCompatActivity() { }) searchInputView.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI - with(main_searchview as FloatingSearchView) { + with(main_searchview as FloatingSearchViewDayNight) { val favoritesFile = File(ContextCompat.getDataDir(context), "favorites_tags.json") val serializer = Tag.serializer().list @@ -870,14 +871,14 @@ class MainActivity : AppCompatActivity() { ResourcesCompat.getDrawable( resources, when(item.n) { - "female" -> R.drawable.ic_gender_female - "male" -> R.drawable.ic_gender_male - "language" -> R.drawable.ic_translate - "group" -> R.drawable.ic_account_group - "character" -> R.drawable.ic_account_star - "series" -> R.drawable.ic_book_open - "artist" -> R.drawable.ic_brush - else -> R.drawable.ic_tag + "female" -> R.drawable.gender_female + "male" -> R.drawable.gender_male + "language" -> R.drawable.translate + "group" -> R.drawable.account_group + "character" -> R.drawable.account_star + "series" -> R.drawable.book_open + "artist" -> R.drawable.brush + else -> R.drawable.tag }, null) ) diff --git a/app/src/main/res/drawable-hdpi/ic_account_group.png b/app/src/main/res/drawable-hdpi/ic_account_group.png deleted file mode 100644 index 2e8279db368d2bc549e4c775c4f65da0c203065d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1332 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_tJ@o-U3d8Ta0X-}hGz75R5=?xk~=eAp*l z{+Q}0>V*TYi%+X zu@o9|FO$BLxp_zKvhP0*Y?0jcHo)upQH%S*?=8#E{oHri`uiNlnjaq?9&YECxBIt$ zK^?mZk8*(C^mz3}kqnFbe)2V}S(dqaS>`SAFb5ksd8I}Dof&K9&Y$^xM&-r`oqMmt z{VuL|XiH?-bAp*cuvhqEQ=&v8xB3A~v*hJ(l^1>VTKXw!|EIE0&cg;Fr#Bffs4*A_ zzRkrM7hn_PUxrt@*~-qo+G&Y7HLe=a7_e|-K{o!81r zmtvlU2d}(x>)5fjlACVl0(Jy`SDNajd8Vd$#ZRwuQ%^tr{^;Y6=SP!1hOc*+=dK~v zZR_d6t^0(LVOr|fw?9fdL=_jchG>=UOlNF#cpxRX@@-9Xb8}U9=6{|!?{|o=TE(~Z z_LC?3u5D&u&@ZV8=vb}0Y-`?4Zp9*9rgdevPM^`A=YC)Td*_nswVAiHjNi|7n>X{j ziEni2?N?u`EwPbq@-APn6L-4vNoUja%^_M> z)z#HMZ_DKuzIeIU%dj|>W20E7%RUp|&1F&-{cha7JN06QN&M=oC24Z1i;nF-$*^f* zz>Dq}z3{JH7rz=zKbfMmE!W>e^Yy`m5B)i2(eI{KEdQ}JD%U4aWTD2Xw{^$&Z+LOr zVy@rv`I~ZoTPhwgW^h|FWqRieAqIob_nkU+GkjY*Wj`xZWBj%2*ZKeXGPXP}u4Dox z5uKI_XAZ;e&1anojyzd1<$iu{?%nrh>D!r(oH=vm^ck7SL2;aH&GWa;@to+Pa*y#t z-txf3(FUKH8REscTJs;w%9~sMNLcYmuF|bj&p+Gm`kTvYF~2#Vu|oL3gvk$XJ1zVW zntcAxpFNv4Z{B?1jO_8AI0qMdUteEcJ$?P_(%W2=J~9gKef#5o(zB@^Dxc==7BpKA z42D&PpO-VlF|M!^*miPLF|1o=IEp-h{bdAhI3{9*|EP+Vdz`)ADKt%k( zJroVO`6-!cmAEyedPO7wHE4irC@xF4N=htF)h#W`WJt@*Nww0~*DuK}(9caw&rHtN c4fUu9G&0Ic;VkWs0qSA!boFyt=akR{0G+s5&j0`b diff --git a/app/src/main/res/drawable-hdpi/ic_account_star.png b/app/src/main/res/drawable-hdpi/ic_account_star.png deleted file mode 100644 index 53b16e5dae82597caea24f38ecbe543d3be84cfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1255 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_tI8o-U3d8TZ~s+|O1Hm9TwomV4`{NltF8 zPxtP-YkYWbd`VjpaqaHeUusIVg5vS4^TldD9JN0zK40WWcxMO4CDx0)K@*&eg*9%t z?vkkWNLXt>NpF%%vAz7PDJ8zQX8y?#o5RdJdFTDV`-(7?dR#PY+wIXzTk zrq8+l-rl_|37th)C2^Yrm4ON(~?*)?Cv zS$Kkv+H=O3&({8$rOw&1(mNZLCDvB^xJ(Ip^~!-YVw&hi9qmVxPZ#g)5}(*|{lR3OwZwcdumzMiV7jLa=eX^S2SgqcT z`%0gtzTPF>&zG_GzRJvRGv7xaFSPqARkOuv-Rrywe}o#+KTkAK`sAwqi9w*(&6wfc zPlf%`{m1P;Fa8#xAEGt&-SMQ2N)0N0FDH9k>oJtyx$bxE_8CqK6Le1BS{JtZ`II2> zLMLPP2YEJf|5YZRH2K5vVn#t_Wo2Pa&7W-@CDwaRso0-*TC~4Hcgfa1&86$QJQnSp znAd-_e)A$zXEPqT*N!z%aN_A}JHusE0Z+VOn->Kohs znlzL%`pgroe6Zo7kFJi+j-yE*6)zl5OzDYaHz;g-5zcf2QvI~cS*B@@Pt8R{K=5A&LW?t12*NBpo#FA92&O-#>B&ejbnDRV6-^|ko9Y|DJ09tKZWKbLh*2~7Z3 CZXM(R diff --git a/app/src/main/res/drawable-hdpi/ic_book_open.png b/app/src/main/res/drawable-hdpi/ic_book_open.png deleted file mode 100644 index 144febb1a0a774c0f12158d02ed77b3010903d07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@pz*q%E{-7?_uk&L^*d}J!u}!s__TnTT}54s zbar}Ix6W&74L%?n@LsTuL(}OMtC4}>SLdq3^OyE1b%_Mevg3Jgep7PJ_v!nWw0LMP zy;7g{YwjYAW%quwHq119=Cx~w9Yb~Y+gp~~SFL*WR^!0JAJ$5{rs}8ee zN}C?8{9ZTF;iHR-@cX|uCA%0H(k@Ls%2XhIOV8w3)aTMz{qu%?k<de!+0gA08F?2T9&9V$46KTQP4e5&nObVOQtUmul0d)iB&W z0@Pr_tFYF(mEq0tA6DhBSj`f|rS9@XWM5a_lcBTTopDaFw$d%HaIwV0XZ#mVZgso8 zZMMz%`I~iSGwm=u7V~COcVWaM{WE_A{_$!oowA2Npf-HR+m|arp{ZKp8c~vxSdwa$ zT$Bo=7=VFescT@OYh)f`Xli9-Vr6WiZD3$!V6gv&Kp~2T-29Zxv`X9>&b6*M3)G+i zvZ1&v-6|=uI90c_D3c*AGbhzbUthl@w?IEPF+DRmTQ}LO%+jO8-R<;!<4-_644$rj JF6*2UngDt`=4k)` diff --git a/app/src/main/res/drawable-hdpi/ic_brush.png b/app/src/main/res/drawable-hdpi/ic_brush.png deleted file mode 100644 index 5316c73213f95ceeb1f7b58b31f15a956c6cf33b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_q`Ho-U3d8Ta1K*qeXZL886>y(Q-(Wv{Cx z9o|~3Mhb_7G$(2EE1cKq_|I_UOo-S&X0}sD?wxCCZJp{7;^Ff1L&J|5(yEdku9F$B zp1iwJB`756__R00Z2#TvzrOtW#QWGdR*y+4o|7z`3z>C}8}$6iF{^fSaaBArJ#YJO zzJ?D~?%mQ=f|pIUFTebfu|cUpMDXsV(!B-}JUI+Si&=dx-`TfghXuoi;>^tQxh`** z+7h409^6DQ=06UX?f!dvwckt!kq@U>7Bz({ z38>aQVG2C#uC;*4&WJJe!$gi1E&Q<#rZp>=3J)+Vo^$GZZ1a`V-fQ{g^@khyLlq{U zlwthP5_QJxY+CV?;@ev}b7#E%T2=48bkbSN^-MdSG0A(~c2RnuDky3r@IWAX+El6j z28XRtca;`BcL|Bvs<+f;YS6x| zxxdeEVtM|jb6Mu`z=OYqHt1-V*46#H#9J4sH2w76sDDCQo4$$7+U{EzD=YZcS8eid zt%tRo0vGq)KieX3>=-A*h1&dMH_rA78Tfu)HRV$mNcd9zS|P^ch40vI_H>*xb6XI! z@(#lXivxA6f@)F7N4?oWT)AdJV`sw$fhne*b$LzoVf9dOA{tVk0Q|`vi+kSR=(axHf_17z9 zm|nYauDY64&hUm?@mq(6zssyCMJDze)ZdmxSKbDu5|xwBp2$x~DfnT1_$w%rsFt`! zl%yn}$cBl8eLQ!67=D`Nv~0|P4qgC(KyF(?{x^HVa@DsgML z%JKXGP=f}@hT^hxtE9x@RNc~|Oop_~oK!1)ef^T$0{z^?^vvXJU6Z1qB44+ttVHdz Q!9YC>p00i_>zopr0M`16MgRZ+ diff --git a/app/src/main/res/drawable-hdpi/ic_gender_female.png b/app/src/main/res/drawable-hdpi/ic_gender_female.png deleted file mode 100644 index 76a7d4c45a5b8e6c35411403b87548c7524ce4c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1113 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 diff --git a/app/src/main/res/drawable-hdpi/ic_tag.png b/app/src/main/res/drawable-hdpi/ic_tag.png deleted file mode 100644 index aa3b8750d21aa97a001fd8cd449acf4f0f50361c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 965 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_q`!PZ!6KjC*gd`e$D*kYNAt{{3{9TXRFg zBE0pvj9hj(Utg5(bg(f$`SY{e8U0nCM0Y&&{jhH8rL@!>trfQqs_hJI-M0AT=ZZpw z%#2xoCYfxg>-YDZ|6aYmvGm%`dxDOK(>CvPb*XmQqT8ZzNdS6;P*i4g}=;7x4bvlFo=}K+TXZ&bLV8y1nXAYm5L_+ z7X+=e`Pv)9;O_Ee*3A3divJjPh_~=}DlWaFJJl;*=D6fiHjU}0`)e03j$8lz+_twX zb8iQq-n4J(=~Vs$eti$*}ahI)29dK z%m4S(te96mfkkOc$COWr2i{D4m89s>*zqk?{>{$K(d)0r|8mo7*zR)WC;u0ghIL&( z#FxH5V$^Wu@R?xW%eU_4eXqWfJoVkvC5t}!JYibUbb?nwPbs{?qT>$ZBBdhEj;0g3 z36V!+8fGqEt@qAd=T{PYY~$w8>3kl6*T4RaT3eej%Tg=zepX z?W(ZV%g^lLesHYolz+#H+M1d_#zqVbZHFJe7gbVoxnkt|+2+OZr3~R6UQ3JE6ugfd z`ZSS&AtCbGdLF@rPnDUCTy#S1#1xp1TzZ^egdC3O z&6jXsTo_^(=)lub^z#U#oeOir#I&CwKr@3@ehKx8ygiQJ=I?kKly=mKv4oPX{wgEMwFx^mZVxG z7o`Fz1|tJQOI-sKT_f`lLlY}gLn|XgZ36=<0|Vo87NER@(2$#-l9^VCTZ7Z&hHXF% z8Xy~r%hIiq5{pxHON%lY(lT>Wt@QQvOL7bJa}(1ule2Xzf=nVy!YfUrmM%F6)WhKE L>gTe~DWM4fBDjdm diff --git a/app/src/main/res/drawable-hdpi/ic_translate.png b/app/src/main/res/drawable-hdpi/ic_translate.png deleted file mode 100644 index 1a8f43653695f7ed65182c79a8c0cdf302edfbb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1531 zcmZ{kdpOg39LK-tGK!Eo*lBL%7Pi{R7Q>7fVVX=%X$(zP%Qh;~6p=2D+~rcv(YsqEf$m7{grDEy&?~&KPM1~dj+w7bu;T37&B#FB-LlU0K=0Ewd-rk)$Gj-5;8Nh^j9M%%a5Lj9 zHjQED$Jp|;ciqa7v@CSh%ZF>KpNlja%{8a!($9UCy7uR*G?zsyh2C@P-REa-JXOC~ zkhh4;vX-uF9Lh@l!acZ>SCOlpt!BA@`#wFLG}C6QQtKV5OeLovBvqb!l}jN&gl-i{ z)VDo-#$iV)-AKfb7lMhxH**WMq3MViyXwi0UkCE*1TOVX;#Lp!g*tmAnmu<}*Q)u8 zP1u$uZ+xxLU}8g{YXf7rsA*Bn&&;a0y>0N2OBwn-TnlJ>58q68tq4X$Kcw$`8#gs% z8Sie@8wtK<8uQ|#%z&3G-P+uxgj80w{KuQwOTao@NWj;wbXdrAw$x&&EcY7KIY&Gu56rMHm z{_7T2Gru%GfMGrt`&$~8+tf|r6Q}eOWTfop-j=9bH&rE%W@ zX@A2d7Y8IWYX96-irtCVvR;W*t$aS&H+3pAp<_97#ozbK(lT6<9OUz%QJ1OvJZM>) zmwV7!IH`#l!bVP>ex;~b+T_<&*iR?vV~hHW^X^3DCyyvI|MZ{6FHCL6HAnn}4iBfj5y~*&_I)(m=2HSfN zNGg7&5A36xkv_Ka*)c`mI)1Yky)vO4QLM~Ul^pBaC6dIvPU&i?K0UO_kl=B`T&CmQ zvw*|#5p6s*b!eblC|rr#YFw{QZv=5lzv8xw!GE* zDX@C&uyXDY^V3qifv9^#c>jL7AE~yzr>94(P$)XP`=oMtu7QC;Gv-||ky2A$eor6} zj5Kc4IR)oJs~SsEdVt2JrV_5RWjZpu z7^>Q>rRU?CxRiJZU?*w^))|Fy-nomi1B1h0acJyz6bgqzA)dW`@*e^7 zIGvGj>i-4D3&`n^!2TZxc4{Inmd1{E=B6+}0wXydheRSdOcs(!OJu|yb@tsCOHGap U=hAwg!XXU^^a~+26AqvI8z&OA{Qv*} diff --git a/app/src/main/res/drawable-ldpi/ic_account_group.png b/app/src/main/res/drawable-ldpi/ic_account_group.png deleted file mode 100644 index c7cbb8cbb4d209cf9214665975836c714f903bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 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 coa~(N!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3285v z*c@J-vtDsED@?>SKlt;zMYFat&U-%7bJ8BR4Xg{&CEWg=W0<+|3(w(-`#EOq-C5k- zllHwAZ#(=@?_@fIm(r)%Ddk2p=Pc(hc$ zd)SFh>HTBb_h*OW)PToH}qLC!<{uU%aS8iPH)<`v_Yuo#r*3fCQ^p1G3%LMFq-r4 zdgCN>-2d{1Zkba|QVb47=S%M>CrP9gHj+$_<+HE?ogBM@iaVoiPeatUrzQ?EC_xT6)0+WGiiEBhjN@7W> zRdP`(kYX@0FtpS)Fwr$K4>2^cGO@HWG}bmSure_C(Z2BuiiX_$l+3hB+!{J>ae@+> z2FQluvUIDY#Nt%l(xOa;w9K4TD}8!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3?!qR`fsYAj1CP`?`}?CK+BW zk!n~a4%L;i z=h8MyGaP1eshn5-v}?uJ)}J;1Eadvd*M_}b`NVUM;CVAgfjL5grc%AGn{U<#PZUnG z)37}4werIEzx>H(mK03RU8J$Abnffz3~7ps{$-d{l}QEOWm?ej!l>`@<9NnZ6Xr6c zp5RJ&_Hx~Xxb@fXGPtB{s7Z`gW;kcoVB#C^`Xo>MM89&BQdM-zOjj4SZ}+0_C-lrL zv6|a6Q~A_i^>q)=)XZ1$4B`+FOpTm&)ir0wwO^|H--*huXclRm&a}=WvO+bWHKf&= zQH-&7#QZNC9V-ADTyVi zR>?)FK#IZ0z|d0Hz(m)`JjBq%%GA)x$WYtBz{zopr05~@GIsgCw diff --git a/app/src/main/res/drawable-ldpi/ic_translate.png b/app/src/main/res/drawable-ldpi/ic_translate.png deleted file mode 100644 index ffe6baf7185ecaf45569a634eb8a26134d3a25e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3JPQS4c8H~ft^4~z|AkZG(`D5QzliVPD4DFKp|o~FnD$(s&6_xmy6&FD zcI!dI+Ry8_)4h5!Cx^LwS@Y~}_5Gdmi{(GuKU{j(^?IqeepUS6mkcvqep;*Sdw>7; zZpohRq>UNfC-!uFx%KuNGlS8qb32U$CQ34BPI~=#0&|0$$d#C+?VEz*%8*@7pQ?()ChmG{ajqd!l%dDa|Mz)i z*&XYuuSyt8e_z3wz}cWyxjjTnlwm=P-gA#<9`9HkH>fG?Rw;g3WLdtfIcejIt`mP} z)ZG03H}(Gac!mhIOv&Ud1_9SVp<3;IyRPZWzgiHWF@@ny=j&TvYWL54@#wv(VCCz| zd9ItBE-eXK`MuEI%tb{h@}tfBlnTEvSG)Q9*KDoRP}1t#)A?}0V~fhASKeg)H9n@p z;wbQE%E4>buFdPPk$2={NQw;m%47TM>+`6x1N}F*=T^%(SeTlcUe7RD!#EpP6V94orKhC9V-ADTyViR>?)FK#IZ0z|d0Hz(m)`JjBq%%EZ#j*izfTz{nC}Q!>*kacju$53B}i&;Z#`T$XN?lvtdqTUwOKkd~Q~YNfBQUy@s(pPQJT fnVhX#99d;#?3A3TzEFGtP!EHrtDnm{r-UW|N+*A; diff --git a/app/src/main/res/drawable-mdpi/ic_account_group.png b/app/src/main/res/drawable-mdpi/ic_account_group.png deleted file mode 100644 index 314120c494ecc9d314c8c2c853eb43fea5502285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+3=B+XJzX3_A`ZWucF@?_JJ$wxhOFD5dHH#Ld*0+JK5Ffup|MHNG#Lb( zWHh=qW#0aFQr`T6-an}WbJs02)_j_^GGtZjMd9nbQPY-2Ok4UhdDSXCRuT3F$I#Ht zu|H>}MxH7)Wn%Ze+{086x&Hd{P7jH;kLv<7L>L-oF7IfPK7NLOPx@hl9=F9C51m<; zIZM?w@ZRlhcV8@JK2&;FG_B6VMKC7ka)SO_6{T92N347K%aSVD1DnkKT-H6dkPUw8lpX$-S#U0M!OWY{3EmtV=be74SNiT$^#PN! zh76ucK{CfRpM3tA+@dhm>!nkN2!m#e#=AFf{&1K`yIncFNoQ@``upXv|Pl;IlJU%t>5-u;MQfB|M=sNJvS9czAjDG8LRT6aVRF&GY0Q zhK9^ptJb|f%@D^hBjMTIpp{$L8JL-w&v#}tcDVE(ZS1~0b;Z@JsHH(S*N3h41A18S zVzAPz>!r0W*S{7m4Ju@1F!-!weE#RHpLf;2X}sB2W$-!q{_BnUcE`_j&kJUFv2W{= z^F3|RkIv`H``RbhG1v350{u2W=K9&vY5Gqm=AVnoxXQ3(iuxGdc&DX}NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+3=B+DJY5_^A`ZU|^UW3x6tPWLTkJXeS7nLz>s&#!U_y5)%#Y?3%*Xby&FqyoPGbMfX%_&YxwQ`Lo zoZPK<%Sp)S<&iBrPDVbvSAA~g?>Gy7iG+s#JaTNFYLh+HggR{+ysPa)v$x&~S{iiI zs)%`7swIQmgr4nFvsB`Dt&4tRw*I^Fyt8TRU+((H(r|HM&V((OUw%1t>((tdiS}#l zcBa0w#U}>z?Y(8QE61wjhRNB7d9Rjb#wk?lHC^128u@Y_uSDC&f})}#l{M>L|H^n0 zIx)T4Xu|pD=es*BO-xFRa{^q-7D+J(+`4_yL4c)vLv`NfMB82K>cs{BE2Ij3^!&$h zmycn_GE1@Uqwgl!C@Lv41TiF4v)Ft7Q`+geDM&*^?0b9h&O38D?pPl%4uq!X1?AP zD#IA1HzPH2rP{|{weOGJ75Pl&nlf~pU^$t~u)h1~BlqKl$E13X)iQ)L?BQ27^ev9K z{&lj~%F7H3GH<0VzW5_nYw9+BqYFhW+j8T1n-<(MTk*7L=gMaRCsT}0R@mfC+{2d; z<1$J18G^wY&xe; zO{!s0xVX5$y3FNC>+{O^#*RW8Tie<|&95Q{KH42^ygOr_*V3S+U%!5}pZI7;-1_@& z&(Hi%7j8>D!*uaJ^I^f?O3D8pefz9nDdMv0q|zoQxl_NlwtlX!|HHt{!0?Z0XY>an zon^Z$feBT$#5JNMC9x#cD!C{XNHG{07+UHYnCKdrhZve#85vrc7-$<9SQ!{Bul{C_ zq9HdwB{QuOw}xwKe$7A)8Xy~r%hIiq5{pxHON%lY(lT>Wt@QQvOL7bJa}(1ule2Zb bGqNKs%?eVg-c@S@^)Pt4`njxgN@xNAuJw_E diff --git a/app/src/main/res/drawable-mdpi/ic_book_open.png b/app/src/main/res/drawable-mdpi/ic_book_open.png deleted file mode 100644 index b76cd538c1f8d3c31699c38a8fb6ce90c9014bd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K;vyaT^vIq4!@md>vz~epml$wx{#>-T-9AM z2f7|}wd$oe8W%9WV_;wCCGM5J-C>L7;*v%qr#BZYG7ZX-a@-a6XQkSnugSk|ZB+8A zB;{n8pzFm{0hZ(kYaY&fzsjokoNhToe%txbZtlO1eGFlf!C8<`)MX5lF!N|bSQrEyl*T_7?(A3Jv#LC!2+rYrez+nFkfkG4w zx%nxXX_dG&oNHZi7N|i3WJ7UTx>ZtQajI@NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K;w6Mx;TbJ9DY0XY?g4KMBDxC!k13+AB{TO z&?&Z5AiT|BGiP2AW0i2M#yS@L1Jy4UX_uG9?$Uh3nxdRywX;E>AaGKSlINB=LeFaM zN^lz1pP3VB`u^32v)|8tKJ&1E?Z&fx?VkJYeBL7-_4+$Qn~Hz!efe|WBRmfsHu&RV z#Q%WtWO(0Wmc4QQXTQBw;n}|2RIpIz^e=<^*)a)%HBxK8#w}u6{Xl6EP|PUayo|%V zVZO=ivwliUfe+nS9vw*LKGJ$z$bhk5CxJ`O^MHy>M*)Aw3F+Vhg+u!lrk~!LbK8!o zKtOz7=YhWGmFH!TSB7bbEV=*wza$S^;?9_TL0(fm-yLsc);{O3G)Qw<(8^>%&9hTx zFTVI9d-vUaYp=ilR$)`;{>ezIW~Ia0u+th#?Izb){P%H@auk^3%KC5n(e5s*iB>%Ti}zdcu^`)IacrKi#EC$H;S91Hjydbs~g{W10YbLp2QzswtW zPR0syGM2bJS#&k4)|m5tnl!@>=ExHaPSZI2fN{^DTH+c}l9E`GYL#4+3Zxi}3=A!G z4NP>6%tH)Kt&B{qj19C646FoU^=3d;j-)0rfC=y85}Sb4q9e0A}hT AQ~&?~ diff --git a/app/src/main/res/drawable-mdpi/ic_gender_female.png b/app/src/main/res/drawable-mdpi/ic_gender_female.png deleted file mode 100644 index 7000159c051d5d93dcfc2b3d2366ad94d47449c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+3=B*qo-U3d5r^M~`DP0TirA)qa-ALUNc`-I zj0>TPYfthV^c58U$M*6XSJ(anz24^km^Nzc5E0iq+VAV2a=~iyCD)R`+d)|wT#Nb+ zhApeS-nw4MY4%J%rKJ~kSAPF^&bIhnZT`FJ0~2L$GDxJ;Ct|8UCI-2hV!z=e~L^q788rmn!0Y{95#bX%w|rXiu9)6j*5?u zmy2NSI+}FTpl7y}zLJr)()*~j*R&W?jAjD$o*;KUYb$>(_lDf+2$y%v9+N}7 zR;pJEigzC^(h-|2CfJ;!J=5pj>af+b_x|V=V4cA-;n@8xao#X@lg&^Uo>Ri8;{J8VrX4$eSaZa$4B6(fj-eq)%e;e& zC-Zx_z&7Qy;BGmtLv1S$_`jXUq0MmM!a>J5sxw9|ydb!wr*F9j+ zb8~LemfLSvHb^+TEVDXtUg-dnb>iZS8MBsI@+ojXn36dw&2Iks^=sGWmZ#d~%zDPl z@R-4&=w|6%amPOktr8aoNcgHvE?@YY@#M6iEI*g9uYdNuYx;k!_I~{aATShQWH2x^ zEHsnrzu#z=P%Sh`+G}O|)~L0DZRTH6ujH8REwTD*H`Obb*?@7$E(LprJzs6!XYP&r zFE`EnR5b%b#_exc=Q6v0n)%p5^v!2ohL+vjWyXSn>ysb3{;aTPVoUpdkLmO#xvx>> zvERQfT;*Wn)Wgi6RMhi?^{xKIKVq&9SN1bZOTEdE_wr@W>s@{#^PG1AlkxrU(}g;Z zoaw8-&?yu5oB46fSLZ&Hr2)W%s9NG0QIe8al4_M)lnSI6j0_Adbq!2(jm$#~O{`2T ztqjby4GgRd3=Skstwhm~o1c=IR*74~Mtj|(Kn)ro8;Z-)t&$RpQ*}#=G8xh`b5gDJ p_4P|~3-ogn(=(H^b-lw)Efbx*J=e!Sxdzn3;OXk;vd$@?2>`gKc)kDt diff --git a/app/src/main/res/drawable-mdpi/ic_gender_male.png b/app/src/main/res/drawable-mdpi/ic_gender_male.png deleted file mode 100644 index 211cee7a7887f724f37439dc017cdf3cfb19ebe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1001 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+3=B-GJY5_^A`ZU|JL@MLDDv;z-q;O`IC?YJ zn5p$P3e3*TPj}Y3&~D)7bm!ORkCrtI@eRC&n*9lj1chQRNWPFTF*H>BW1;sWb9c+m z5GS4HQZ~t+fOQlV) zW#)ci*RD$b122{e7sP&l8#z1ocIw)#UD4H=ssUbSv)0aEa5tG}L1ijS&TT#B2%gEt zpN$&w!<`PC_?Q0t%$_&9-nGYNw_Re6out2W-EYIZSRKaGn~Z`^u`?{|$Y`3`Ig_8E zhPNqUYux(xGiK@Y&Dx{h=(TiG#@49*8I|W)*o>JOIy86{=6a|+n;JBq@lO71&)HAr z{|eQc~jyQJ>=ylx~^5U&$?eAK# zc8e-^+rk42Im@K~#zvg@(bU1G=fiMdTBRCyYm=z>f)Fjy#D70swupjEnR&g#gSkN< zNpb%9`!BXtq@|_JnJGW}iPV8x3s}ybWxW4A`ejMgl#X{y5)*@N&GbpD&(D7!-Y$J} zTda+xWhJ9RX3qOX%MxUi+zX9nt}&Z^)}%p`Avx;xbFY zj!T-E6`-#@dDT;Ji=aewA!*;_K_32OC7#SE^>Kd5n8kvU} znpl}wS{WK^8yHv_82o782+CFn4Y~O#nQ4`{HFVzM1Z5BnkPXFU=~hXJ#i_cbMVSm~ unK`Le`uh4Mxdr;UiRqci*}CR=Mj>IY=}`v`{8t3(VeoYIb6Mw<&;$Tt9F?O0 diff --git a/app/src/main/res/drawable-mdpi/ic_tag.png b/app/src/main/res/drawable-mdpi/ic_tag.png deleted file mode 100644 index 42e8255fc939f20102b608945699749236912a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 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 U!I<>emkD#g5g#(t;zj@FUvlUJLjV8( diff --git a/app/src/main/res/drawable-xhdpi/ic_account_star.png b/app/src/main/res/drawable-xhdpi/ic_account_star.png deleted file mode 100644 index a8dc7cc710c1cdb41216b0e28bcb251089025e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1678 zcmZ{kdr;F?7RPT41mt0XszjqLVJlh%6G#vUh!B1V1V~JpFd~ZKk%SO~LJ+|gjOAg1 zwAz(e5|j#*id141j695F3&T8KlaR=`OlmlCS zg$uWoNJcCGr#%1=7Xe^_TjDtYPT~QWX9Ga00KoOcl{R`1e1S@ij(}jou^iTZ2FBVG zk?|s!k$>m@p9H}GSkt1QP-gCv1x4R+3~T+v4iWFz_LfWEV);)XXUcSB_0EEE=pmze z|A9S{Z89fJTs^sd3Oo857s5eIwX%`*n2QIi?OJVbF#h?~)_bumx}9wE6%S$kf~{#_ z`iHd7ZxS<2=8rC^mJ;F#qQQWtJmbWtzo8e+|A{;z_LlvqB=RE{yK|lSXG7RHfG#oL zOF~DBM50q4rXyXXP?_XQkn0k{9v31t9PXdKU-$I~Gf_~jF2AAS!8&&HjT&hI!C~4+ zuKr;(BcoejX7pxayYv8c2>q(X$=x?7Xtif`b#=k!5%~BSLa%y?t)bd<7HU0LR#tFh z_w$-e&8W%hH-OL)4sE5T;6;(FU*2c*iigovn>5-%fQYnmRvY5*+~67J z`R%B#6uQs%u&yznl_i#yl4>u z5aFG$5nJ?cC;D;suX20&bt++C)iTDA`mwNIoEtRJsa*@)+6t5dupeHzVXR`|o-h#1 zj-vgH^v&Q={)+?tTOObtQ187@zt5+;8?j`!v#zI@Ts_YW8ZsnQRaE$=#XqXV#C%ry zqt>;(y?x&xx2bXCwr|TL5ciu|7c|-p;q-zla{02gc>K#ZB`6>+zw@3ZiaYVU9$O=7 zQ=ZXN>GGKGY8f}WDgxFSfb&abX(DRT)ww@ivB#)k^H89l#)LlrJF%5DO4VtDuiY5< zLZToIjR}cFHyOndq~(<4sJmZ|fnnlv<8Aq}%E{ecbF+gA{Uf1U{{_)AcN|-|)-X${ z%Sz{RXE4J=nzOF1jTa_`l1BxhjWv7Pe$u8uR>0cbqAci8TNqQdkh^y%bPLSIU$wbn zG8dQM86ox~SghCHONs9D2Lt__$V_?b&Z2`VPXXQbcD>Q!qY`b3xjwAEduU;tHR-z9 zI{wImM3u08*Vlddt*oD8JZdlZJ@X!`^mB)ZKWe>vSr9X2MgWv9I#%qklG_yDBttto z`e)A#RSgUbD3r$iP5+uQ=hA||>1dMA$z-xjy=pt6%dlv59q|@aY#?jP%E}H0i)Laz z(N7D{_@QC@DZbl^t#O@P98YB?yHx0llsc3{r$2%{WIu^PXLjPtXnvff#zXmEd8I6^P4j*3akY}Bojcbg%@SI^56d})Q%ocm) zCbv4%MsnBvxRwpjdRiUhh!Vrrzj7ixw!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3vLB{2=o3VaOV544QM6IyR5w(M|Na>MY{ERGu%YuFARJF%&ob=%aR%<0P} zcRl_U)^}TLZ`I0IW!rfcXml+CqAkLEG7o(J%id8j=lM_D%!%cV9d**l`+U_V&)>>Z z5c~av#OFCP=l?mqpzUDC56#n?t_O8rnMF~?lD)jCzT-qEGpM(+OpB!}gfD_MSrelxF{pmMTs zYI&ui>FxH!A4QWt+Mc)GTXSBbI3VtF)x&T6rVddJCRq(z7&5OgWHMgbaTfuaUy}&w30$rX{hK&d;so1}dAI*=XV`-uHOU&918!%+Egm zv}CyQE;c%Y+k;!lWFBH@YGq_%Wo)8tU|?lnu>XcYA&Q3F{FKbJ zO57UGwXQe|)Sv;fp|~vFDk-rzRkyS#lOZiLC)G+{U%w=`KtDGzJu^95*C)%&!ZIW* U`}L9KCO|z5p00i_>zopr0NRXYUjP6A diff --git a/app/src/main/res/drawable-xhdpi/ic_brush.png b/app/src/main/res/drawable-xhdpi/ic_brush.png deleted file mode 100644 index 01fde72936487d7f971b0b57d031c0a5c971ec0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 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 diff --git a/app/src/main/res/drawable-xhdpi/ic_tag.png b/app/src/main/res/drawable-xhdpi/ic_tag.png deleted file mode 100644 index 23658b826ab3d16f764df79dbec239aa3e904971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1257 zcmZ{kdsNbA7{_0b#9^MGY+zTylVy(hc?lJA@}nOj!wZrw>tq8Bj5!45a)3HYcTKBP zbev6R8`x%IOl#9L^ESLRH;=8$7B**YiZ-3(x~aAHYya%8J?A{n=RD8ze$RW(d*0_M z7A5ih2rCEx06#%IB1Xx1<38SKtX1R$3G0Kh5-fUK@;N!f}vyfcM-1SM*7+pZU)cuO6>Q-d=8 zUyr+)^DY2hwE_fAHMpjSGIDNa-G6JX zx$7X?QRJMy{=h=a_JxIo{^s4ePM!IE` zV7j-YG$SdzC9@eedVp= zk)SossYDiEm@-}(dmR9c#%=UB(H^-v)oX|)-C+`FNtA#H9M}#Wt;HKy+g@J|GO5*2 zcx-I@=FFvpp#SRD4?+FUY`6haos0WYdxU#MrDHPv?OnzC`&lUXCa6k)wJVMJO- z^%%Ig_qWI5i(-Y=0lgyLiI`pw>aNG+!=3W03WKrmUK6-bQL+CK8HbcUAppDGPG7r@ zGTb=BTH+yf@oh)Ts-CNq$`ob=J`x@$H;Ejo=u>Q0?J8RKpF zO2Ff8I`hr<*i{oQ|-g%rkxJmeI`|xJ7n^adegYUTN zbK~3$xkKY~ql}Ch3Ba+(c$jOaBu!h*KeM?9^!jH3B*kIz8qNa}0KMTo-Q7H;N|g*F zli@uD{l0khQW!A?gCuIvCWap;=uqFR7?Tuu=fiJ;L6PZltJciqGApK6!f{4EK&XA2 zW+>>hhV`=v5-o-E% zuWGj^S)Gi1J?H7bMA{-atihWZ@cQ6=R}Gw3<&v-7j;Q@0Da!DGB3e@5%1VDr{BSy6 zG#slv?et7*w5K^?^iu)f^aI{|AYuCN4}MYVDJ(1u^{%R?VOr%;=r((0*lxaL?eOfZP$&%5_kUX; zxiFqZfV~QO(v2J^pQ{qZs{@2MzHB21*ZN{t_P~y4_1&US*z_xvl5R!Z zt*xz7=xM~~L|DYbQ-p>P?#*Bs!H>Nf&IsN07E?h}(>esm=I98A!Z8cs&$$;bUX%qZ zX$17qjLgj5L6e;$BV(4RZ?~U*i1Q|!<#f@T3-j~6s#UZ#luYR+d{xD~=Bo0Q3g}RC z!unz~aZ?uk#UPv~YhGk51wP#ocG68`AOdFrOHU;=_KxDcBa;5r?wLFeBF>@TTQe;&Bg?V%R!0X; zz@HV3L1AHzEEcOp5hPfy-bm1y11Y>$tTo=tJzb>_i!$koiv2nxlC+USE*zZMu6_{T94%A10iIE7aqj5aW| ze@S)de(2v6mD}Mj3cP+h+cCX)rR!rD$%x?E$3CJ2d`_17 zIj|phc9PS0y{Tp}c6ZH&%UEJ>90J6s{Tkcb+oeQf7QwQ3kvb~FOnh&J#-P8rRSd7? zF~oNOT$z+I;>hdQVgJ;6s_dHM7Pip(6$yXOF}$)oG9S z9^EwI_jrq-0GyyKqG9~7KweM`lR2x}6rpRcu1p}kQd~=EoqYMF4AM!k(BWvJbl$cS zH0$^}5?oI9E8N^+^h zd>!sw-uNU!;>7idHt_B5491ctUTfREs#$A1x5S{EcZk{7aiLXE<>GYW}GE^E94T<+uW`-T&+}=%v;9 z`FRQ&=b(UW*HlxpPknfIrcFAb?bMIq{eqBrsa!=F5+Yr@?Y<^}X7wbP`@AXB`y46c z2H_05YR)k+ykF!qN>vV^0SpdXY=&=$D31m-#yxq ze8J3GS&6~a_);XJh1wIsNUG7d&L#_M8yZ%2p{4Uxe3;fcDul*+_xe0~R0lcp7&tm) zEI%i{O-MdgthdsrF5ylr;2>dV4`Z6S8~3Byz4!^+Hmepk%GqiyRr!#Ki`-0}+u*Tt zYC{zh7{M&TYM5Y28PEjpM?6yNAAGG(kNhP0i@sHBa^>Y}_{@(krKL7AS`WEX zQ&W37at+KsEU!Ba;|rp;l)&E}jo_eEYFKwjY@)Ln;K@ACPRGhEiv-`2^nRn zp8AiRm+52X+-O~Je|yOIF9L&Sc(frwUzxE(q===i|1}@GadFPK+#pU~nCE+%bAT>$ zdB44Ak-|z*$<}728yOovMIw>yqZqDH_hFS(p+o(Bk+a=yc0=YiI8!?Lk)%;EDgN1X zqix-z>3-1xL|SBk7{CO(pMb&QFeaua_v45-0`UN09~Mi*V)wk9dipHnFz){g zSXs{TVu8WW6QW|y5dHn40x;~zU=SG03?LdC8%KwR8;AOx38pbHp~tat6g=&qWA*7d Pu?E=NI+E^M`zHMhq^F4_ diff --git a/app/src/main/res/drawable-xxhdpi/ic_account_group.png b/app/src/main/res/drawable-xxhdpi/ic_account_group.png deleted file mode 100644 index 2080d107314741269dc5383d9ef61a065f7ba66f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2439 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 R76WmB^C=HfGcowezX5PCHI)DW diff --git a/app/src/main/res/drawable-xxhdpi/ic_book_open.png b/app/src/main/res/drawable-xxhdpi/ic_book_open.png deleted file mode 100644 index fc7ea0d5763b96ac36d8c0744271cfbfa51ddb7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3u(Y>l#gm%Y$QK1QGoVDRLe*xCy(OUk5rj~x~`G;ikJ((lr*JoAl=XYc&|T;R~o z-TddyowJME{V$ZeYHwVz(M+4-@5d8616CMs-lTJS``WP8^))qrbhr8`o8EZ+b=KpL zKT6-{~-Jbn7~^JmwromcDj?bzdwm#;KMHTW&x zEbLUVWL{xjQjhECR|65{ySU z6xK#_II8wy1Ra2{o!5vkA31rsM+{tU6a{c`$w)n*dY3E&Sl;qe9Q~3UuXAf zg?B9*g+ONM>@H>~KNP_UH$Jso^vGO;FefCdkZoT&Ptx4i_I6J2-`DjAu04Er`BlWL zm7Vcdh0ji%S-Y}tDWBteF#GDaT-}D<{Abq05hW>!C8<`)MX5lF!N|bSQrEyl*T_7?(A3Jv#LC!2+rYrez+nFk zfkG4wx%nxXX_dG&oNHZi7N|i3WJ7UTx>ZtQajI@^;dfB^si diff --git a/app/src/main/res/drawable-xxhdpi/ic_brush.png b/app/src/main/res/drawable-xxhdpi/ic_brush.png deleted file mode 100644 index 2a5a71a24b92806b58e0417bc75f4b04ce2c5dbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1576 zcmZ{kc~DbV6vpo(gani&b*T$&*oj&okf<0m2^u7+Dk#uF8bBRL5fBL=s054#8NmSd*-kstKYC}*{mr>|zH{c>nfqmWxI1cV zZO{S$Xge_(o(O}!237;v$ApQt2-J_-yV(O!m9t_o7>(o**VAz~5clZ6MG}Khrl%VK z$z}k+JODl;NAMc}5{Ljy1pz=20`P5|sA=C$gfU(1qE>gsZBqV7y{U{`&|^nZ*v(Qq z$O^mIYv%X6yY50OHPRmi5!d|#r!yr1@RZl)t1Qr;84f+fk-iXk^WuSMs=&HMGfqbu znV|jf^LpB#WP%geC!Y&#>0ml6867C|yCWWtUI0XeZO@qW_Q67xN`<0zSVKKQCaLV! z-ckk;aCw%y{ma7qL;b_= zDTEJ@Nhb#AJ(CA?m{4HX1wd!y-_Lf61_Me6F8HFPnB_ugmvjLmzF#hEM`N9-@KASH z%|wDni5QLE)FO>!2OJ3sQTvsEXEMQo36v(bxH`pP67tH|ZMTJWlxKt*PaUXwZGh5= z30X_uzCgdA_J)AxJAuO!C~ItSO$vP$G)XXI9X-qfd;=OY!apU_MXyjlq4|X=^k2ZS zJl*hb48%%ETdm!fT6_X-kYHBpTvA_vOQ6d}cn>1|@+(y2aQ_6X%PsrWnX( zVZS@uMiieaAi_QINe65$2J|Q3H4Sy3>5rj6_eY3C!|M zGHl;~yF;8UXZl};WuyYybF!mUVJ}CDwa$fa}bKPUUzix)s zb5hJ6`s9dvCvTY9`JsvBcEnd;%A5CU6?Jt5)(*|ggiCqpc~SNgoFvPu&ci%WvAXOA z%XfkB8!sad)YQ~$>=NbH5{#11^Z!_SQc7(`^+nbufmmjsP%l;>nP_B|^Y{voJ?^tV zrSIcPQkJV3*J6Xk=%~Lw?!nr=v9oQ#I}Uv}YCQh4$`zKc;KZ0-!pS&6SsM>G@kz~U zNHG^1+LGvOL2ZN28%!XSos)xF%4_X%9G$}ATl}AHfhrV5l?+Bk5lG{ErybJAB`vF& z3^&9f11l}zkcV>BR-``nI*>>tYYf}X?JY0xMKSd%7qVY#TQ6%|DwW394=uq3w3TDi zpG>-5JRcrTD3Pw(xeAr%T;{s1@RXn+aAqz!79|XwEbiZGP-3@FqM4ovRS!%%GCu0y z4Ann`zS~yV-G;nWTRXdSI3{%uBlxBM0P@}ZMkbW4WK~09cUUa$*^h?huXE*1^;2_A z6^d8=npTOGkE_csdTpLNt=9r)z8MW7&T~$lR2f8W3Lbmw=W?^RvA(kMeWAQ53tSV_ zV#AhCg@sMdmQJh8KcrO2Wipw4mCqssqhx46qGr zF4@k>w$tWckNMki+?9CI7WKV36~_)D?q?eB;1ho&IG#lb<**O{8>00N3nJOVX1ka5 zR*KD53W>OdNTd*nr3V5J{YSu#JrWU?^#1}W_O%QV5WaTc9zRM63Ffja5;zecEFzjk pv9hv?XUAEwgO5gpMp-0=ZfD036MU7Hu6>9GI61g8#Jhvi{seJDvPu8| diff --git a/app/src/main/res/drawable-xxhdpi/ic_gender_female.png b/app/src/main/res/drawable-xxhdpi/ic_gender_female.png deleted file mode 100644 index f2cb86632c6f391a0ddb881df37b2160fa66fbb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2250 zcmZ{l2~d+s7RNhW0U=c4r~?R2hzQD+5Tihl`;!DE2q+PW2qb_U;gDNUi3bqI2r42V zAQ}b6<(B&j6mp7?VG)9&oGKt7lR@Ry{hZpZJ*u{=UjOQKzyIs5>gxBB9PBBmEh<|8 z04Q53hsnyo^JGSp5e%ubmNZKM%2VVwJf&eD5#~g(0wsN_v#^6@QJrW2#ApJ* zxdy-*yu_ISAc6qEM-KqV836nol3nk32;Puk9;HAq;jwDn5C=mpgnB9rCiO3~=?*Xh z0D0XOvOE#}dLi4LeO#p08P_}&5Npd#CE%Odes}QEll2s}DJKv$PwMgf{FmQ#(nhQs zOp7kgj8slP33g*Rf7Bk;j=&#stjgOK!DOoBonv=aY}Q^NfG1HIHtY1HAL%h zK>+=%{MEr6lPE#5%_9`xTre9O6N#3sJBIb4?D1?0T8vCKLEM6a?Df-ol0L~#$Y^X$ z>Kqyx`ZgJ!caY95L{fpu(`QuzK8!4MEdw{KlGABTPj_>Akcqm zeof`3oo3ZYP4M?u6aJkZyd3+2fm{hNW+ynI{eEA1j}YCz1UyV&FpX3%eR=uhc>Zr@ z7&4MQCfGE>Y0gig%k81K9xq}Au*m8)G&H0P`bVg5+v29lmjy10N4Z9om6b1x=!Nq9 zH7Em7?!wM6_=*F*^m9;UZGHWkYq`rtJ)=%1?Rl{WA!CRXhzC+dOpLgb#bSMbLNCQWjfZX3%-$R>N3$yqgOqSyRdjUeLfZ2YpNa(%o0I%`LF7@ zI7-EwtO19s$S|d}&E*Uxqwl7t3orLNNJaIGmrT_o#L*XI!LFKLE!!%}y7NBx>`gnO zhg)mWPT+Q=s2USzs&|M`7Hx86!@+3Bihf_ahT$NU5qi z(D24QlyQ~o?2tS7EVALEH75b3tg2f1f(Df=N<&H>b?a(sYJucUe$dpHm__#CSVOdd z)R(rpuu>dzYqhTb;9Nu}QtNF8foGP57RiU=6jnMu)(NNO>x(DWeXCsWrWWOV4Z<=N z%d%&bSPfFX!{`Chf?~pHcPuwUQn&PCc;s^@i?$|4|0oKYzt(e5y+6cge$9W%vUQ^D z7tAuF9n0(vRKq1a_paIxU;_JV*y_+<+5{)E80;*Ng;pkOTEtfB&r6n zRVh}Q{qZ>XqjYw5_7vvg?s@t(;q-dfr;`9!o8>MZyG8YSJhHkQt{uYZSUGk{9@;T1 zBH|10S?OD1tEM18R8kf0R^t{cY0)wzR#k|%l21GGo^BWlUu9u-nSt!qodVRI;3Cly>e&qA z)G4``L-*adMwhv_63+`2Fvimxi?7)9uC`eBpnf^gY@^x|BU6Qp294?6Uiw{B{RLE} zYjO2&b8AEv+nh>7V2r_rHGNu=dWiymYByB8)%L#COUN**lj?j;OwJ3Rirk)g$=P6A zx^|i?LFomtqg9bkc{_P@faIQ=lT%grvOalUyd3w~X`isQwbcNuY!9DBtuB(jeuBPv zYNi?^B}%Pa{cppS{6}{n@Z2R@gb!kEDiPyXM01<9qHmWeLgh01L%SBIvw!j7scG=V zG~Yc?W2+-Gt;jtXu#%k5n_4k_4b4VwDlyvd$DM-U)CRS#0~+LznYnuIr6k> zL`+o*!KbFCF1nZsy@+u)i^ZO3I?9>NBU%ujgYLbO8jloi{?qyV#;heMr`b6sF!#YF z#BE0zs*N&M*_-2a=U-0d{SoBw!#>GvZioM82M+sp>y!P!zF_~bfLm-d|gcfGn`Tr6G27CGWod5rVa&x_Q zSg`lU31N|E$xP2MZ@q|6Kj7oX_9o-;`0&6Ge4yu9KURQV4BgJt+ab_VBP_QL)&SeX L_E3qH$CZBoStOPA`(PlQBi^g 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 UCGUKAa4X^g0$vDL=^roq8$v~~<^TWy diff --git a/app/src/main/res/drawable-xxhdpi/ic_translate.png b/app/src/main/res/drawable-xxhdpi/ic_translate.png deleted file mode 100644 index 49d105a10bba3b5141a2192f3ffb3ea34b81dbc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 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 OHNe6I3zZvt-1|3b9sH00 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_account_star.png b/app/src/main/res/drawable-xxxhdpi/ic_account_star.png deleted file mode 100644 index 2fa56e165a0930806bb8e9dccc1962a0e6839fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3138 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_book_open.png b/app/src/main/res/drawable-xxxhdpi/ic_book_open.png deleted file mode 100644 index db93452789c1e14c0a7903918c90b1cb88afd224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY6fSOtu7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_tJ9o-U3d6}R5rvCUTw6=`@_{7z-f_KqJ> znZgUA0$rk5KDI0EJan{-VWG&iSrse0_1X>3ZYjY7-@(b;w}H$1kh&S6qKx&fa`bUFnnKwAA-A zZqB{Z{lO>H{qe^i@u7cLhiJWh`{oVLx-Y*n*~3;}t*)F`zjRfoV5HaH0++e7BdaSb ze|m1dX*2H`YcT7EjTMl-ZOgA0eaK-^C{+ZdU)*B^3h%K zYI$~ccD}5foZWnrf+U8mQEL^IqF07DU;p;;)vK)kFJ8P@km2xfcU5um=f5`R<(J1X zu5%CFzcOs~_pWW?Yz1Xy+f?U#&Tm#V{=F$9*`%RrZ{7DtS@PSR*Ivw+k|e!|k*ED| z`=Q z+h4B;(X#h3_6uFUpRGZj<$(;Ng*(GJ!G>aj%sW3M16N;_ds6u??^WdJXS|KO`gsohqt6 zy7aXIY0LhFb#{E8o0#{m%Sndex!) z3r=_c+q+*(ma=7S5$Fp(FSa=~4annFIKAoa72#t!sgd8@-@L!bFzf8IjU6&e=9#29 zhyKsme*6ECZK8Et68*>hgZyPSC#LNe%hl#taQ*e$&J#{|CA(J#U%hWV_uS`2Z-w`> zzxe*!e&)^YE8PdOttEKa?ER%C_};20Dl&?TkI(OOTg>nJr0&(#gsN4$man@1{@pu1 z^}g9f^$Vlc*6At5&$#LJ>gd85Gv}s7ev4jxwMtFtXX@kiUrOT_U(}d8Z(dzmnzYiU zWvkxL1m%-&ztjS@u>-wd?FB<#hA4kI3Mv3pOI#yL zQW8s2t&)pUffR$0fuW_Yfr+k>d5EE@m63^+v5B^Uft7*5{u=^?C>nC}Q!>*kacel& zy5cNQg9gZk;<9wBq{QM>-O{2=hP2F_R4aXb{gT`Q{oKU#%;aoclW^DaagTe~DWM4f;3giQ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_brush.png b/app/src/main/res/drawable-xxxhdpi/ic_brush.png deleted file mode 100644 index fa47de51aa6e227400ffac84154c5b20bc875865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2030 zcmZ`)eK?crAHTOzW9_VkWEXATLM3CQmY10)45=2Ul-NjF5@m>tDT$7=oDN1x62fUZ zIZ5PYl<0U8r`68!lB2GS#8&*sOZ*=F*B|G(uKWHxpYQkcdG71JpZofLGxqqn<26Z| z002D817ag6TprjJ$o$xe+lheMF_&E~0NlHbTi~iA92L!WXM(CO{ZWKaLOj^J07%$? zm{I|lLqft40Ai>BeBb~;&jUa=>RSC?2PCl~*vlP45P4=@A0;E85#`|@jiAT3;r1-t z2~pi;K`y>$ddCNzM{0-auT&``V{;?wTZJW-rPu>vkMe<&wD1Cku^*v{xTVbOu70NO zmVgCXW`U{_4V6{Xk)I=Ssz=LCfL zvnyasrKOUqS@PP#b zYkMJ?cHJkL%wKK6V9;BS4cm2AJFPb`Xw>6xj(28&`qtg0Y;xx1%R%@M2Mfk|Z!9?r zZTlo!g|c7_cxxg=)^>lHJojF;OrFRPB7NZf140~fM~5(Mp}QyZi%^^6#nM=gnXr~) z^Cp&w3{BMylQe<{3YgdDy6s_?eT@+<&82~ zkeC*OHH)|Of`G=-r%XiH>==Th49TB%Ad(td6i8X54h+1#e!xsRQl-FxuS&r!@9!mQBd@OV7Og69d9UYy`BLXIQhfu5~J^18u?gv>47ba>(#& ziO*wr467Du7Q&CazK0#4Ys>WJH?)DWH78Y*ld$5}}Ih4>03*fU4=aAuq)c|)zI}F|qoS`;jr9XLUFB0WRzD8$Md^h& z?zV#T&*S6cT~etOhT&E6(`9vabsu_exi{9-)F|weDt7b?VTd}E8!yPeZywVpZZ{+d z!s6p+RfyqCqp7*LbEReHoDp&^#C|n?T%3}1`=t_t-LY`CfHK!J*5$v(3Mc&J)7&fQ69G8F@!oxb zFB|Tae85IQ^0d6!e_C2x4#^iz-6{c)tm@S6Y0075gSK7dO_d_>DCXp){F*MZ8S<_t zDX6|yFuH{FX=XmZK3v|7f%Kr9qjS}qdd?M|H0xl@r4ef zT6>DZm94F<br2pI$D7xs8AGOOaw6{poGnpm9@T=IxJJ19Ew7Em9r*bNx8O zu6VfSPgn~n&dy${571|7SIpt|nXkss)G8X8Qrrlx+Am_IhruQ|z^HiaLBvvTe}AH1 z;Xhj6w}@{YqkPbLqboS7Wj^VK^e|KY&I9}-Tz)7$VHN)(2J__=qGONIgSpY6mNBP!;3)4zDBa4+ niXRbW6~R5m3kkQh+qyH#?S!|_quh~KhzGEC`ao4o&bj{s2 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gender_female.png b/app/src/main/res/drawable-xxxhdpi/ic_gender_female.png deleted file mode 100644 index 6b0c3dcd290174ba9a6f061e8a62c0e4383ef92e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2856 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gender_male.png b/app/src/main/res/drawable-xxxhdpi/ic_gender_male.png deleted file mode 100644 index d7251b2b2fbcd7271fdb96bcf7c987c60999fbcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3131 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_tag.png b/app/src/main/res/drawable-xxxhdpi/ic_tag.png deleted file mode 100644 index d6804b4574843f6879cde655a93b3f920acf6827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2306 zcmZ`*dpy%$A3wXGwG?wpsWBre*$|pb#@r^Q)lVZd%4KXCR$0V1DWsoEN$ru4kczG< zB2(#yCPFtETffMnghpazzF?rOO)aMnPc!v7|`KVZz=$HvayO_CD=#AG2ER&^(#F&?C9_JV0Z&?)EE|} z0x$<{JA3`@oKf(c;nh{lSYp*qnDsGm{p6x&YY-!a9{uqN zt+|**kUqsU)oS4`OvFZ@Qj=~!?*Ab4YwW18 z8y71szdCc|tsSJlB;~*AhqSYby@Ro}?;~rL)&@jBmYK&+FlY{Ykw{8Xo0XIXVmJfHI25v$~Wp)e?!7ZW@aY0TZ>-Mf}D9$ zw1?i%EZ$$fp-7W9>7#~Lp_eggUPma{b&hOY_;Au@FWEsS+T)9}g|W4xZ4_g5!k=I; zR&aswRrQg>=s@#8KW@ymQt6W^7u z;SaU8wi5bgFAr>Pu)w8iv*3~@Z(F55VMrZzmA16BtOXtXalbu?#1TQiE`f3*Z!RO< zU#uXhbIB6*>6G-fXi{y$^!KmlH|()^NLnTt7wbh0?x4NPWBe6W<}2+#~fELyWKS zJ+iyLH`;Np>*d>L@fJ0t9wX74k8w!{(uX&kSWthEC7eBd%?qN0IP%DLb_wbb7F)G# zn~Fc0HB=UTT4SfpVE6M`xl<;%{H3POv_l+teuu`p3X~brq^$0!aZY-`$hPp`uG;JP zzPlP48Vlk8i+4tMVqz(sHOlc_(+gEGZQ4sungYSOLY$6H1uD=`1S}ghYx=}uu{JO- z_@1{ZCX&)A7+YwT%jFfNnoK`G!Jop+Q}aa3CE;@ZcO^BbQYMoPMurV}% zC7Hr8OgS9e_%s!cgx~tYR;uy2yaw-@nl>T{PEaZXiiNCCRG%zsmm{DYj zhj}Q+y1<5B*5wQC>;neFCxp|Qnay$SVH0leEpo?DXR@=CUx~N=Bl;$99W4*OM+uwg z!WN{S-C>SoqCOj;;M6reEi@@BSChFn-syk&5k9UZB_-Ft2<8zhf5n`*opBuAyD@n0 z-aZY`oA>241T|7=V;ZlGy3Mq$pNZ|B27P=JmIDBC*!~)PMyk8T|!;r+@yTqSy0jN z1b{C@Rku7*-|+aB^a$&=sf?{^1jFMyt8Z0R6`o-@y_~gQJ&j2p#t_cVqvaxc<&KV` zt;t4o1FnkI=7RQO=0;yy3g3r*Y>SP}k@b;Vs@Cy;)4SKVBj2xJrIkEswHGU<`uh5G zV%j3NUa5K=fi5jA)k;VEvxaU()%1=(8r-#|bO*81<)I8^y0*&%NA$wMR#BHJj_AUW zp_H@OT9`V+)*lF$FO#Ry;~tbmk(Am_pjz=$SFCib+)G@NR{aBk&5G2)e9wLbTWCN_ zNhq;P6yXpcSK4@0-I0|GAdlNre;Fzt1Jcp#Q!AJzpz|^A>KaE@B@mfmlvPx|%+1di z0qJw{O$m#TC<;LUmOxPJU~9`985>K+>E?@e&p?AnknH8tejRQ6Ohr!(v{a+ZVM86X zTt-``uCOJ7oHZB@2G83DM8`0krFfnX5Cvj5SUhhx5IJBt%kVrV5WzXBcwPVyC1E(r z@huR58gTE|I_9V&z&w#>kf`s11V25b^cklYXdw2IGG?5Vm4Mh&>ObS;rUVvqi*MaJ zh;zERr_#Nt`N#2PSkQNtm6%xHE9c**OCw>K5`dbUU8``9^c*`;NH9m_IV2Xlqruq= z`dAst0bb`Nv>ygPOh!Q7xHG7D+mM*BA@j(Z-V5a)b2S~-0iIXNvH72c+!}uYq4$KE zx%j|PXvc(OrSFXj?{`~0or^Z+{*gG4Of#LT|038WR&*vW3Wc)-^+LldyUx>%NPz=a zvmeTGb`m^Uyker diff --git a/app/src/main/res/drawable-xxxhdpi/ic_translate.png b/app/src/main/res/drawable-xxxhdpi/ic_translate.png deleted file mode 100644 index 078e846a0cddf8b9d82f21fe30fc5538b4d28827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3596 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 W*v_|yl%Rrez + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/account_star.xml b/app/src/main/res/drawable/account_star.xml new file mode 100644 index 00000000..dc8e4492 --- /dev/null +++ b/app/src/main/res/drawable/account_star.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/book_open.xml b/app/src/main/res/drawable/book_open.xml new file mode 100644 index 00000000..66c81594 --- /dev/null +++ b/app/src/main/res/drawable/book_open.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/brush.xml b/app/src/main/res/drawable/brush.xml new file mode 100644 index 00000000..87b7c4c3 --- /dev/null +++ b/app/src/main/res/drawable/brush.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gender_female.xml b/app/src/main/res/drawable/gender_female.xml new file mode 100644 index 00000000..6620153b --- /dev/null +++ b/app/src/main/res/drawable/gender_female.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gender_male.xml b/app/src/main/res/drawable/gender_male.xml new file mode 100644 index 00000000..eb3750bb --- /dev/null +++ b/app/src/main/res/drawable/gender_male.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag.xml b/app/src/main/res/drawable/tag.xml new file mode 100644 index 00000000..47689267 --- /dev/null +++ b/app/src/main/res/drawable/tag.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/translate.xml b/app/src/main/res/drawable/translate.xml new file mode 100644 index 00000000..f357ae5f --- /dev/null +++ b/app/src/main/res/drawable/translate.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index e3ce7e65..f427226b 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -118,11 +118,17 @@ - + app:floatingSearch_close_search_on_keyboard_dismiss="true" + tools:ignore="NewApi" /> \ No newline at end of file From 8f5d612ee08a43b7b6ab71d2630cde1f654c38b1 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 16:55:56 +0900 Subject: [PATCH 20/24] Migrate to vector image --- app/build.gradle | 2 +- .../java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt | 4 ++-- .../main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt | 5 ++--- app/src/main/res/drawable/ic_gender_female_white.xml | 8 -------- app/src/main/res/drawable/ic_gender_male_white.xml | 8 -------- 5 files changed, 5 insertions(+), 22 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_gender_female_white.xml delete mode 100644 app/src/main/res/drawable/ic_gender_male_white.xml diff --git a/app/build.gradle b/app/build.gradle index a9fbf7d9..7f83f0bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ android { minSdkVersion 16 targetSdkVersion 29 versionCode 53 - versionName "4.18-alpha1" + versionName "4.18-alpha2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt index c795763c..c2886904 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -221,12 +221,12 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri "male" -> { setChipBackgroundColorResource(R.color.material_blue_700) setTextColor(ContextCompat.getColor(context, android.R.color.white)) - ContextCompat.getDrawable(context, R.drawable.ic_gender_male_white) + ContextCompat.getDrawable(context, R.drawable.gender_male) } "female" -> { setChipBackgroundColorResource(R.color.material_pink_600) setTextColor(ContextCompat.getColor(context, android.R.color.white)) - ContextCompat.getDrawable(context, R.drawable.ic_gender_female_white) + ContextCompat.getDrawable(context, R.drawable.gender_female) } else -> null } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt index 06c87882..548c3aec 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt @@ -18,7 +18,6 @@ package xyz.quaver.pupil.ui.dialog -import android.app.Activity import android.app.Dialog import android.content.Context import android.content.Intent @@ -170,12 +169,12 @@ class GalleryDialog(context: Context, private val glide: RequestManager, private "male" -> { setChipBackgroundColorResource(R.color.material_blue_700) setTextColor(ContextCompat.getColor(context, android.R.color.white)) - ContextCompat.getDrawable(context, R.drawable.ic_gender_male_white) + ContextCompat.getDrawable(context, R.drawable.gender_male) } "female" -> { setChipBackgroundColorResource(R.color.material_pink_600) setTextColor(ContextCompat.getColor(context, android.R.color.white)) - ContextCompat.getDrawable(context, R.drawable.ic_gender_female_white) + ContextCompat.getDrawable(context, R.drawable.gender_female) } else -> null } diff --git a/app/src/main/res/drawable/ic_gender_female_white.xml b/app/src/main/res/drawable/ic_gender_female_white.xml deleted file mode 100644 index 6620153b..00000000 --- a/app/src/main/res/drawable/ic_gender_female_white.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_gender_male_white.xml b/app/src/main/res/drawable/ic_gender_male_white.xml deleted file mode 100644 index a6e1a428..00000000 --- a/app/src/main/res/drawable/ic_gender_male_white.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file From 318d6f9b5214a1b5ce2c8d145f1b4e3dd28b3a7d Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 17:31:46 +0900 Subject: [PATCH 21/24] User ID added for crash analysis --- app/src/main/java/xyz/quaver/pupil/Pupil.kt | 12 +++++++++ .../pupil/ui/fragment/SettingsFragment.kt | 25 +++++++++++++------ .../xyz/quaver/pupil/util/download/Cache.kt | 8 ++++-- .../pupil/util/download/DownloadWorker.kt | 2 +- app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/root_preferences.xml | 6 ++++- 8 files changed, 47 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index 54b1b78c..1a723eec 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -31,10 +31,12 @@ 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.crashlytics.FirebaseCrashlytics import xyz.quaver.proxy import xyz.quaver.pupil.util.Histories import xyz.quaver.pupil.util.getProxy import java.io.File +import java.util.* class Pupil : MultiDexApplication() { @@ -48,6 +50,16 @@ class Pupil : MultiDexApplication() { override fun onCreate() { val preference = PreferenceManager.getDefaultSharedPreferences(this) + val userID = + if (preference.getString("user_id", "").isNullOrEmpty()) { + UUID.randomUUID().toString().also { + preference.edit().putString("user_id", it).apply() + } + } else + preference.getString("user_id", "") ?: "" + + FirebaseCrashlytics.getInstance().setUserId(userID) + proxy = getProxy(this) try { diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt index 29eb39b3..d975355d 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt @@ -19,11 +19,11 @@ package xyz.quaver.pupil.ui.fragment import android.Manifest -import android.content.Intent -import android.content.SharedPreferences +import android.content.* import android.content.pm.PackageManager import android.os.Build import android.os.Bundle +import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDelegate import androidx.core.app.ActivityCompat @@ -53,11 +53,7 @@ class SettingsFragment : Preference.OnPreferenceChangeListener, SharedPreferences.OnSharedPreferenceChangeListener { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - PreferenceManager.getDefaultSharedPreferences(requireContext()).registerOnSharedPreferenceChangeListener(this) - } + lateinit var sharedPreference: SharedPreferences override fun onResume() { super.onResume() @@ -202,6 +198,12 @@ class SettingsFragment : activity?.startActivityForResult(intent, REQUEST_IMPORT_OLD_GALLERIES_OLD) } } + "user_id" -> { + (context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager).setPrimaryClip( + ClipData.newPlainText("user_id", sharedPreference.getString("user_id", "")) + ) + Toast.makeText(context, R.string.settings_user_id_toast, Toast.LENGTH_SHORT).show() + } else -> return false } } @@ -247,6 +249,9 @@ class SettingsFragment : override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.root_preferences, rootKey) + sharedPreference = PreferenceManager.getDefaultSharedPreferences(requireContext()) + sharedPreference.registerOnSharedPreferenceChangeListener(this) + initPreferences() } @@ -293,7 +298,7 @@ class SettingsFragment : onPreferenceClickListener = this@SettingsFragment } "default_query" -> { - summary = PreferenceManager.getDefaultSharedPreferences(requireContext()).getString("default_query", "") ?: "" + summary = sharedPreference.getString("default_query", "") ?: "" onPreferenceClickListener = this@SettingsFragment } @@ -337,6 +342,10 @@ class SettingsFragment : "old_import_galleries" -> { onPreferenceClickListener = this@SettingsFragment } + "user_id" -> { + summary = sharedPreference.getString("user_id", "") + onPreferenceClickListener = this@SettingsFragment + } } } diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt index 3b78315b..deb4c25c 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt @@ -259,8 +259,12 @@ class Cache(context: Context) : ContextWrapper(context) { it.createNewFile() } - FileOutputStream(cache).use { - it.write(data) + try { + FileOutputStream(cache).use { + it.write(data) + } + } catch (e: Exception) { + cache.delete() } } diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt index 63226ab6..bb3ea7b2 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt @@ -296,7 +296,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont val callback = object : Callback { override fun onFailure(call: Call, e: IOException) { Log.i("PUPILD", "FAIL ${call.request().tag()} (${e.message})") - if (e.message != "Canceled") + if (e.message?.contains("cancel", true) != true) FirebaseCrashlytics.getInstance().recordException(e) progress[galleryID]?.set(i, Float.NaN) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3ad95d3d..067f2789 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -148,4 +148,6 @@ キャッシュを使用しないため、ダウンロードできません (Korean only) (Korean only) + ユーザーID + ユーザーIDをクリップボードにコピーしました \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d7c72021..d036521d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -148,4 +148,6 @@ 캐시를 활성화 해야 다운로드를 진행할 수 있습니다 아청법 대응 옵션 추가 경찰서 정모 확률을 줄여보고자 캐시 비활성화/태그 필터를 추가하였습니다. 적용하시겠습니까? + 유저 ID + 유저 ID를 클립보드에 복사했습니다 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 96ba80c2..7a2109f6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -183,6 +183,8 @@ Restore failed %1$d entries restored Import old galleries + User ID + User ID is copied to clipboard diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 234899ce..dff10800 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -107,6 +107,10 @@ app:key="old_import_galleries" app:title="@string/settings_import_old_galleries"/> + + - + \ No newline at end of file From ccd84c91f6944b712e26dbf3c50a287bb0ab60f3 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 17:40:03 +0900 Subject: [PATCH 22/24] Retry 5 times when failed --- .../java/xyz/quaver/pupil/util/download/DownloadWorker.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt index bb3ea7b2..587a51c8 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt @@ -151,7 +151,13 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont val interceptor = Interceptor { chain -> val request = chain.request() - val response = chain.proceed(request) + var response = chain.proceed(request) + + var retry = 5 + while (!response.isSuccessful && retry > 0) { + response = chain.proceed(request) + retry-- + } response.newBuilder() .body(response.body()?.let { From 841c8a7a1512cdfbc1c7cb41263f7010be9e6808 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 18:12:46 +0900 Subject: [PATCH 23/24] Download Retry Button Added --- app/build.gradle | 2 +- .../java/xyz/quaver/pupil/adapters/ReaderAdapter.kt | 10 ++++++++++ .../main/java/xyz/quaver/pupil/ui/ReaderActivity.kt | 10 ++++++++++ app/src/main/res/drawable/refresh.xml | 8 ++++++++ app/src/main/res/layout/activity_reader.xml | 7 +++++++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 5 ++++- 8 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/refresh.xml diff --git a/app/build.gradle b/app/build.gradle index 7f83f0bf..415b38c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ android { minSdkVersion 16 targetSdkVersion 29 versionCode 53 - versionName "4.18-alpha2" + versionName "4.18" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt index 5869043e..7baadcac 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -25,7 +25,9 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.RequestManager import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.google.android.material.snackbar.Snackbar import com.google.firebase.crashlytics.FirebaseCrashlytics +import kotlinx.android.synthetic.main.activity_reader.view.* import kotlinx.android.synthetic.main.item_reader.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -116,6 +118,14 @@ class ReaderAdapter(private val glide: RequestManager, .load(R.drawable.image_broken_variant) .into(holder.view.image) + Snackbar.make(holder.view.reader_layout, R.string.reader_error_retry, Snackbar.LENGTH_INDEFINITE).apply { + setAction(android.R.string.no) { } + setAction(android.R.string.yes) { + downloadWorker!!.cancel(galleryID) + downloadWorker!!.queue.add(galleryID) + } + }.show() + return } else { holder.view.reader_item_progressbar.progress = diff --git a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt index 14306eea..7681698f 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt @@ -337,6 +337,16 @@ class ReaderActivity : AppCompatActivity() { } } + with(reader_fab_retry) { + setImageResource(R.drawable.refresh) + setOnClickListener { + DownloadWorker.getInstance(context).let { + it.cancel(galleryID) + it.queue.add(galleryID) + } + } + } + with(reader_fab_fullscreen) { setImageResource(R.drawable.ic_fullscreen) setOnClickListener { diff --git a/app/src/main/res/drawable/refresh.xml b/app/src/main/res/drawable/refresh.xml new file mode 100644 index 00000000..cfa890d9 --- /dev/null +++ b/app/src/main/res/drawable/refresh.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index 303eb3bc..dba09170 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -75,6 +75,13 @@ app:fab_label="@string/reader_fab_download" app:fab_size="mini"/> + + (Korean only) ユーザーID ユーザーIDをクリップボードにコピーしました + ダウンロードエラーが発生しました。リトライしますか? + リトライ \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d036521d..4db9f32a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -150,4 +150,6 @@ 경찰서 정모 확률을 줄여보고자 캐시 비활성화/태그 필터를 추가하였습니다. 적용하시겠습니까? 유저 ID 유저 ID를 클립보드에 복사했습니다 + 다운로드 에러가 발생했습니다. 재시도 하시겠습니까? + 재시도 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a2109f6..3028ed1a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -116,13 +116,16 @@ Loading Go to page - Fullscreen + Fullscreen> + Retry Background download Cancel background download Downloading… Download complete Download error + Download Error occurred. Retry? + Help From 68c7a383906b40fd103b9923a172a9cd93ab7cb2 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 21 Jun 2020 18:19:13 +0900 Subject: [PATCH 24/24] Several fixes --- app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt | 2 +- app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt index 7baadcac..d008e837 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -118,7 +118,7 @@ class ReaderAdapter(private val glide: RequestManager, .load(R.drawable.image_broken_variant) .into(holder.view.image) - Snackbar.make(holder.view.reader_layout, R.string.reader_error_retry, Snackbar.LENGTH_INDEFINITE).apply { + Snackbar.make(holder.view.reader_layout, R.string.reader_error_retry, Snackbar.LENGTH_SHORT).apply { setAction(android.R.string.no) { } setAction(android.R.string.yes) { downloadWorker!!.cancel(galleryID) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt index 5c11e63d..144ec79d 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt @@ -148,7 +148,7 @@ class LockActivity : AppCompatActivity() { val promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle(getText(R.string.settings_lock_fingerprint_prompt)) .setSubtitle(getText(R.string.settings_lock_fingerprint_prompt_subtitle)) - .setNegativeButtonText("Cancel") + .setNegativeButtonText(getText(android.R.string.cancel)) .setConfirmationRequired(false) .build() diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4db9f32a..e4321f2c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -143,7 +143,7 @@ 지문 잠금은 다른 잠금 방식이 활성화 되어 있을 때만 사용 가능합니다 Pupil 지문 인식™ 힘세고 강한 지문 인식 - 히익 페도 + 판사님 저는 페도가 아닙니다 캐시 비활성화 캐시를 활성화 해야 다운로드를 진행할 수 있습니다 아청법 대응 옵션 추가