From 161d1bdcdd753117f9f329e64d80a9f206c27b0c Mon Sep 17 00:00:00 2001 From: tom5079 Date: Mon, 13 May 2019 20:07:42 +0900 Subject: [PATCH] History functionality added --- .idea/misc.xml | 2 +- app/build.gradle | 3 + .../java/xyz/quaver/pupil/GalleryActivity.kt | 2 - .../java/xyz/quaver/pupil/MainActivity.kt | 184 ++++++++++-------- .../java/xyz/quaver/pupil/SettingsActivity.kt | 41 +++- .../java/xyz/quaver/pupil/util/history.kt | 74 +++++++ .../main/res/drawable-anydpi/ic_history.xml | 10 + app/src/main/res/drawable-anydpi/ic_home.xml | 10 + app/src/main/res/drawable-hdpi/ic_history.png | Bin 0 -> 585 bytes app/src/main/res/drawable-hdpi/ic_home.png | Bin 0 -> 279 bytes app/src/main/res/drawable-mdpi/ic_history.png | Bin 0 -> 366 bytes app/src/main/res/drawable-mdpi/ic_home.png | Bin 0 -> 222 bytes .../main/res/drawable-xhdpi/ic_history.png | Bin 0 -> 700 bytes app/src/main/res/drawable-xhdpi/ic_home.png | Bin 0 -> 314 bytes .../main/res/drawable-xxhdpi/ic_history.png | Bin 0 -> 1057 bytes app/src/main/res/drawable-xxhdpi/ic_home.png | Bin 0 -> 395 bytes .../main/res/menu/activity_main_drawer.xml | 12 +- app/src/main/res/values-ja/strings.xml | 7 +- app/src/main/res/values-ko/strings.xml | 7 +- app/src/main/res/values/strings.xml | 8 +- app/src/main/res/xml/root_preferences.xml | 8 +- .../java/xyz/quaver/pupil/ExampleUnitTest.kt | 5 +- 22 files changed, 274 insertions(+), 99 deletions(-) create mode 100644 app/src/main/java/xyz/quaver/pupil/util/history.kt create mode 100644 app/src/main/res/drawable-anydpi/ic_history.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_home.xml create mode 100644 app/src/main/res/drawable-hdpi/ic_history.png create mode 100644 app/src/main/res/drawable-hdpi/ic_home.png create mode 100644 app/src/main/res/drawable-mdpi/ic_history.png create mode 100644 app/src/main/res/drawable-mdpi/ic_home.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_history.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_home.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_history.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_home.png diff --git a/.idea/misc.xml b/.idea/misc.xml index 84da703c..7631aec3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 66bcddaa..405be41f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,6 +19,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + kotlinOptions { + freeCompilerArgs += '-Xuse-experimental=kotlin.Experimental' + } } dependencies { diff --git a/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt b/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt index 92dfe9c5..00cbf6e8 100644 --- a/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt @@ -11,11 +11,9 @@ import kotlinx.coroutines.* import xyz.quaver.hitomi.Reader import xyz.quaver.hitomi.getReader import xyz.quaver.hitomi.getReferer -import xyz.quaver.hiyobi.hiyobi import xyz.quaver.pupil.adapters.GalleryAdapter import java.io.File import java.io.FileOutputStream -import java.lang.Exception import java.net.URL import javax.net.ssl.HttpsURLConnection diff --git a/app/src/main/java/xyz/quaver/pupil/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/MainActivity.kt index d24131e3..5e4042b2 100644 --- a/app/src/main/java/xyz/quaver/pupil/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/MainActivity.kt @@ -15,7 +15,6 @@ import android.os.Environment import android.preference.PreferenceManager import android.text.* import android.text.style.AlignmentSpan -import android.util.Log import android.view.View import android.view.WindowManager import androidx.appcompat.app.AlertDialog @@ -37,6 +36,7 @@ import kotlinx.coroutines.* import xyz.quaver.hitomi.* import xyz.quaver.pupil.adapters.GalleryBlockAdapter import xyz.quaver.pupil.types.TagSuggestion +import xyz.quaver.pupil.util.Histories import xyz.quaver.pupil.util.SetLineOverlap import xyz.quaver.pupil.util.checkUpdate import xyz.quaver.pupil.util.getApkUrl @@ -45,13 +45,16 @@ import javax.net.ssl.HttpsURLConnection class MainActivity : AppCompatActivity() { - private val PERMISSION_REQUEST_CODE = 4585 + private val permissionRequestCode = 4585 private val galleries = ArrayList>() - private var isLoading = false private var query = "" + private var galleryIDs: Deferred>? = null + private var loadingJob: Job? = null + override fun onCreate(savedInstanceState: Bundle?) { + Histories.default = Histories(File(cacheDir, "histories.json")) super.onCreate(savedInstanceState) window.setFlags( @@ -75,15 +78,33 @@ class MainActivity : AppCompatActivity() { setProgressViewOffset(false, 0, resources.getDimensionPixelSize(R.dimen.progress_view_offset)) setOnRefreshListener { - runBlocking { - cleanJob?.join() + CoroutineScope(Dispatchers.Main).launch { + cancelFetch() + clearGalleries() + fetchGalleries(query) + loadBlocks() } - fetchGalleries(query, true) } } main_nav_view.setNavigationItemSelectedListener { - Log.d("Pupil", it.itemId.toString()) + CoroutineScope(Dispatchers.Main).launch { + main_drawer_layout.closeDrawers() + + cancelFetch() + clearGalleries() + when(it.itemId) { + R.id.main_drawer_home -> { + query = query.replace("HISTORY", "") + fetchGalleries(query) + } + R.id.main_drawer_history -> { + query += "HISTORY" + fetchGalleries(query) + } + } + loadBlocks() + } true } @@ -91,6 +112,7 @@ class MainActivity : AppCompatActivity() { setupRecyclerView() setupSearchBar() fetchGalleries(query) + loadBlocks() } override fun onBackPressed() { @@ -113,7 +135,7 @@ class MainActivity : AppCompatActivity() { setPositiveButton(android.R.string.ok) { _, _ -> } }.show() else - ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE) + ActivityCompat.requestPermissions(this, permissions, permissionRequestCode) } } @@ -183,6 +205,8 @@ class MainActivity : AppCompatActivity() { //TODO: Maybe sprinke some transitions will be nice :D startActivity(intent) + + Histories.default.add(galleryID) } } addOnScrollListener( @@ -192,9 +216,9 @@ class MainActivity : AppCompatActivity() { val layoutManager = recyclerView.layoutManager as LinearLayoutManager - if (!isLoading) + if (loadingJob?.isActive != true) if (layoutManager.findLastCompletelyVisibleItemPosition() == galleries.size) - fetchGalleries(query) + loadBlocks() } } ) @@ -311,7 +335,9 @@ class MainActivity : AppCompatActivity() { if (query != this@MainActivity.query) { this@MainActivity.query = query - fetchGalleries(query, true) + cancelFetch() + clearGalleries() + fetchGalleries(query) } } }) @@ -320,94 +346,96 @@ class MainActivity : AppCompatActivity() { } } - private val cache = ArrayList() - private var currentFetchingJob: Job? = null - private var cleanJob: Job? = null - private fun cancelFetch() { - isLoading = false - runBlocking { - cleanJob?.join() - currentFetchingJob?.cancelAndJoin() + galleryIDs?.cancelAndJoin() + loadingJob?.cancelAndJoin() } } - private fun fetchGalleries(query: String, clear: Boolean = false) { + private fun clearGalleries() { + galleries.clear() + + main_recyclerview.adapter?.notifyDataSetChanged() + + main_noresult.visibility = View.INVISIBLE + main_progressbar.show() + main_swipe_layout.isRefreshing = false + } + + private fun fetchGalleries(query: String, from: Int = 0) { val preference = PreferenceManager.getDefaultSharedPreferences(this) val perPage = preference.getString("per_page", "25")?.toInt() ?: 25 val defaultQuery = preference.getString("default_query", "")!! - if (clear) { - cancelFetch() - cleanJob = CoroutineScope(Dispatchers.Main).launch { - cache.clear() - galleries.clear() + galleryIDs = null - main_recyclerview.adapter?.notifyDataSetChanged() - - main_noresult.visibility = View.INVISIBLE - main_progressbar.show() - main_swipe_layout.isRefreshing = false - } - } - - if (isLoading) + if (galleryIDs?.isActive == true) return - isLoading = true + galleryIDs = CoroutineScope(Dispatchers.IO).async { + when { + query.contains("HISTORY") -> + Histories.default.toList() + query.isEmpty() and defaultQuery.isEmpty() -> + fetchNozomi(start = from, count = perPage) + else -> + doSearch("$defaultQuery $query") + } + } + } - currentFetchingJob = CoroutineScope(Dispatchers.IO).launch { - try { - val galleryIDs: List + private fun loadBlocks() { + val preference = PreferenceManager.getDefaultSharedPreferences(this) + val perPage = preference.getString("per_page", "25")?.toInt() ?: 25 + val defaultQuery = preference.getString("default_query", "")!! - cleanJob?.join() + loadingJob = CoroutineScope(Dispatchers.IO).launch { + val galleryIDs = galleryIDs?.await() - if (query.isEmpty() && defaultQuery.isEmpty()) - galleryIDs = fetchNozomi(start = galleries.size, count = perPage) - else { - if (cache.isEmpty()) - cache.addAll(doSearch("$defaultQuery $query")) - - galleryIDs = cache.slice(galleries.size until Math.min(galleries.size + perPage, cache.size)) - - with(main_recyclerview.adapter as GalleryBlockAdapter) { - noMore = galleries.size + perPage >= cache.size - } + if (galleryIDs.isNullOrEmpty()) { //No result + withContext(Dispatchers.Main) { + main_noresult.visibility = View.VISIBLE + main_progressbar.hide() } - if (query.isNotEmpty() and defaultQuery.isNotEmpty() and cache.isNullOrEmpty()) { + return@launch + } + + if (query.isEmpty() and defaultQuery.isEmpty()) + fetchGalleries("", galleries.size+perPage) + else + with(main_recyclerview.adapter as GalleryBlockAdapter) { + noMore = galleries.size + perPage >= galleryIDs.size + } + + when { + query.isEmpty() and defaultQuery.isEmpty() -> + galleryIDs + else -> + galleryIDs.slice(galleries.size until Math.min(galleries.size+perPage, galleryIDs.size)) + }.chunked(4).forEach { chunked -> + chunked.map { + async { + val galleryBlock = getGalleryBlock(it) + val thumbnail: Bitmap + + with(galleryBlock.thumbnails[0].openConnection() as HttpsURLConnection) { + thumbnail = BitmapFactory.decodeStream(inputStream) + } + + Pair(galleryBlock, thumbnail) + } + }.forEach { + val galleryBlock = it.await() + withContext(Dispatchers.Main) { - main_noresult.visibility = View.VISIBLE main_progressbar.hide() + + galleries.add(galleryBlock) + main_recyclerview.adapter?.notifyItemInserted(galleries.size - 1) } } - - galleryIDs.chunked(4).forEach { chunked -> - chunked.map { - async { - val galleryBlock = getGalleryBlock(it) - val thumbnail: Bitmap - - with(galleryBlock.thumbnails[0].openConnection() as HttpsURLConnection) { - thumbnail = BitmapFactory.decodeStream(inputStream) - } - - Pair(galleryBlock, thumbnail) - } - }.forEach { - val galleryBlock = it.await() - - withContext(Dispatchers.Main) { - main_progressbar.hide() - - galleries.add(galleryBlock) - main_recyclerview.adapter?.notifyItemInserted(galleries.size - 1) - } - } - } - } finally { - isLoading = false } } } diff --git a/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt index 40624e27..b9d95dda 100644 --- a/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt @@ -7,6 +7,8 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import xyz.quaver.pupil.util.Histories +import java.io.File class SettingsActivity : AppCompatActivity() { @@ -35,8 +37,8 @@ class SettingsActivity : AppCompatActivity() { "TB" //really? ) - private fun getCacheSize() : String { - var size = context!!.cacheDir.walk().map { it.length() }.sum() + private fun getCacheSize(dir: File) : String { + var size = dir.walk().map { it.length() }.sum() var suffixIndex = 0 while (size >= 1024) { @@ -50,22 +52,43 @@ class SettingsActivity : AppCompatActivity() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.root_preferences, rootKey) - with(findPreference("delete_cache")) { + with(findPreference("delete_image_cache")) { this ?: return@with - summary = getCacheSize() + val dir = File(context.cacheDir, "imageCache") + + summary = getCacheSize(dir) setOnPreferenceClickListener { AlertDialog.Builder(context).apply { setTitle(R.string.warning) setMessage(R.string.settings_clear_cache_alert_message) setPositiveButton(android.R.string.yes) { _, _ -> - with(context.cacheDir) { - if (exists()) - deleteRecursively() - } + if (dir.exists()) + dir.deleteRecursively() - summary = getCacheSize() + summary = getCacheSize(dir) + } + setNegativeButton(android.R.string.no) { _, _ -> } + }.show() + + true + } + } + with(findPreference("clear_history")) { + this ?: return@with + + val histories = Histories.default + + summary = getString(R.string.settings_clear_history_summary, histories.size) + + setOnPreferenceClickListener { + AlertDialog.Builder(context).apply { + setTitle(R.string.warning) + setMessage(R.string.settings_clear_history_alert_message) + setPositiveButton(android.R.string.yes) { _, _ -> + histories.clear() + summary = getString(R.string.settings_clear_history_summary, histories.size) } setNegativeButton(android.R.string.no) { _, _ -> } }.show() diff --git a/app/src/main/java/xyz/quaver/pupil/util/history.kt b/app/src/main/java/xyz/quaver/pupil/util/history.kt new file mode 100644 index 00000000..8ebfaad1 --- /dev/null +++ b/app/src/main/java/xyz/quaver/pupil/util/history.kt @@ -0,0 +1,74 @@ +package xyz.quaver.pupil.util + +import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonConfiguration +import kotlinx.serialization.parseList +import kotlinx.serialization.stringify +import java.io.File + + +class Histories(private val file: File) : ArrayList() { + + init { + if (!file.exists()) + file.parentFile.mkdirs() + + try { + load() + } catch (e: Exception) { + save() + } + } + + companion object { + lateinit var default: Histories + + fun load(file: File) : Histories { + return Histories(file).load() + } + } + + @UseExperimental(ImplicitReflectionSerializer::class) + fun load() : Histories { + return apply { + super.clear() + addAll( + Json(JsonConfiguration.Stable).parseList( + file.bufferedReader().use { it.readText() } + ) + ) + } + } + + @UseExperimental(ImplicitReflectionSerializer::class) + fun save() { + file.writeText(Json(JsonConfiguration.Stable).stringify(this)) + } + + override fun add(element: Int): Boolean { + load() + + if (contains(element)) + super.remove(element) + + super.add(0, element) + + save() + + return true + } + + override fun remove(element: Int): Boolean { + load() + val retval = super.remove(element) + save() + + return retval + } + + override fun clear() { + super.clear() + save() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_history.xml b/app/src/main/res/drawable-anydpi/ic_history.xml new file mode 100644 index 00000000..e5e6c6c8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_history.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_home.xml b/app/src/main/res/drawable-anydpi/ic_home.xml new file mode 100644 index 00000000..08ebbdf2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_home.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable-hdpi/ic_history.png b/app/src/main/res/drawable-hdpi/ic_history.png new file mode 100644 index 0000000000000000000000000000000000000000..8610919f1413b616297be1e99fa10c9be2dfcc64 GIT binary patch literal 585 zcmV-P0=E5$P)ErbA+Lxp(xPOCLq27#Q*VNkbDzJJxv_q z;NZXkw4fG{*kb0;-m>D-f z=8_v#8;}h83{0SQWM%|AkbWeyHjrb8Gm-&+K~X?qIt+lC12z+6K1l`u%aqed4w_ED zGO#+J9tQ&IrX#66O^Rc5kfX}n++3U*4g#5j9CaXjh;>jklBUH(LG<{?)r*a|-d zpu~M5>!tf3^|%}a#J$?u+H4d#hy+L71C|}~I6?@yp1TDMDNl-{jDVwXItErnK-)sE zVS0d-?M9&GiWDVk9F8L77?ipX=#a@kJ-?xPzXKa<_7r7%G)LV9VmUIZ9etp_Lm>Ug zEdsI&MyR9qlj9gIUfOms%bQCWSXh(6-cBMzbC_n-L Xc|PDQ5^yx}00000NkvXXu0mjfL2&Z^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_home.png b/app/src/main/res/drawable-hdpi/ic_home.png new file mode 100644 index 0000000000000000000000000000000000000000..caccfac02413efafdf8b724b579d244449f9b76a GIT binary patch literal 279 zcmV+y0qFjTP)wulZ(n2V~#YmULeENm?0u#tv%7eCP9X2FiWEFS^*iR zU0k4p!s~^ZU!Ws}C(ZN%jTD|V-wSj?;Yl;EKU38f%qm6e}-ZZdp1apY=aF93{-)J><8li1n_>4T2ftY3)J`yYQQTX zt}!$;)YsP5<^f?48zcsm1F3lj(nE^N-$FI6wzjtB#ibS`2T}u7`<5u5AO*{6AeWH{ zH!&hvvLCNXpx2$D3SVM#IY;0;pUKRPQW&7F>tA zLZ4I%pb-zU;5t4FK7kbBidcLWK!XWn!6)=2S&u7?qZ`t&ng9R* M07*qoM6N<$g6*$~*8l(j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_home.png b/app/src/main/res/drawable-mdpi/ic_home.png new file mode 100644 index 0000000000000000000000000000000000000000..1eccf9f3ffdf30ff21d5eb94d6e42541f8c8fb8d GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjOFdm2Ln>}1CrGe{u=E@|cFb0R zCn@-9%7TS!9QLqu{C76&IO`>Pc;&{%|gt9_YP)S*ai)ke3M(i>RfI7U}c{h^3v63)l;`f(Vu>*os9=A$E#3iij!v z0~U&nV)Pr>Vp;btcYC|%o!r0&A-6j--|Xz%>|RStEV0BA%fFIjGTEQY<(7c`Y&Kg1 z9)ULo`dy=EG=|28#_>!hvjFF+z$ftS5;V3-bN|e7M6w76EF*yy^`PJ*S4Eb?`rpsJVVG9ABGLTftNy}rL|rVgI$lz|^9{E-&(HI?CmI5Y1wTt$6$l)8nCqDUn|CDGtSa|5 zLVM8gQYuvmuoBC!!lzR2gr!>)B6008l1c>F+-o6?7FE*cKpCSKHv#Fs1SJNl@yD`o}dVjErGzR(`K#s=;bSJ2uwhX5%596 za=QY+7qABm8cQLMBrF#xGzUBh^Il+QrCFz`yop_s*mRo;ILvfn{08tY=(quj7 zjzBN+^3>r)cS9?bPN!$##Av9l7KK~7?MPnk@`5N&!stchuGb}LHP5bJJ|gvjLv{@l i$xlqN#1cy^O7a5-nKLtD!KaY`0000!a#Ze literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_home.png b/app/src/main/res/drawable-xhdpi/ic_home.png new file mode 100644 index 0000000000000000000000000000000000000000..cea7b6c519081c4d08b14b4d1c6914d52bbea88f GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(Ffw|&IEGZ*dOP(XXS0KV>)C_R z=Q0m0esJ)v*rk@#2=`MSqSq4GGY@RuF4Hu#k>`oRrgwd>wf-Mwb_~DQ-a0>(qe&tC z>`{r&2|s=YJX4t~?4R`O;Q615Pfl;zGb!i0x_-$Yz09AhR^_SOI)8%Owtn)ft(qOz zoAw;IFXDOfda18pTEPTyHoM6!d$xY_b9&5GnfPRLb^PqMis}>GHQR1_?^Cs7{KWKs z@!jMFYN^}g_snd(l(zd|w1h_P7xwds3$|R8-XqGq)c41ON}efZ|C+@O0&cC5w`py> zbgcG+2)ozp4F|h*_Z;n5$iQ_(L*TW&MgtQZ8FDKC9l!jH_|yB1skM3ccz|KT;OXk; Jvd$@?2>|LQiW>j` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_history.png b/app/src/main/res/drawable-xxhdpi/ic_history.png new file mode 100644 index 0000000000000000000000000000000000000000..c22644ebb2577f219008f552e397f7b84c1e2823 GIT binary patch literal 1057 zcmV++1m63JP)%f>^34M7+X6qvr(?B#o^Ei3BWc1Pg0P zu+kzDvEx#9B*5|p|{a*^q+WUR=lG-{)9KcjEszIfkM-o zioe4OU+M1d-j!4iy+iNP7@D%CNw=)=*`x{1JSI0}a4Qedm^vVljy`XzbxQJVtfa8q zs*vH|b`uU+rPv~#DLK%iM6y)6ICtC-*bx)0-jvJbJ+Aa2StK(ix^=kRTBDr=6CdpRiNiH*F>9%rdITA}+RBSc788_8Eit=IIh0oFSNixUXuv)u`!c%5F)f8Jc zywc+-T|iY~MWZ%z9$8gBpC*)>21uj;vOHfHG8x_{B>>fP08m}x8YW$o7Q;CJXxMt`fx(s~t8mzNfJjFPK+7fpT8$E7 zs_wE0kf_h109rK(P-G-9RoB=ANYsy!5m?s*$8DW5=uR}^-G|-)WD%r#s}>~qSyxxr zK5w>|VUX%+wpf6_gKvVjdf}uEfpoV8A9O0_{GOU%C%p*sDM6~G^c6Mm55@Q|P(B>U zJW*^Bq?)0KwjcaF<|wH?I5@aH(^4Y|NDy|%Lih3n#$Hg!{RFwEGc8tiK*BS(ZM87T zIfHM=j+g+@%goyyDv)e~6Y6HRLDtid{Ga&!kQWUz2}onEPb?twXrR}8&#RVe2qfp= z1RL_$T9+!7$_}rZ_F@GefNvE%r>u^B3WY4MlIUA{b_a*PQ|3p{x}=-LnIvy6FK9aR z58%CyEythhFPf3=3!+Wgkin~%AZ5U_n9w)Kk^54F$AZ3Ox#lAPck(k9$m<~&L8zMF)=YQF)=YQ b<%<3RpzHiO>e!Wi00000NkvXXu0mjf8;J3w literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_home.png b/app/src/main/res/drawable-xxhdpi/ic_home.png new file mode 100644 index 0000000000000000000000000000000000000000..a576a1a4e111b2191c668e5991f83e74a21d159a GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2U<~qfaSW-r^>+G3&O-?TZd*5O zE^D09DB>Abz!@w|S z^O{w!7F^CQu~7^P+q8I1wa@zS8G@f|;=6mEdHO{yo_{vVFHl5U@Z!D+ldrw9Ev{W_ zbn|8J9Fx83v!~A4r1Ny<>d)*&m(EqCi50!tb?+2&JWyTP#m&L>Ys)re^IK+Cm6?ZH zR^QBRm}By{@2?2+2IIIt3u*)#u60XK$!EGy^|9$wGsBj+ISc+MF|2)VuTjmi;Oif@ zrwt5S=Ivi#!r}1xC#Tn8hAsDAIR0GC&?7&kp5wp{$DhX;dc>zFvn0$}AY;hzmwjn7 z!x!l(eM}eP1FU!)>>XcPFg#{S72!<&ch*6mNuWi6#W!%m^ZQN^wjzfk2O5(F92N|D ZJD6XEh$b&sH@gNT;OXk;vd$@?2>|rnq2mAm literal 0 HcmV?d00001 diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 71a9e813..1877c34f 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -1,7 +1,15 @@ - + + + + + \ 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 63576ee9..eacd6842 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -7,7 +7,7 @@ 検索 ギャラリー検索 キャッシュ - キャッシュクリア + イメージキャッシュクリア キャッシュをクリアするとイメージのロード速度に影響を与えます。実行しますか? キャッシュサイズ: %1$d%2$s デフォルト検索キーワード @@ -22,4 +22,9 @@ イメージロード ロード速度を向上させるためhiyobi.meからイメージロード hiyobi.meからロード + 履歴の削除 + 履歴を削除しますか? + 履歴数: %1$d + 履歴 + トップ \ 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 85b179fd..e4872bb0 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -6,7 +6,7 @@ 권한을 거부하면 일부 기능이 작동하지 않을 수 있습니다 갤러리 검색 기본 검색어 - 캐시 정리하기 + 이미지 캐시 정리하기 캐시를 정리하면 이미지 로딩속도가 느려질 수 있습니다. 계속하시겠습니까? 현재 캐시 사용량: %1$d%2$s 한 번에 로드할 갤러리 수 @@ -22,4 +22,9 @@ 이미지 로딩 속도 향상을 위해 가능하면 hiyobi.me에서 이미지 로드 hiyobi.me 사용 + 히스토리 삭제 + 히스토리를 삭제하시겠습니까? + 히스토리 %1$d개 저장됨 + 히스토리 + \ 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 473541df..1d165044 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,6 +18,9 @@ Search No result + Home + History + Update available Version %1$s is available!\n(current version is %2$s)\nDo you want to update? Downloading apk… @@ -33,9 +36,12 @@ Galleries per page Default query Cache - Clear cache + Clear image cache Currently using %1$d%2$s of cache Deleting cache can affect image loading speed. Do you want to continue? + Clear history + Do you want to clear histories? + %1$d histories saved Image Loading Use hiyobi.me Load images from hiyobi.me to improve loading speed (if available) diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index a967b6bd..5dbfcadf 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -25,8 +25,12 @@ app:title="@string/settings_cache_title"> + app:title="@string/settings_clear_image_cache" + app:key="delete_image_cache"/> + + diff --git a/app/src/test/java/xyz/quaver/pupil/ExampleUnitTest.kt b/app/src/test/java/xyz/quaver/pupil/ExampleUnitTest.kt index 763e19e4..fec18cac 100644 --- a/app/src/test/java/xyz/quaver/pupil/ExampleUnitTest.kt +++ b/app/src/test/java/xyz/quaver/pupil/ExampleUnitTest.kt @@ -1,7 +1,7 @@ package xyz.quaver.pupil +import kotlinx.serialization.ImplicitReflectionSerializer import org.junit.Test -import xyz.quaver.pupil.util.checkUpdate /** * Example local unit test, which will execute on the development machine (host). @@ -12,8 +12,9 @@ import xyz.quaver.pupil.util.checkUpdate class ExampleUnitTest { @Test + @ImplicitReflectionSerializer fun test() { - print(checkUpdate("https://api.github.com/repos/tom5079/Pupil-issue/releases", "0.0.1")) + } }