Added download list

Added history search
This commit is contained in:
tom5079
2019-05-19 16:40:28 +09:00
parent fd83f987dd
commit f326c69902
15 changed files with 173 additions and 119 deletions

View File

@@ -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}"

View File

@@ -42,19 +42,33 @@ import kotlin.collections.ArrayList
class MainActivity : AppCompatActivity() {
enum class Mode {
SEARCH,
HISTORY,
DOWNLOAD
}
private val galleries = ArrayList<Pair<GalleryBlock, Deferred<String>>>()
private var query = ""
private var mode = Mode.SEARCH
private val SETTINGS = 45162
private var galleryIDs: Deferred<List<Int>>? = 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<SearchInputView>(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 }
}
}
}
}
}
}

View File

@@ -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)

View File

@@ -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()
}
}

View File

@@ -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<Preference>("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)

View File

@@ -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

View File

@@ -38,9 +38,7 @@ class ReaderAdapter(private val images: List<String>) : RecyclerView.Adapter<Rea
val image = BitmapFactory.decodeFile(images[position], options)
launch(Dispatchers.Main) {
setImageBitmap(image)
}
post { setImageBitmap(image) }
}
}
}

View File

@@ -31,7 +31,7 @@ class GalleryDownloader(
_notify: Boolean = false
) : ContextWrapper(base) {
var notify: Boolean = false
var download: Boolean = false
set(value) {
if (value) {
field = true
@@ -67,7 +67,7 @@ class GalleryDownloader(
initNotification()
reader = CoroutineScope(Dispatchers.IO).async {
notify = _notify
download = _notify
val json = Json(JsonConfiguration.Stable)
val serializer = ReaderItem.serializer().list
val preference = PreferenceManager.getDefaultSharedPreferences(this@GalleryDownloader)
@@ -138,7 +138,7 @@ class GalleryDownloader(
.setProgress(reader.size, index, false)
.setContentText("$index/${reader.size}")
if (notify)
if (download)
notificationManager.notify(galleryBlock.id, notificationBuilder.build())
async(Dispatchers.IO) {
@@ -188,10 +188,10 @@ class GalleryDownloader(
.setContentText(getString(R.string.reader_notification_complete))
.setProgress(0, 0, false)
if (notify)
if (download)
notificationManager.notify(galleryBlock.id, notificationBuilder.build())
notify = false
download = false
}
remove(galleryBlock.id)
@@ -219,7 +219,7 @@ class GalleryDownloader(
}
fun invokeOnNotifyChanged() {
onNotifyChangedHandler?.invoke(notify)
onNotifyChangedHandler?.invoke(download)
}
private fun initNotification() {

View File

@@ -20,10 +20,6 @@ class Histories(private val file: File) : ArrayList<Int>() {
}
}
companion object {
lateinit var default: Histories
}
@UseExperimental(ImplicitReflectionSerializer::class)
fun load() : Histories {
return apply {

View File

@@ -1,6 +1,5 @@
package xyz.quaver.pupil.util
import kotlinx.io.IOException
import kotlinx.serialization.json.*
import java.net.URL

View File

@@ -10,6 +10,10 @@
<item android:id="@+id/main_drawer_history"
android:title="@string/main_drawer_history"
android:icon="@drawable/ic_history"/>
<item android:id="@+id/main_drawer_downloads"
android:title="@string/main_drawer_downloads"
android:icon="@drawable/ic_download"/>
</group>
<item android:title="@string/main_drawer_group_contact_title">

View File

@@ -52,4 +52,5 @@
<string name="reader_notification_error">ダウンロードエラー</string>
<string name="reader_fab_download_cancel">バックグラウンドダウンロード中止</string>
<string name="main_dialog_delete">このギャラリーを削除</string>
<string name="main_drawer_downloads">ダウンロード</string>
</resources>

View File

@@ -52,4 +52,5 @@
<string name="reader_notification_error">다운로드 오류</string>
<string name="reader_fab_download_cancel">백그라운드 다운로드 취소</string>
<string name="main_dialog_delete">갤러리 삭제</string>
<string name="main_drawer_downloads">다운로드</string>
</resources>

View File

@@ -30,6 +30,7 @@
<string name="main_drawer_home">Home</string>
<string name="main_drawer_history">History</string>
<string name="main_drawer_downloads">Downloads</string>
<string name="main_drawer_group_contact_title">Contact</string>
<string name="main_drawer_group_contact_help">Help</string>
<string name="main_drawer_group_contact_homepage">Visit homepage</string>

View File

@@ -20,6 +20,7 @@ allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
maven {
url "s3://finotescore-android/release"
credentials(AwsCredentials) {