From 043f7bedd82498abe4c6f2773349dacff7f9d364 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 30 Aug 2019 15:24:51 +0900 Subject: [PATCH] Added quick download/delete --- app/build.gradle | 4 +- .../pupil/adapters/GalleryBlockAdapter.kt | 55 ++- .../quaver/pupil/adapters/ReaderAdapter.kt | 28 -- .../java/xyz/quaver/pupil/ui/GalleryDialog.kt | 11 +- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 46 +++ app/src/main/res/layout/activity_lock.xml | 36 +- app/src/main/res/layout/item_galleryblock.xml | 326 ++++++++++-------- 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 | 4 + 10 files changed, 325 insertions(+), 199 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 00058f24..190565d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,7 +26,7 @@ android { } buildTypes.each { it.buildConfigField('boolean', 'PRERELEASE', 'false') - it.buildConfigField('boolean', 'CENSOR', 'false') + it.buildConfigField('boolean', 'CENSOR', 'true') } } kotlinOptions { @@ -56,6 +56,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.android.support:multidex:1.0.3' + implementation "com.daimajia.swipelayout:library:1.2.0@aar" implementation 'com.google.android.material:material:1.1.0-alpha09' implementation 'com.google.firebase:firebase-core:17.1.0' implementation 'com.google.firebase:firebase-perf:19.0.0' @@ -67,7 +68,6 @@ dependencies { transitive = false } implementation 'com.andrognito.patternlockview:patternlockview:1.0.0' - implementation 'com.jsibbold:zoomage:1.3.0' implementation "ru.noties.markwon:core:${markwonVersion}" kapt 'com.github.bumptech.glide:compiler:4.9.0' testImplementation 'junit:junit:4.12' 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 415913db..41b2b8e6 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -31,6 +31,9 @@ import androidx.vectordrawable.graphics.drawable.Animatable2Compat import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import com.bumptech.glide.RequestManager import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.daimajia.swipe.SwipeLayout +import com.daimajia.swipe.adapters.RecyclerSwipeAdapter +import com.daimajia.swipe.interfaces.SwipeAdapterInterface import com.google.android.material.chip.Chip import kotlinx.android.synthetic.main.item_galleryblock.view.* import kotlinx.coroutines.CoroutineScope @@ -45,6 +48,7 @@ import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R import xyz.quaver.pupil.types.Tag +import xyz.quaver.pupil.util.GalleryDownloader import xyz.quaver.pupil.util.Histories import xyz.quaver.pupil.util.getCachedGallery import xyz.quaver.pupil.util.wordCapitalize @@ -54,7 +58,7 @@ import kotlin.collections.ArrayList import kotlin.collections.HashMap import kotlin.concurrent.schedule -class GalleryBlockAdapter(private val glide: RequestManager, private val galleries: List>>) : RecyclerView.Adapter() { +class GalleryBlockAdapter(private val glide: RequestManager, private val galleries: List>>) : RecyclerSwipeAdapter(), SwipeAdapterInterface { enum class ViewType { NEXT, @@ -64,7 +68,7 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri private lateinit var favorites: Histories - inner class GalleryViewHolder(val view: CardView) : RecyclerView.ViewHolder(view) { + inner class GalleryViewHolder(val view: View) : RecyclerView.ViewHolder(view) { fun bind(item: Pair>) { with(view) { val resources = context.resources @@ -276,6 +280,8 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri val completeFlag = SparseBooleanArray() val onChipClickedHandler = ArrayList<((Tag) -> Unit)>() + var onDownloadClickedHandler: ((Int) -> Unit)? = null + var onDeleteClickedHandler: ((Int) -> Unit)? = null var showNext = false var showPrev = false @@ -301,8 +307,47 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - if (holder is GalleryViewHolder) - holder.bind(galleries[position-(if (showPrev) 1 else 0)]) + if (holder is GalleryViewHolder) { + val gallery = galleries[position-(if (showPrev) 1 else 0)] + + holder.bind(gallery) + + with(holder.view.galleryblock_primary) { + setOnClickListener { + holder.view.performClick() + } + setOnLongClickListener { + holder.view.performLongClick() + } + } + + holder.view.galleryblock_download.setOnClickListener { + onDownloadClickedHandler?.invoke(position) + } + + holder.view.galleryblock_delete.setOnClickListener { + onDeleteClickedHandler?.invoke(position) + } + + mItemManger.bindView(holder.view, position) + + holder.view.galleryblock_swipe_layout.addSwipeListener(object: SwipeLayout.SwipeListener { + override fun onStartOpen(layout: SwipeLayout?) { + mItemManger.closeAllExcept(layout) + + holder.view.galleryblock_download.text = when(GalleryDownloader.get(gallery.first.id)) { + null -> holder.view.context.getString(R.string.main_download) + else -> holder.view.context.getString(R.string.main_cancel_download) + } + } + + override fun onClose(layout: SwipeLayout?) {} + override fun onHandRelease(layout: SwipeLayout?, xvel: Float, yvel: Float) {} + override fun onOpen(layout: SwipeLayout?) {} + override fun onStartClose(layout: SwipeLayout?) {} + override fun onUpdate(layout: SwipeLayout?, leftOffset: Int, topOffset: Int) {} + }) + } } override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) { @@ -328,4 +373,6 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri else -> ViewType.GALLERY }.ordinal } + + override fun getSwipeLayoutResourceId(position: Int) = R.id.galleryblock_swipe_layout } \ No newline at end of file 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 9b4781a8..10e42f86 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -18,18 +18,13 @@ package xyz.quaver.pupil.adapters -import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.RequestManager -import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.load.engine.GlideException -import com.bumptech.glide.request.RequestListener -import com.bumptech.glide.request.target.Target import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.R import xyz.quaver.pupil.util.getCachedGallery @@ -40,7 +35,6 @@ class ReaderAdapter(private val glide: RequestManager, private val images: List) : RecyclerView.Adapter() { var isFullScreen = false - private var prev : Drawable? = null class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) @@ -64,29 +58,7 @@ class ReaderAdapter(private val glide: RequestManager, .apply { if (BuildConfig.CENSOR) override(5, 8) - if (isFullScreen) - placeholder(prev) } - .listener(object: RequestListener { - override fun onLoadFailed( - e: GlideException?, - model: Any?, - target: Target?, - isFirstResource: Boolean - ) = false - - override fun onResourceReady( - resource: Drawable?, - model: Any?, - target: Target?, - dataSource: DataSource?, - isFirstResource: Boolean - ): Boolean { - prev = resource?.constantState?.newDrawable()?.mutate() - - return false - } - }) .into(holder.view) } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/GalleryDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/GalleryDialog.kt index 37d6ff9e..6accdeb9 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/GalleryDialog.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/GalleryDialog.kt @@ -22,19 +22,14 @@ import android.app.Dialog import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.Gravity import android.view.LayoutInflater import android.view.View -import android.widget.ImageView -import android.widget.LinearLayout import android.widget.LinearLayout.LayoutParams import androidx.core.content.ContextCompat -import androidx.gridlayout.widget.GridLayout import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide -import com.bumptech.glide.RequestManager import com.google.android.material.chip.Chip import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.dialog_galleryblock.* @@ -45,6 +40,7 @@ import xyz.quaver.hitomi.Gallery import xyz.quaver.hitomi.GalleryBlock import xyz.quaver.hitomi.getGallery import xyz.quaver.hitomi.getGalleryBlock +import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.GalleryBlockAdapter @@ -114,7 +110,10 @@ class GalleryDialog(context: Context, private val galleryID: Int) : Dialog(conte Glide.with(context) .load(gallery.thumbnails.firstOrNull()) - .into(gallery_thumbnail) + .apply { + if (BuildConfig.CENSOR) + override(5, 8) + }.into(gallery_thumbnail) addDetails(gallery) addThumbnails(gallery) 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 24fcc389..86569dba 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -535,6 +535,52 @@ class MainActivity : AppCompatActivity() { loadBlocks() } } + onDownloadClickedHandler = { position -> + val galleryID = galleries[position].first.id + + if (!completeFlag.get(galleryID, false)) { + val downloader = GalleryDownloader.get(galleryID) + + if (downloader == null) + GalleryDownloader(context, galleryID, true).start() + else { + downloader.cancel() + downloader.clearNotification() + } + } + + closeAllItems() + } + + onDeleteClickedHandler = { position -> + val galleryID = galleries[position].first.id + + CoroutineScope(Dispatchers.Default).launch { + with(GalleryDownloader[galleryID]) { + this?.cancelAndJoin() + this?.clearNotification() + } + val cache = File(cacheDir, "imageCache/${galleryID}") + val data = getCachedGallery(context, galleryID) + cache.deleteRecursively() + data.deleteRecursively() + + downloads.remove(galleryID) + + if (this@MainActivity.mode == Mode.DOWNLOAD) { + runOnUiThread { + cancelFetch() + clearGalleries() + fetchGalleries(query, sortMode) + loadBlocks() + } + } + + completeFlag.put(galleryID, false) + } + + closeAllItems() + } } ItemClickSupport.addTo(this) .setOnItemClickListener { _, position, v -> diff --git a/app/src/main/res/layout/activity_lock.xml b/app/src/main/res/layout/activity_lock.xml index 4aab2840..00cd2898 100644 --- a/app/src/main/res/layout/activity_lock.xml +++ b/app/src/main/res/layout/activity_lock.xml @@ -29,7 +29,29 @@ android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@id/lock_button_layout"/> + app:layout_constraintBottom_toTopOf="@id/lock_fingerprint_layout"/> + + + + + + @@ -59,16 +81,6 @@ app:backgroundTint="@color/dark_gray" app:fabSize="mini"/> - - + android:clipChildren="true"> - - - - - - - - - - - - - - - - - - - - - - - - - - - + app:drag_edge="right" + app:show_mode="pull_out"> + android:id="@+id/galleryblock_secondary" + android:layout_width="wrap_content" + android:layout_height="match_parent"> + android:layout_height="match_parent" + android:padding="8dp" + android:gravity="center" + android:background="@android:color/holo_blue_dark" + android:textColor="@android:color/white" + android:text="@string/main_download" + android:foreground="?attr/selectableItemBackground" + android:focusable="true" + android:clickable="true"/> - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 f9356dd4..cd3270c6 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -99,7 +99,10 @@ タグ サムネイル おすすめ - イメージを隠す - イメージをギャラリーから見えなくする + イメージをギャラリーから見えなくする + イメージを隠す ヘルプ + 削除 + ダウンロード + キャンセル \ 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 6b01b3ee..7a261d1f 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -99,7 +99,10 @@ 태그 관련 갤러리 미리보기 - 이미지 숨기기 - 갤러리에서 이미지 검색이 되지 않도록 합니다 + 갤러리에서 이미지 검색이 되지 않도록 합니다 + 이미지 숨기기 도움말 + 삭제 + 다운로드 + 취소 \ 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 40eb0bf9..e444f882 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -71,6 +71,10 @@ Open Folder Error occurred during export + DOWNLOAD + CANCEL + DELETE + Update available Download started Downloading apk…