From f326c6990206c2bca1ae18b116e60b4f5c693a98 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 19 May 2019 16:40:28 +0900 Subject: [PATCH] Added download list Added history search --- app/build.gradle | 5 +- .../java/xyz/quaver/pupil/MainActivity.kt | 221 +++++++++++------- app/src/main/java/xyz/quaver/pupil/Pupil.kt | 12 +- .../java/xyz/quaver/pupil/ReaderActivity.kt | 20 +- .../java/xyz/quaver/pupil/SettingsActivity.kt | 3 +- .../pupil/adapters/GalleryBlockAdapter.kt | 2 - .../quaver/pupil/adapters/ReaderAdapter.kt | 4 +- .../quaver/pupil/util/GalleryDownloader.kt | 12 +- .../java/xyz/quaver/pupil/util/history.kt | 4 - .../main/java/xyz/quaver/pupil/util/update.kt | 1 - .../main/res/menu/activity_main_drawer.xml | 4 + 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 + build.gradle | 1 + 15 files changed, 173 insertions(+), 119 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3fef32d8..d34d7924 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "xyz.quaver.pupil" minSdkVersion 16 targetSdkVersion 28 - versionCode 5 - versionName "1.4" + versionCode 7 + versionName "2.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -38,6 +38,7 @@ dependencies { implementation 'androidx.preference:preference:1.1.0-alpha05' implementation 'com.google.android.material:material:1.0.0' implementation 'com.github.arimorty:floatingsearchview:2.1.1' + implementation 'com.github.deano2390:MaterialShowcaseView:1.3.4' implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation "ru.noties.markwon:core:${markwonVersion}" diff --git a/app/src/main/java/xyz/quaver/pupil/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/MainActivity.kt index a355b261..94470e8f 100644 --- a/app/src/main/java/xyz/quaver/pupil/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/MainActivity.kt @@ -42,19 +42,33 @@ import kotlin.collections.ArrayList class MainActivity : AppCompatActivity() { + enum class Mode { + SEARCH, + HISTORY, + DOWNLOAD + } + private val galleries = ArrayList>>() private var query = "" + private var mode = Mode.SEARCH private val SETTINGS = 45162 private var galleryIDs: Deferred>? = null private var loadingJob: Job? = null + private lateinit var histories: Histories + private lateinit var downloads: Histories + override fun onCreate(savedInstanceState: Bundle?) { - Histories.default = Histories(File(cacheDir, "histories.json")) super.onCreate(savedInstanceState) + with(application as Pupil) { + this@MainActivity.histories = histories + this@MainActivity.downloads = downloads + } + window.setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS @@ -64,82 +78,13 @@ class MainActivity : AppCompatActivity() { checkUpdate() - main_appbar_layout.addOnOffsetChangedListener( - AppBarLayout.OnOffsetChangedListener { _, p1 -> - main_searchview.translationY = p1.toFloat() - main_recyclerview.translationY = p1.toFloat() - } - ) - - with(main_swipe_layout) { - setProgressViewOffset( - false, - resources.getDimensionPixelSize(R.dimen.progress_view_start), - resources.getDimensionPixelSize(R.dimen.progress_view_offset) - ) - - setOnRefreshListener { - CoroutineScope(Dispatchers.Main).launch { - cancelFetch() - clearGalleries() - fetchGalleries(query) - loadBlocks() - } - } - } - - main_nav_view.setNavigationItemSelectedListener { - CoroutineScope(Dispatchers.Main).launch { - main_drawer_layout.closeDrawers() - - when(it.itemId) { - R.id.main_drawer_home -> { - cancelFetch() - clearGalleries() - query = query.replace("HISTORY", "") - fetchGalleries(query) - } - R.id.main_drawer_history -> { - cancelFetch() - clearGalleries() - query += "HISTORY" - fetchGalleries(query) - } - R.id.main_drawer_help -> { - AlertDialog.Builder(this@MainActivity).apply { - title = getString(R.string.help_dialog_title) - setMessage(R.string.help_dialog_message) - - setPositiveButton(android.R.string.ok) { _, _ -> } - }.show() - } - R.id.main_drawer_github -> { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github)))) - } - R.id.main_drawer_homepage -> { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.home_page)))) - } - R.id.main_drawer_email -> { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.email)))) - } - } - loadBlocks() - } - - true - } - - setupSearchBar() - setupRecyclerView() - fetchGalleries(query) - loadBlocks() + initView() } override fun onBackPressed() { - if (main_drawer_layout.isDrawerOpen(GravityCompat.START)) - main_drawer_layout.closeDrawer(GravityCompat.START) - else if (query.isNotEmpty()) { - runOnUiThread { + when { + main_drawer_layout.isDrawerOpen(GravityCompat.START) -> main_drawer_layout.closeDrawer(GravityCompat.START) + query.isNotEmpty() -> runOnUiThread { query = "" findViewById(R.id.search_bar_text).setText(query, TextView.BufferType.EDITABLE) @@ -148,9 +93,8 @@ class MainActivity : AppCompatActivity() { fetchGalleries(query) loadBlocks() } + else -> super.onBackPressed() } - else - super.onBackPressed() } override fun onResume() { @@ -243,6 +187,91 @@ class MainActivity : AppCompatActivity() { } } + private fun initView() { + main_appbar_layout.addOnOffsetChangedListener( + AppBarLayout.OnOffsetChangedListener { _, p1 -> + main_searchview.translationY = p1.toFloat() + main_recyclerview.translationY = p1.toFloat() + } + ) + + //SwipeRefreshLayout + with(main_swipe_layout) { + setProgressViewOffset( + false, + resources.getDimensionPixelSize(R.dimen.progress_view_start), + resources.getDimensionPixelSize(R.dimen.progress_view_offset) + ) + + setOnRefreshListener { + post { + cancelFetch() + clearGalleries() + fetchGalleries(query) + loadBlocks() + } + } + } + + //NavigationView + main_nav_view.setNavigationItemSelectedListener { + runOnUiThread { + main_drawer_layout.closeDrawers() + + when(it.itemId) { + R.id.main_drawer_home -> { + cancelFetch() + clearGalleries() + query = "" + mode = Mode.SEARCH + fetchGalleries(query) + loadBlocks() + } + R.id.main_drawer_history -> { + cancelFetch() + clearGalleries() + query = "" + mode = Mode.HISTORY + fetchGalleries(query) + loadBlocks() + } + R.id.main_drawer_downloads -> { + cancelFetch() + clearGalleries() + query = "" + mode = Mode.DOWNLOAD + fetchGalleries(query) + loadBlocks() + } + R.id.main_drawer_help -> { + AlertDialog.Builder(this@MainActivity).apply { + title = getString(R.string.help_dialog_title) + setMessage(R.string.help_dialog_message) + + setPositiveButton(android.R.string.ok) { _, _ -> } + }.show() + } + R.id.main_drawer_github -> { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github)))) + } + R.id.main_drawer_homepage -> { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.home_page)))) + } + R.id.main_drawer_email -> { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.email)))) + } + } + } + + true + } + + setupSearchBar() + setupRecyclerView() + fetchGalleries(query) + loadBlocks() + } + private fun setupRecyclerView() { with(main_recyclerview) { adapter = GalleryBlockAdapter(galleries).apply { @@ -281,8 +310,8 @@ class MainActivity : AppCompatActivity() { //TODO: Maybe sprinke some transitions will be nice :D startActivity(intent) - Histories.default.add(gallery.id) - }.setOnItemLongClickListener { recyclerView, position, v -> + histories.add(gallery.id) + }.setOnItemLongClickListener { recyclerView, position, _ -> val galleryBlock = galleries[position].first val view = LayoutInflater.from(this@MainActivity) .inflate(R.layout.dialog_galleryblock, recyclerView, false) @@ -301,7 +330,7 @@ class MainActivity : AppCompatActivity() { val downloader = GalleryDownloader.get(galleryBlock.id) if (downloader == null) { GalleryDownloader(context, galleryBlock, true).start() - Histories.default.add(galleryBlock.id) + downloads.add(galleryBlock.id) } else { downloader.cancel() downloader.clearNotification() @@ -489,13 +518,33 @@ class MainActivity : AppCompatActivity() { return 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") + when(mode) { + Mode.SEARCH -> { + when { + query.isEmpty() and defaultQuery.isEmpty() -> + fetchNozomi(start = from, count = perPage) + else -> + doSearch("$defaultQuery $query") + } + } + Mode.HISTORY -> { + when { + query.isEmpty() -> histories.toList() + else -> { + val result = doSearch(query).sorted() + histories.filter { result.binarySearch(it) >= 0 } + } + } + } + Mode.DOWNLOAD -> { + when { + query.isEmpty() -> downloads.toList() + else -> { + val result = doSearch(query).sorted() + downloads.filter { result.binarySearch(it) >= 0 } + } + } + } } } } diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index 8e1184dd..c4115c85 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -6,17 +6,23 @@ import android.app.NotificationManager import android.content.Context import android.os.Build import android.preference.PreferenceManager -import android.util.SparseArray +import androidx.core.content.ContextCompat import com.finotes.android.finotescore.Fn import com.finotes.android.finotescore.ObservableApplication -import com.finotes.android.finotescore.Severity -import kotlinx.coroutines.Job +import xyz.quaver.pupil.util.Histories +import java.io.File class Pupil : ObservableApplication() { + lateinit var histories: Histories + lateinit var downloads: Histories + override fun onCreate() { val preference = PreferenceManager.getDefaultSharedPreferences(this) + histories = Histories(File(ContextCompat.getDataDir(this), "histories.json")) + downloads = Histories(File(ContextCompat.getDataDir(this), "downloads.json")) + super.onCreate() Fn.init(this) diff --git a/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt index b2022c2b..542921f5 100644 --- a/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt @@ -2,7 +2,6 @@ package xyz.quaver.pupil import android.graphics.drawable.Drawable import android.os.Bundle -import android.util.Log import android.view.* import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -63,7 +62,7 @@ class ReaderActivity : AppCompatActivity() { initView() - if (!downloader.notify) + if (!downloader.download) downloader.start() } @@ -113,7 +112,7 @@ class ReaderActivity : AppCompatActivity() { override fun onDestroy() { super.onDestroy() - if (!downloader.notify) + if (!downloader.download) downloader.cancel() } @@ -159,18 +158,19 @@ class ReaderActivity : AppCompatActivity() { } } onDownloadedHandler = { + val item = it.toList() CoroutineScope(Dispatchers.Main).launch { if (images.isEmpty()) { - images.addAll(it) + images.addAll(item) reader_recyclerview.adapter?.notifyDataSetChanged() } else { - images.add(it.last()) + images.add(item.last()) reader_recyclerview.adapter?.notifyItemInserted(images.size-1) } } } onErrorHandler = { - downloader.notify = false + downloader.download = false } onCompleteHandler = { CoroutineScope(Dispatchers.Main).launch { @@ -184,7 +184,7 @@ class ReaderActivity : AppCompatActivity() { val icon = AnimatedVectorDrawableCompat.create(this, R.drawable.ic_downloading) icon?.registerAnimationCallback(object: Animatable2Compat.AnimationCallback() { override fun onAnimationEnd(drawable: Drawable?) { - if (downloader.notify) + if (downloader.download) fab.post { icon.start() fab.labelText = getString(R.string.reader_fab_download_cancel) @@ -205,7 +205,7 @@ class ReaderActivity : AppCompatActivity() { } } - if (downloader.notify) { + if (downloader.download) { downloader.invokeOnReaderLoaded() downloader.invokeOnNotifyChanged() } @@ -255,9 +255,9 @@ class ReaderActivity : AppCompatActivity() { } reader_fab_download.setOnClickListener { - downloader.notify = !downloader.notify + downloader.download = !downloader.download - if (!downloader.notify) + if (!downloader.download) downloader.clearNotification() } } diff --git a/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt index 9a3c92b0..7f941162 100644 --- a/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt @@ -16,7 +16,6 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import kotlinx.android.synthetic.main.dialog_default_query.view.* import xyz.quaver.pupil.types.Tags -import xyz.quaver.pupil.util.Histories import java.io.File class SettingsActivity : AppCompatActivity() { @@ -99,7 +98,7 @@ class SettingsActivity : AppCompatActivity() { with(findPreference("clear_history")) { this ?: return@with - val histories = Histories.default + val histories = (activity!!.application as Pupil).histories summary = getString(R.string.settings_clear_history_summary, histories.size) 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 08f73716..06ccd862 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -1,8 +1,6 @@ package xyz.quaver.pupil.adapters import android.graphics.BitmapFactory -import android.graphics.PorterDuff -import android.util.Log import android.util.SparseArray import android.util.SparseBooleanArray import android.view.LayoutInflater 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 ea653cf4..a579865e 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -38,9 +38,7 @@ class ReaderAdapter(private val images: List) : RecyclerView.Adapter() { } } - companion object { - lateinit var default: Histories - } - @UseExperimental(ImplicitReflectionSerializer::class) fun load() : Histories { return apply { 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 198c82a2..2c951cbe 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -1,6 +1,5 @@ package xyz.quaver.pupil.util -import kotlinx.io.IOException import kotlinx.serialization.json.* import java.net.URL diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 83737a33..4185cf90 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -10,6 +10,10 @@ + + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6e723198..a625b88c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -52,4 +52,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 ed305722..b46801e1 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -52,4 +52,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 37174abc..8b5eb247 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ Home History + Downloads Contact Help Visit homepage diff --git a/build.gradle b/build.gradle index 2853a5c4..46c39173 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ allprojects { repositories { google() jcenter() + maven { url "https://jitpack.io" } maven { url "s3://finotescore-android/release" credentials(AwsCredentials) {