From 9f9a4c81b36e798529fa90f905e28e74496ae5b2 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 27 Nov 2020 18:15:57 +0900 Subject: [PATCH] migrated to ViewBinding --- app/build.gradle | 9 +- .../pupil/adapters/GalleryBlockAdapter.kt | 318 +++++++++--------- .../quaver/pupil/adapters/MirrorAdapter.kt | 34 +- .../quaver/pupil/adapters/ReaderAdapter.kt | 165 ++++----- .../xyz/quaver/pupil/types/Suggestions.kt | 4 +- .../java/xyz/quaver/pupil/ui/LockActivity.kt | 51 +-- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 77 ++--- .../xyz/quaver/pupil/ui/ReaderActivity.kt | 107 +++--- .../pupil/ui/dialog/DefaultQueryDialog.kt | 52 ++- .../DownloadFolderNameDialogFragment.kt | 60 ++-- .../dialog/DownloadLocationDialogFragment.kt | 80 ++--- .../quaver/pupil/ui/dialog/GalleryDialog.kt | 87 ++--- .../xyz/quaver/pupil/ui/dialog/ProxyDialog.kt | 66 ++-- .../pupil/ui/fragment/PINLockFragment.kt | 40 ++- .../pupil/ui/fragment/PatternLockFragment.kt | 44 ++- .../xyz/quaver/pupil/ui/view/ProgressCard.kt | 26 +- ...ult_query.xml => default_query_dialog.xml} | 24 +- ...me.xml => download_folder_name_dialog.xml} | 0 ...older.xml => download_location_dialog.xml} | 0 ..._folder.xml => download_location_item.xml} | 0 ...{dialog_gallery.xml => gallery_dialog.xml} | 33 +- ...details.xml => gallery_dialog_details.xml} | 4 +- ...or.xml => gallery_dialog_dotindicator.xml} | 2 +- ...ry_details.xml => gallery_dialog_tags.xml} | 4 +- ...galleryblock.xml => galleryblock_item.xml} | 0 .../{activity_lock.xml => lock_activity.xml} | 8 +- .../{activity_main.xml => main_activity.xml} | 7 +- ..._content.xml => main_activity_content.xml} | 20 +- .../{item_mirrors.xml => mirrors_item.xml} | 0 ...mberpicker.xml => numberpicker_dialog.xml} | 10 +- ...ern_lock.xml => pattern_lock_fragment.xml} | 2 +- ...ent_pin_lock.xml => pin_lock_fragment.xml} | 0 ...ogress_card.xml => progress_card_view.xml} | 0 .../{dialog_proxy.xml => proxy_dialog.xml} | 42 +-- ...ctivity_reader.xml => reader_activity.xml} | 15 +- .../{item_reader.xml => reader_item.xml} | 0 ...e_pageturn.xml => swipe_pageturn_view.xml} | 0 37 files changed, 688 insertions(+), 703 deletions(-) rename app/src/main/res/layout/{dialog_default_query.xml => default_query_dialog.xml} (82%) rename app/src/main/res/layout/{dialog_download_folder_name.xml => download_folder_name_dialog.xml} (100%) rename app/src/main/res/layout/{dialog_download_folder.xml => download_location_dialog.xml} (100%) rename app/src/main/res/layout/{item_download_folder.xml => download_location_item.xml} (100%) rename app/src/main/res/layout/{dialog_gallery.xml => gallery_dialog.xml} (82%) rename app/src/main/res/layout/{dialog_gallery_details.xml => gallery_dialog_details.xml} (92%) rename app/src/main/res/layout/{dialog_gallery_dotindicator.xml => gallery_dialog_dotindicator.xml} (95%) rename app/src/main/res/layout/{item_gallery_details.xml => gallery_dialog_tags.xml} (93%) rename app/src/main/res/layout/{item_galleryblock.xml => galleryblock_item.xml} (100%) rename app/src/main/res/layout/{activity_lock.xml => lock_activity.xml} (94%) rename app/src/main/res/layout/{activity_main.xml => main_activity.xml} (89%) rename app/src/main/res/layout/{activity_main_content.xml => main_activity_content.xml} (90%) rename app/src/main/res/layout/{item_mirrors.xml => mirrors_item.xml} (100%) rename app/src/main/res/layout/{dialog_numberpicker.xml => numberpicker_dialog.xml} (86%) rename app/src/main/res/layout/{fragment_pattern_lock.xml => pattern_lock_fragment.xml} (96%) rename app/src/main/res/layout/{fragment_pin_lock.xml => pin_lock_fragment.xml} (100%) rename app/src/main/res/layout/{view_progress_card.xml => progress_card_view.xml} (100%) rename app/src/main/res/layout/{dialog_proxy.xml => proxy_dialog.xml} (77%) rename app/src/main/res/layout/{activity_reader.xml => reader_activity.xml} (90%) rename app/src/main/res/layout/{item_reader.xml => reader_item.xml} (100%) rename app/src/main/res/layout/{view_swipe_pageturn.xml => swipe_pageturn_view.xml} (100%) diff --git a/app/build.gradle b/app/build.gradle index 538efbb5..95abdd3a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: "com.android.application" apply plugin: "kotlin-android" apply plugin: "kotlin-kapt" -apply plugin: "kotlin-android-extensions" +apply plugin: "kotlin-parcelize" apply plugin: "kotlinx-serialization" apply plugin: "com.google.android.gms.oss-licenses-plugin" @@ -63,6 +63,9 @@ android { proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" } } + buildFeatures { + viewBinding true + } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() freeCompilerArgs += "-Xuse-experimental=kotlin.Experimental" @@ -132,8 +135,4 @@ dependencies { androidTestImplementation "androidx.test:rules:1.3.0" androidTestImplementation "androidx.test:runner:1.3.0" androidTestImplementation "androidx.test.espresso:espresso-core:3.3.0" -} - -androidExtensions { - experimental = true } \ No newline at end of file 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 a36053fe..adcd2a36 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -25,7 +25,6 @@ import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.LinearLayout import android.widget.Toast import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView @@ -35,13 +34,12 @@ import com.daimajia.swipe.SwipeLayout import com.daimajia.swipe.adapters.RecyclerSwipeAdapter import com.daimajia.swipe.interfaces.SwipeAdapterInterface import com.github.piasy.biv.loader.ImageLoader -import kotlinx.android.synthetic.main.item_galleryblock.view.* -import kotlinx.android.synthetic.main.view_progress_card.view.* import kotlinx.coroutines.* import xyz.quaver.hitomi.getGallery import xyz.quaver.hitomi.getReader import xyz.quaver.io.util.getChild import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.GalleryblockItemBinding import xyz.quaver.pupil.favoriteTags import xyz.quaver.pupil.favorites import xyz.quaver.pupil.types.Tag @@ -57,20 +55,20 @@ class GalleryBlockAdapter(private val galleries: List) : RecyclerSwipeAdapt var updateAll = true var thin: Boolean = Preferences["thin"] - inner class GalleryViewHolder(val view: View) : RecyclerView.ViewHolder(view) { + inner class GalleryViewHolder(val binding: GalleryblockItemBinding) : RecyclerView.ViewHolder(binding.root) { private var galleryID: Int = 0 init { CoroutineScope(Dispatchers.Main).launch { while (updateAll) { - updateProgress(view.context) + updateProgress(itemView.context) delay(1000) } } } private fun updateProgress(context: Context) = CoroutineScope(Dispatchers.Main).launch { - with(view.galleryblock_card) { + with(binding.galleryblockCard) { val imageList = Cache.getInstance(context, galleryID).metadata.imageList if (imageList == null) { @@ -81,7 +79,7 @@ class GalleryBlockAdapter(private val galleries: List) : RecyclerSwipeAdapt progress = imageList.count { it != null } max = imageList.size - view.galleryblock_id.setOnClickListener { + this@GalleryViewHolder.binding.galleryblockId.setOnClickListener { (context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager).setPrimaryClip( ClipData.newPlainText("gallery_id", galleryID.toString()) ) @@ -102,177 +100,175 @@ class GalleryBlockAdapter(private val galleries: List) : RecyclerSwipeAdapt fun bind(galleryID: Int) { this.galleryID = galleryID - updateProgress(view.context) + updateProgress(itemView.context) - val cache = Cache.getInstance(view.context, galleryID) + val cache = Cache.getInstance(itemView.context, galleryID) val galleryBlock = runBlocking { cache.getGalleryBlock() } ?: return - with(view) { - val resources = context.resources - val languages = resources.getStringArray(R.array.languages).map { - it.split("|").let { split -> - Pair(split[0], split[1]) - } - }.toMap() - - val artists = galleryBlock.artists - val series = galleryBlock.series - - galleryblock_thumbnail.apply { - setOnClickListener { - view.performClick() - } - setOnLongClickListener { - view.performLongClick() - } - setFailureImage(ContextCompat.getDrawable(context, R.drawable.image_broken_variant)) - setImageLoaderCallback(object: ImageLoader.Callback { - override fun onFail(error: Exception?) { - Cache.getInstance(context, galleryID).let { cache -> - cache.cacheFolder.getChild(".thumbnail").let { if (it.exists()) it.delete() } - cache.downloadFolder?.getChild(".thumbnail")?.let { if (it.exists()) it.delete() } - } - } - - override fun onCacheHit(imageType: Int, image: File?) {} - override fun onCacheMiss(imageType: Int, image: File?) {} - override fun onFinish() {} - override fun onProgress(progress: Int) {} - override fun onStart() {} - override fun onSuccess(image: File?) {} - }) - ssiv?.recycle() - CoroutineScope(Dispatchers.IO).launch { - cache.getThumbnail().let { launch(Dispatchers.Main) { - showImage(it) - } } - } + val resources = itemView.context.resources + val languages = resources.getStringArray(R.array.languages).map { + it.split("|").let { split -> + Pair(split[0], split[1]) } + }.toMap() - galleryblock_title.text = galleryBlock.title - with(galleryblock_artist) { - text = artists.joinToString { it.wordCapitalize() } - visibility = when { - artists.isNotEmpty() -> View.VISIBLE - else -> View.GONE - } + val artists = galleryBlock.artists + val series = galleryBlock.series - CoroutineScope(Dispatchers.IO).launch { - val gallery = runCatching { - getGallery(galleryID) - }.getOrNull() - - if (gallery?.groups?.isNotEmpty() != true) - return@launch - - launch(Dispatchers.Main) { - text = context.getString( - R.string.galleryblock_artist_with_group, - artists.joinToString { it.wordCapitalize() }, - gallery.groups.joinToString { it.wordCapitalize() } - ) - } - } + binding.galleryblockThumbnail.apply { + setOnClickListener { + itemView.performClick() } - with(galleryblock_series) { - text = - resources.getString( - R.string.galleryblock_series, - series.joinToString(", ") { it.wordCapitalize() }) - visibility = when { - series.isNotEmpty() -> View.VISIBLE - else -> View.GONE - } + setOnLongClickListener { + itemView.performLongClick() } - galleryblock_type.text = resources.getString(R.string.galleryblock_type, galleryBlock.type).wordCapitalize() - with(galleryblock_language) { - text = - resources.getString(R.string.galleryblock_language, languages[galleryBlock.language]) - visibility = when { - galleryBlock.language.isNotEmpty() -> View.VISIBLE - else -> View.GONE - } - } - - with(galleryblock_tag_group) { - onClickListener = { - onChipClickedHandler.forEach { callback -> - callback.invoke(it) + setFailureImage(ContextCompat.getDrawable(context, R.drawable.image_broken_variant)) + setImageLoaderCallback(object: ImageLoader.Callback { + override fun onFail(error: Exception?) { + Cache.getInstance(context, galleryID).let { cache -> + cache.cacheFolder.getChild(".thumbnail").let { if (it.exists()) it.delete() } + cache.downloadFolder?.getChild(".thumbnail")?.let { if (it.exists()) it.delete() } } } - tags.clear() - - CoroutineScope(Dispatchers.IO).launch { - tags.addAll( - galleryBlock.relatedTags.sortedBy { - val tag = Tag.parse(it) - - if (favoriteTags.contains(tag)) - -1 - else - when(Tag.parse(it).area) { - "female" -> 0 - "male" -> 1 - else -> 2 - } - }.map { - Tag.parse(it) - } - ) - - launch(Dispatchers.Main) { - refresh() - } - } - } - - galleryblock_id.text = galleryBlock.id.toString() - galleryblock_pagecount.text = "-" + override fun onCacheHit(imageType: Int, image: File?) {} + override fun onCacheMiss(imageType: Int, image: File?) {} + override fun onFinish() {} + override fun onProgress(progress: Int) {} + override fun onStart() {} + override fun onSuccess(image: File?) {} + }) + ssiv?.recycle() 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) + cache.getThumbnail().let { launch(Dispatchers.Main) { + showImage(it) + } } + } + } + + binding.galleryblockTitle.text = galleryBlock.title + with(binding.galleryblockArtist) { + text = artists.joinToString { it.wordCapitalize() } + visibility = when { + artists.isNotEmpty() -> View.VISIBLE + else -> View.GONE + } + + CoroutineScope(Dispatchers.IO).launch { + val gallery = runCatching { + getGallery(galleryID) + }.getOrNull() + + if (gallery?.groups?.isNotEmpty() != true) + return@launch + + launch(Dispatchers.Main) { + text = context.getString( + R.string.galleryblock_artist_with_group, + artists.joinToString { it.wordCapitalize() }, + gallery.groups.joinToString { it.wordCapitalize() } + ) + } + } + } + with(binding.galleryblockSeries) { + text = + resources.getString( + R.string.galleryblock_series, + series.joinToString(", ") { it.wordCapitalize() }) + visibility = when { + series.isNotEmpty() -> View.VISIBLE + else -> View.GONE + } + } + binding.galleryblockType.text = resources.getString(R.string.galleryblock_type, galleryBlock.type).wordCapitalize() + with(binding.galleryblockLanguage) { + text = + resources.getString(R.string.galleryblock_language, languages[galleryBlock.language]) + visibility = when { + galleryBlock.language.isNotEmpty() -> View.VISIBLE + else -> View.GONE + } + } + + with(binding.galleryblockTagGroup) { + onClickListener = { + onChipClickedHandler.forEach { callback -> + callback.invoke(it) } } - with(galleryblock_favorite) { - setImageResource(if (favorites.contains(galleryBlock.id)) R.drawable.ic_star_filled else R.drawable.ic_star_empty) - setOnClickListener { - when { - favorites.contains(galleryBlock.id) -> { - favorites.remove(galleryBlock.id) + tags.clear() - setImageResource(R.drawable.ic_star_empty) - } - else -> { - favorites.add(galleryBlock.id) + CoroutineScope(Dispatchers.IO).launch { + tags.addAll( + galleryBlock.relatedTags.sortedBy { + val tag = Tag.parse(it) - setImageDrawable(AnimatedVectorDrawableCompat.create(context, R.drawable.avd_star).apply { - this ?: return@apply + if (favoriteTags.contains(tag)) + -1 + else + when(Tag.parse(it).area) { + "female" -> 0 + "male" -> 1 + else -> 2 + } + }.map { + Tag.parse(it) + } + ) - registerAnimationCallback(object: Animatable2Compat.AnimationCallback() { - override fun onAnimationEnd(drawable: Drawable?) { - setImageResource(R.drawable.ic_star_filled) - } - }) - start() + launch(Dispatchers.Main) { + refresh() + } + } + } + + binding.galleryblockId.text = galleryBlock.id.toString() + binding.galleryblockPagecount.text = "-" + CoroutineScope(Dispatchers.IO).launch { + val pageCount = kotlin.runCatching { + getReader(galleryBlock.id).galleryInfo.files.size + }.getOrNull() ?: return@launch + withContext(Dispatchers.Main) { + binding.galleryblockPagecount.text = itemView.context.getString(R.string.galleryblock_pagecount, pageCount) + } + } + + with(binding.galleryblockFavorite) { + setImageResource(if (favorites.contains(galleryBlock.id)) R.drawable.ic_star_filled else R.drawable.ic_star_empty) + setOnClickListener { + when { + favorites.contains(galleryBlock.id) -> { + favorites.remove(galleryBlock.id) + + setImageResource(R.drawable.ic_star_empty) + } + else -> { + favorites.add(galleryBlock.id) + + setImageDrawable(AnimatedVectorDrawableCompat.create(context, R.drawable.avd_star).apply { + this ?: return@apply + + registerAnimationCallback(object: Animatable2Compat.AnimationCallback() { + override fun onAnimationEnd(drawable: Drawable?) { + setImageResource(R.drawable.ic_star_filled) + } }) - } + start() + }) } } } + } - // Make some views invisible to make it thinner - if (thin) { - galleryblock_tag_group.visibility = View.GONE - } + // Make some views invisible to make it thinner + if (thin) { + binding.galleryblockTagGroup.visibility = View.GONE } } } @@ -282,9 +278,7 @@ class GalleryBlockAdapter(private val galleries: List) : RecyclerSwipeAdapt var onDeleteClickedHandler: ((Int) -> Unit)? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - return GalleryViewHolder( - LayoutInflater.from(parent.context).inflate(R.layout.item_galleryblock, parent, false) - ) + return GalleryViewHolder(GalleryblockItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { @@ -293,25 +287,25 @@ class GalleryBlockAdapter(private val galleries: List) : RecyclerSwipeAdapt holder.bind(galleryID) - holder.view.galleryblock_card.download.setOnClickListener { + holder.binding.galleryblockCard.binding.download.setOnClickListener { onDownloadClickedHandler?.invoke(position) } - holder.view.galleryblock_card.delete.setOnClickListener { + holder.binding.galleryblockCard.binding.delete.setOnClickListener { onDeleteClickedHandler?.invoke(position) } - mItemManger.bindView(holder.view, position) + mItemManger.bindView(holder.binding.root, position) - holder.view.galleryblock_card.swipe_layout.addSwipeListener(object: SwipeLayout.SwipeListener { + holder.binding.galleryblockCard.binding.swipeLayout.addSwipeListener(object: SwipeLayout.SwipeListener { override fun onStartOpen(layout: SwipeLayout?) { mItemManger.closeAllExcept(layout) - holder.view.galleryblock_card.download.text = - if (DownloadManager.getInstance(holder.view.context).isDownloading(galleryID)) - holder.view.context.getString(android.R.string.cancel) + holder.binding.galleryblockCard.binding.download.text = + if (DownloadManager.getInstance(holder.binding.root.context).isDownloading(galleryID)) + holder.binding.root.context.getString(android.R.string.cancel) else - holder.view.context.getString(R.string.main_download) + holder.binding.root.context.getString(R.string.main_download) } override fun onClose(layout: SwipeLayout?) {} 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 c6d77518..93d72678 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt @@ -22,17 +22,29 @@ import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.MotionEvent -import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.item_mirrors.view.* import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.MirrorsItemBinding import xyz.quaver.pupil.util.Preferences import java.util.* class MirrorAdapter(context: Context) : RecyclerView.Adapter() { - class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) + @SuppressLint("ClickableViewAccessibility") + inner class ViewHolder(val binding: MirrorsItemBinding) : RecyclerView.ViewHolder(binding.root) { + init { + binding.mirrorButton.setOnTouchListener { _, event -> + if (event.action == MotionEvent.ACTION_DOWN) + onStartDrag?.invoke(this) + + true + } + } + fun bind(mirror: String) { + binding.mirrorName.text = mirror + } + } val mirrors = context.resources.getStringArray(R.array.mirrors).map { it.split('|').let { split -> @@ -62,23 +74,11 @@ class MirrorAdapter(context: Context) : RecyclerView.Adapter - if (event.action == MotionEvent.ACTION_DOWN) - onStartDrag?.invoke(holder) - - true - } - } + holder.bind(mirrors[list.elementAt(position)] ?: error("")) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return LayoutInflater.from(parent.context).inflate( - R.layout.item_mirrors, parent, false - ).let { - ViewHolder(it) - } + return ViewHolder(MirrorsItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } override fun getItemCount() = mirrors.size 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 595d3d43..b815518b 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -39,10 +39,10 @@ import com.facebook.imagepipeline.image.ImageInfo import com.github.piasy.biv.view.BigImageView import com.github.piasy.biv.view.ImageShownCallback import com.github.piasy.biv.view.ImageViewFactory -import kotlinx.android.synthetic.main.item_reader.view.* import kotlinx.coroutines.* import xyz.quaver.hitomi.Reader import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.ReaderItemBinding import xyz.quaver.pupil.ui.ReaderActivity import xyz.quaver.pupil.util.downloader.Cache import java.io.File @@ -52,16 +52,93 @@ class ReaderAdapter( private val activity: ReaderActivity, private val galleryID: Int ) : RecyclerView.Adapter() { - var reader: Reader? = null var isFullScreen = false var onItemClickListener : (() -> (Unit))? = null - class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) { + inner class ViewHolder(private val binding: ReaderItemBinding) : RecyclerView.ViewHolder(binding.root) { + init { + with (binding.image) { + setImageViewFactory(FrescoImageViewFactory().apply { + updateView = { imageInfo -> + binding.image.updateLayoutParams { + dimensionRatio = "${imageInfo.width}:${imageInfo.height}" + } + } + }) + setImageShownCallback(object : ImageShownCallback { + override fun onMainImageShown() { + binding.image.mainView.let { v -> + when (v) { + is SubsamplingScaleImageView -> + if (!isFullScreen) binding.image.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT + } + } + } + + override fun onThumbnailShown() {} + }) + + setFailureImage(ContextCompat.getDrawable(itemView.context, R.drawable.image_broken_variant)) + setOnClickListener { + onItemClickListener?.invoke() + } + } + + binding.root.setOnClickListener { + onItemClickListener?.invoke() + } + } + + fun bind(position: Int) { + if (cache == null) + cache = Cache.getInstance(itemView.context, galleryID) + + if (!isFullScreen) { + binding.root.setBackgroundResource(R.drawable.reader_item_boundary) + binding.image.updateLayoutParams { + height = 0 + dimensionRatio = + "${reader!!.galleryInfo.files[position].width}:${reader!!.galleryInfo.files[position].height}" + } + } else { + binding.root.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT + binding.image.updateLayoutParams { + height = ConstraintLayout.LayoutParams.MATCH_PARENT + dimensionRatio = null + } + binding.root.background = null + } + + binding.readerIndex.text = (position+1).toString() + + val image = cache!!.getImage(position) + val progress = activity.downloader?.progress?.get(galleryID)?.get(position) + + if (progress?.isInfinite() == true && image != null) { + binding.progressGroup.visibility = View.INVISIBLE + binding.image.showImage(image.uri) + } else { + binding.progressGroup.visibility = View.VISIBLE + binding.readerItemProgressbar.progress = + if (progress?.isInfinite() == true) + 100 + else + progress?.roundToInt() ?: 0 + + clear() + + CoroutineScope(Dispatchers.Main).launch { + delay(1000) + notifyItemChanged(position) + } + } + } + fun clear() { - view.image.mainView.let { + binding.image.mainView.let { when (it) { is SubsamplingScaleImageView -> it.recycle() @@ -73,88 +150,12 @@ class ReaderAdapter( } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return LayoutInflater.from(parent.context).inflate( - R.layout.item_reader, parent, false - ).let { - with(it) { - image.setImageViewFactory(FrescoImageViewFactory().apply { - updateView = { imageInfo -> - it.image.updateLayoutParams { - dimensionRatio = "${imageInfo.width}:${imageInfo.height}" - } - } - }) - image.setImageShownCallback(object : ImageShownCallback { - override fun onMainImageShown() { - it.image.mainView.let { v -> - when (v) { - is SubsamplingScaleImageView -> - if (!isFullScreen) it.image.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT - } - } - } - - override fun onThumbnailShown() {} - }) - image.setFailureImage(ContextCompat.getDrawable(context, R.drawable.image_broken_variant)) - image.setOnClickListener { - this.performClick() - } - setOnClickListener { - onItemClickListener?.invoke() - } - } - - ViewHolder(it) - } + return ViewHolder(ReaderItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } private var cache: Cache? = null override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.view as ConstraintLayout - - if (cache == null) - cache = Cache.getInstance(holder.view.context, galleryID) - - if (!isFullScreen) { - holder.view.setBackgroundResource(R.drawable.reader_item_boundary) - holder.view.image.updateLayoutParams { - height = 0 - dimensionRatio = - "${reader!!.galleryInfo.files[position].width}:${reader!!.galleryInfo.files[position].height}" - } - } else { - holder.view.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT - holder.view.image.updateLayoutParams { - height = ConstraintLayout.LayoutParams.MATCH_PARENT - dimensionRatio = null - } - holder.view.background = null - } - - holder.view.reader_index.text = (position+1).toString() - - val image = cache!!.getImage(position) - val progress = activity.downloader?.progress?.get(galleryID)?.get(position) - - if (progress?.isInfinite() == true && image != null) { - holder.view.progress_group.visibility = View.INVISIBLE - holder.view.image.showImage(image.uri) - } else { - holder.view.progress_group.visibility = View.VISIBLE - holder.view.reader_item_progressbar.progress = - if (progress?.isInfinite() == true) - 100 - else - progress?.roundToInt() ?: 0 - - holder.clear() - - CoroutineScope(Dispatchers.Main).launch { - delay(1000) - notifyItemChanged(position) - } - } + holder.bind(position) } override fun getItemCount() = reader?.galleryInfo?.files?.size ?: 0 diff --git a/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt b/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt index f04c35ce..d3c02196 100644 --- a/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt +++ b/app/src/main/java/xyz/quaver/pupil/types/Suggestions.kt @@ -18,8 +18,8 @@ package xyz.quaver.pupil.types -import kotlinx.android.parcel.IgnoredOnParcel -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parcelize import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion import xyz.quaver.hitomi.Suggestion import xyz.quaver.pupil.util.translations 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 b02fcee0..33e678f6 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt @@ -29,10 +29,8 @@ import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat import com.andrognito.patternlockview.PatternLockView import com.google.android.material.snackbar.Snackbar -import kotlinx.android.synthetic.main.activity_lock.* -import kotlinx.android.synthetic.main.fragment_pattern_lock.* -import kotlinx.android.synthetic.main.fragment_pin_lock.* import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.LockActivityBinding import xyz.quaver.pupil.ui.fragment.PINLockFragment import xyz.quaver.pupil.ui.fragment.PatternLockFragment import xyz.quaver.pupil.util.Lock @@ -45,6 +43,8 @@ class LockActivity : AppCompatActivity() { private lateinit var lockManager: LockManager private var mode: String? = null + private lateinit var binding: LockActivityBinding + private val patternLockFragment = PatternLockFragment().apply { var lastPass = "" onPatternDrawn = { @@ -57,7 +57,7 @@ class LockActivity : AppCompatActivity() { setResult(Activity.RESULT_OK) finish() } else - lock_pattern_view.setViewMode(PatternLockView.PatternViewMode.WRONG) + binding.patternLockView.setViewMode(PatternLockView.PatternViewMode.WRONG) } "add_lock" -> { if (lastPass.isEmpty()) { @@ -69,7 +69,7 @@ class LockActivity : AppCompatActivity() { LockManager(context!!).add(Lock.generate(Lock.Type.PATTERN, it)) finish() } else { - lock_pattern_view.setViewMode(PatternLockView.PatternViewMode.WRONG) + binding.patternLockView.setViewMode(PatternLockView.PatternViewMode.WRONG) lastPass = "" Snackbar.make(view!!, R.string.settings_lock_wrong_confirm, Snackbar.LENGTH_LONG).show() @@ -92,15 +92,15 @@ class LockActivity : AppCompatActivity() { setResult(Activity.RESULT_OK) finish() } else { - indicator_dots.startAnimation(AnimationUtils.loadAnimation(context, R.anim.shake).apply { + binding.indicatorDots.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 + binding.pinLockView.resetPinLockView() + binding.pinLockView.isEnabled = true } override fun onAnimationStart(animation: Animation?) { - pin_lock_view.isEnabled = false + binding.pinLockView.isEnabled = false } override fun onAnimationRepeat(animation: Animation?) { @@ -114,22 +114,22 @@ class LockActivity : AppCompatActivity() { if (lastPass.isEmpty()) { lastPass = it - pin_lock_view.resetPinLockView() + binding.pinLockView.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 { + binding.indicatorDots.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 + binding.pinLockView.resetPinLockView() + binding.pinLockView.isEnabled = true } override fun onAnimationStart(animation: Animation?) { - pin_lock_view.isEnabled = false + binding.pinLockView.isEnabled = false } override fun onAnimationRepeat(animation: Animation?) { @@ -173,7 +173,8 @@ class LockActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_lock) + binding = LockActivityBinding.inflate(layoutInflater) + setContentView(binding.root) lockManager = try { LockManager(this) @@ -210,7 +211,7 @@ class LockActivity : AppCompatActivity() { Preferences["lock_fingerprint"] && BiometricManager.from(this).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS ) { - lock_fingerprint.apply { + binding.fingerprintBtn.apply { isEnabled = true setOnClickListener { showBiometricPrompt() @@ -219,7 +220,7 @@ class LockActivity : AppCompatActivity() { showBiometricPrompt() } - lock_pattern.apply { + binding.patternBtn.apply { isEnabled = lockManager.contains(Lock.Type.PATTERN) setOnClickListener { supportFragmentManager.beginTransaction().replace( @@ -227,7 +228,7 @@ class LockActivity : AppCompatActivity() { ).commit() } } - lock_pin.apply { + binding.pinBtn.apply { isEnabled = lockManager.contains(Lock.Type.PIN) setOnClickListener { supportFragmentManager.beginTransaction().replace( @@ -235,7 +236,7 @@ class LockActivity : AppCompatActivity() { ).commit() } } - lock_password.isEnabled = false + binding.passwordBtn.isEnabled = false when (lockManager.locks!!.first().type) { Lock.Type.PIN -> { @@ -253,20 +254,20 @@ class LockActivity : AppCompatActivity() { } } "add_lock" -> { - lock_pattern.isEnabled = false - lock_pin.isEnabled = false - lock_fingerprint.isEnabled = false - lock_password.isEnabled = false + binding.patternBtn.isEnabled = false + binding.pinBtn.isEnabled = false + binding.fingerprintBtn.isEnabled = false + binding.passwordBtn.isEnabled = false when(intent.getStringExtra("type")!!) { "pattern" -> { - lock_pattern.isEnabled = true + binding.patternBtn.isEnabled = true supportFragmentManager.beginTransaction().add( R.id.lock_content, patternLockFragment ).commit() } "pin" -> { - lock_pin.isEnabled = true + binding.pinBtn.isEnabled = true supportFragmentManager.beginTransaction().add( R.id.lock_content, pinLockFragment ).commit() 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 c37bec02..8eca9aff 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -39,8 +39,6 @@ import androidx.recyclerview.widget.RecyclerView import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar import com.google.firebase.crashlytics.FirebaseCrashlytics -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.activity_main_content.* import kotlinx.coroutines.* import xyz.quaver.floatingsearchview.FloatingSearchView import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion @@ -51,6 +49,7 @@ import xyz.quaver.hitomi.getGalleryIDsFromNozomi import xyz.quaver.hitomi.getSuggestionsForQuery import xyz.quaver.pupil.* import xyz.quaver.pupil.adapters.GalleryBlockAdapter +import xyz.quaver.pupil.databinding.MainActivityBinding import xyz.quaver.pupil.services.DownloadService import xyz.quaver.pupil.types.* import xyz.quaver.pupil.ui.dialog.DownloadLocationDialogFragment @@ -103,18 +102,20 @@ class MainActivity : private var loadingJob: Job? = null private var currentPage = 0 + private lateinit var binding: MainActivityBinding + override fun onCreate(savedInstanceState: Bundle?) { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + binding = MainActivityBinding.inflate(layoutInflater) + setContentView(binding.root) if (intent.action == Intent.ACTION_VIEW) { intent.dataString?.let { url -> restore(url, onFailure = { - Snackbar.make(this.main_recyclerview, R.string.settings_backup_failed, Snackbar.LENGTH_LONG).show() + Snackbar.make(binding.contents.recyclerview, R.string.settings_backup_failed, Snackbar.LENGTH_LONG).show() }, onSuccess = { - Snackbar.make(this.main_recyclerview, getString(R.string.settings_restore_success, it.size), Snackbar.LENGTH_LONG).show() + Snackbar.make(binding.contents.recyclerview, getString(R.string.settings_restore_success, it.size), Snackbar.LENGTH_LONG).show() } ) } @@ -131,7 +132,7 @@ class MainActivity : @OptIn(ExperimentalStdlibApi::class) override fun onBackPressed() { when { - main_drawer_layout.isDrawerOpen(GravityCompat.START) -> main_drawer_layout.closeDrawer(GravityCompat.START) + binding.drawer.isDrawerOpen(GravityCompat.START) -> binding.drawer.closeDrawer(GravityCompat.START) queryStack.removeLastOrNull() != null && queryStack.isNotEmpty() -> runOnUiThread { query = queryStack.last() @@ -147,7 +148,7 @@ class MainActivity : override fun onDestroy() { super.onDestroy() - (main_recyclerview?.adapter as? GalleryBlockAdapter)?.updateAll = false + (binding.contents.recyclerview.adapter as? GalleryBlockAdapter)?.updateAll = false } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { @@ -188,36 +189,36 @@ class MainActivity : } private fun initView() { - main_recyclerview.addOnScrollListener(object: RecyclerView.OnScrollListener() { + binding.contents.recyclerview.addOnScrollListener(object: RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { // -height of the search view < translationY < 0 - main_searchview.translationY = + binding.contents.searchview.translationY = min( max( - main_searchview.translationY - dy, - -main_searchview.findViewById(R.id.search_query_section).height.toFloat() + binding.contents.searchview.translationY - dy, + -binding.contents.searchview.findViewById(R.id.search_query_section).height.toFloat() ), 0F) if (dy > 0) - main_fab.hideMenuButton(true) + binding.contents.fab.hideMenuButton(true) else if (dy < 0) - main_fab.showMenuButton(true) + binding.contents.fab.showMenuButton(true) } }) - Linkify.addLinks(main_noresult, Pattern.compile(getString(R.string.https_text)), null, null, { _, _ -> getString(R.string.https) }) + Linkify.addLinks(binding.contents.noresult, Pattern.compile(getString(R.string.https_text)), null, null, { _, _ -> getString(R.string.https) }) //NavigationView - main_nav_view.setNavigationItemSelectedListener(this) + binding.navView.setNavigationItemSelectedListener(this) - with(main_fab_cancel) { + with(binding.contents.cancelFab) { setImageResource(R.drawable.cancel) setOnClickListener { DownloadService.cancel(this@MainActivity) } } - with(main_fab_jump) { + with(binding.contents.jumpFab) { setImageResource(R.drawable.ic_jump) setOnClickListener { val perPage = Preferences["per_page", "25"].toInt() @@ -245,7 +246,7 @@ class MainActivity : } } - with(main_fab_random) { + with(binding.contents.randomFab) { setImageResource(R.drawable.shuffle_variant) setOnClickListener { runBlocking { @@ -275,7 +276,7 @@ class MainActivity : } } - with(main_fab_id) { + with(binding.contents.idFab) { setImageResource(R.drawable.numeric) setOnClickListener { val editText = EditText(context).apply { @@ -308,7 +309,7 @@ class MainActivity : } } - with(main_view) { + with(binding.contents.view) { setOnPageTurnListener(object: MainView.OnPageTurnListener { override fun onPrev(page: Int) { currentPage-- @@ -316,7 +317,7 @@ class MainActivity : // disable pageturn until the contents are loaded setCurrentPage(1, false) - ViewCompat.animate(main_searchview) + ViewCompat.animate(binding.contents.searchview) .setDuration(100) .setInterpolator(DecelerateInterpolator()) .translationY(0F) @@ -333,7 +334,7 @@ class MainActivity : // disable pageturn until the contents are loaded setCurrentPage(1, false) - ViewCompat.animate(main_searchview) + ViewCompat.animate(binding.contents.searchview) .setDuration(100) .setInterpolator(DecelerateInterpolator()) .translationY(0F) @@ -354,7 +355,7 @@ class MainActivity : @SuppressLint("ClickableViewAccessibility") private fun setupRecyclerView() { - with(main_recyclerview) { + with(binding.contents.recyclerview) { adapter = GalleryBlockAdapter(galleries).apply { onChipClickedHandler.add { runOnUiThread { @@ -454,10 +455,10 @@ class MainActivity : private var suggestionJob : Job? = null private fun setupSearchBar() { - with(main_searchview as xyz.quaver.pupil.ui.view.FloatingSearchView) { + with(binding.contents.searchview) { onMenuStatusChangeListener = object: FloatingSearchView.OnMenuStatusChangeListener { override fun onMenuOpened() { - (this@MainActivity.main_recyclerview.adapter as GalleryBlockAdapter).closeAllItems() + (binding.contents.recyclerview.adapter as GalleryBlockAdapter).closeAllItems() } override fun onMenuClosed() { @@ -541,7 +542,7 @@ class MainActivity : } } - attachNavigationDrawerToMenuButton(main_drawer_layout) + attachNavigationDrawerToMenuButton(binding.drawer) } } @@ -552,7 +553,7 @@ class MainActivity : val thin = !item.isChecked item.isChecked = thin - main_recyclerview.apply { + binding.contents.recyclerview.apply { (adapter as GalleryBlockAdapter).apply { this.thin = thin @@ -593,7 +594,7 @@ class MainActivity : override fun onNavigationItemSelected(item: MenuItem): Boolean { runOnUiThread { - main_drawer_layout.closeDrawers() + binding.drawer.closeDrawers() when(item.itemId) { R.id.main_drawer_home -> { @@ -665,14 +666,14 @@ class MainActivity : private fun clearGalleries() = CoroutineScope(Dispatchers.Main).launch { galleries.clear() - with(main_recyclerview.adapter as GalleryBlockAdapter?) { + with(binding.contents.recyclerview.adapter as GalleryBlockAdapter?) { this ?: return@with this.notifyDataSetChanged() } - main_noresult.visibility = View.INVISIBLE - main_progressbar.show() + binding.contents.noresult.visibility = View.INVISIBLE + binding.contents.progressbar.show() } private fun fetchGalleries(query: String, sortMode: SortMode) { @@ -687,7 +688,7 @@ class MainActivity : } if (query.isNotEmpty() && mode != Mode.SEARCH) { - Snackbar.make(this@MainActivity.main_recyclerview, R.string.search_all, Snackbar.LENGTH_SHORT).apply { + Snackbar.make(binding.contents.recyclerview, R.string.search_all, Snackbar.LENGTH_SHORT).apply { setAction(android.R.string.ok) { cancelFetch() clearGalleries() @@ -784,15 +785,15 @@ class MainActivity : FirebaseCrashlytics.getInstance().recordException(e) withContext(Dispatchers.Main) { - main_noresult.visibility = View.VISIBLE - main_progressbar.hide() + binding.contents.noresult.visibility = View.VISIBLE + binding.contents.progressbar.hide() } return@launch } launch(Dispatchers.Main) { - main_view.setCurrentPage(currentPage + 1, galleryIDs.size > (currentPage+1)*perPage) + binding.contents.view.setCurrentPage(currentPage + 1, galleryIDs.size > (currentPage+1)*perPage) } galleryIDs.slice(currentPage*perPage until min(currentPage*perPage+perPage, galleryIDs.size)).chunked(5).let { chunks -> @@ -806,10 +807,10 @@ class MainActivity : }.forEach { it.await()?.also { withContext(Dispatchers.Main) { - main_progressbar.hide() + binding.contents.progressbar.hide() galleries.add(it) - main_recyclerview.adapter!!.notifyItemInserted(galleries.size - 1) + binding.contents.recyclerview.adapter!!.notifyItemInserted(galleries.size - 1) } } } 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 0a4b3f8d..758f8bff 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt @@ -45,10 +45,6 @@ import com.google.android.material.snackbar.Snackbar import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.mlkit.vision.face.Face import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller -import kotlinx.android.synthetic.main.activity_reader.* -import kotlinx.android.synthetic.main.activity_reader.view.* -import kotlinx.android.synthetic.main.dialog_numberpicker.view.* -import kotlinx.android.synthetic.main.reader_eye_card.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -56,6 +52,8 @@ import kotlinx.coroutines.launch import xyz.quaver.Code import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.ReaderAdapter +import xyz.quaver.pupil.databinding.NumberpickerDialogBinding +import xyz.quaver.pupil.databinding.ReaderActivityBinding import xyz.quaver.pupil.favorites import xyz.quaver.pupil.services.DownloadService import xyz.quaver.pupil.util.Preferences @@ -75,7 +73,7 @@ class ReaderActivity : BaseActivity() { set(value) { field = value - (reader_recyclerview.adapter as ReaderAdapter).isFullScreen = value + (binding.recyclerview.adapter as ReaderAdapter).isFullScreen = value } private lateinit var cache: Cache @@ -118,9 +116,12 @@ class ReaderActivity : BaseActivity() { private var eyeType: Eye? = null private var eyeTime: Long = 0L + private lateinit var binding: ReaderActivityBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_reader) + binding = ReaderActivityBinding.inflate(layoutInflater) + setContentView(binding.root) title = getString(R.string.reader_loading) supportActionBar?.setDisplayHomeAsUpEnabled(false) @@ -178,17 +179,19 @@ class ReaderActivity : BaseActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when(item.itemId) { R.id.reader_menu_page_indicator -> { - val view = LayoutInflater.from(this).inflate(R.layout.dialog_numberpicker, reader_layout, false) - with(view.dialog_number_picker) { + // TODO: Switch to DialogFragment + val binding = NumberpickerDialogBinding.inflate(layoutInflater, binding.root, false) + + with(binding.numberPicker) { minValue = 1 maxValue = cache.metadata.reader?.galleryInfo?.files?.size ?: 0 value = currentPage } val dialog = AlertDialog.Builder(this).apply { - setView(view) + setView(binding.root) }.create() - view.dialog_ok.setOnClickListener { - (reader_recyclerview.layoutManager as LinearLayoutManager?)?.scrollToPositionWithOffset(view.dialog_number_picker.value-1, 0) + binding.okButton.setOnClickListener { + (this@ReaderActivity.binding.recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(binding.numberPicker.value-1, 0) dialog.dismiss() } @@ -258,12 +261,12 @@ class ReaderActivity : BaseActivity() { //currentPage is 1-based return when(keyCode) { KeyEvent.KEYCODE_VOLUME_UP -> { - (reader_recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage-2, 0) + (binding.recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage-2, 0) true } KeyEvent.KEYCODE_VOLUME_DOWN -> { - (reader_recyclerview.layoutManager as LinearLayoutManager?)?.scrollToPositionWithOffset(currentPage, 0) + (binding.recyclerview.layoutManager as LinearLayoutManager?)?.scrollToPositionWithOffset(currentPage, 0) true } @@ -285,21 +288,21 @@ class ReaderActivity : BaseActivity() { if (downloader.progress[galleryID]?.isEmpty() == true) { //Gallery not found update = false Snackbar - .make(reader_layout, R.string.reader_failed_to_find_gallery, Snackbar.LENGTH_INDEFINITE) + .make(binding.root, R.string.reader_failed_to_find_gallery, Snackbar.LENGTH_INDEFINITE) .show() return@launch } - reader_download_progressbar.max = reader_recyclerview.adapter?.itemCount ?: 0 - reader_download_progressbar.progress = + binding.downloadProgressbar.max = binding.recyclerview.adapter?.itemCount ?: 0 + binding.downloadProgressbar.progress = downloader.progress[galleryID]?.count { it.isInfinite() } ?: 0 if (title == getString(R.string.reader_loading)) { val reader = cache.metadata.reader if (reader != null) { - with(reader_recyclerview.adapter as ReaderAdapter) { + with(binding.recyclerview.adapter as ReaderAdapter) { this.reader = reader notifyDataSetChanged() } @@ -320,7 +323,7 @@ class ReaderActivity : BaseActivity() { } if (downloader.isCompleted(galleryID)) { //Download finished - reader_download_progressbar.visibility = View.GONE + binding.downloadProgressbar.visibility = View.GONE animateDownloadFAB(false) } @@ -329,7 +332,7 @@ class ReaderActivity : BaseActivity() { } private fun initView() { - with(reader_recyclerview) { + with(binding.recyclerview) { adapter = ReaderAdapter(this@ReaderActivity, galleryID).apply { onItemClickListener = { if (isScroll) { @@ -339,7 +342,7 @@ class ReaderActivity : BaseActivity() { scrollMode(false) fullscreen(true) } else { - (reader_recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage, 0) //Moves to next page because currentPage is 1-based indexing + (binding.recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage, 0) //Moves to next page because currentPage is 1-based indexing } } } @@ -349,9 +352,9 @@ class ReaderActivity : BaseActivity() { super.onScrolled(recyclerView, dx, dy) if (dy < 0) - this@ReaderActivity.reader_fab.showMenuButton(true) + binding.fab.showMenuButton(true) else if (dy > 0) - this@ReaderActivity.reader_fab.hideMenuButton(true) + binding.fab.hideMenuButton(true) val layoutManager = recyclerView.layoutManager as LinearLayoutManager @@ -363,7 +366,7 @@ class ReaderActivity : BaseActivity() { }) } - with(reader_fab_download) { + with(binding.downloadFab) { animateDownloadFAB(DownloadManager.getInstance(this@ReaderActivity).getDownloadFolder(galleryID) != null) //If download in progress, animate button setOnClickListener { @@ -380,14 +383,14 @@ class ReaderActivity : BaseActivity() { } } - with(reader_fab_retry) { + with(binding.retryFab) { setImageResource(R.drawable.refresh) setOnClickListener { DownloadService.download(context, galleryID) } } - with(reader_fab_auto) { + with(binding.autoFab) { setImageResource(R.drawable.eye_white) setOnClickListener { when { @@ -407,13 +410,13 @@ class ReaderActivity : BaseActivity() { } } - with(reader_fab_fullscreen) { + with(binding.fullscreenFab) { setImageResource(R.drawable.ic_fullscreen) setOnClickListener { isFullscreen = true fullscreen(isFullscreen) - this@ReaderActivity.reader_fab.close(true) + binding.fab.close(true) } } } @@ -423,8 +426,8 @@ class ReaderActivity : BaseActivity() { if (isFullscreen) { flags = flags or WindowManager.LayoutParams.FLAG_FULLSCREEN supportActionBar?.hide() - this@ReaderActivity.reader_fab.visibility = View.INVISIBLE - this@ReaderActivity.scroller.let { + binding.fab.visibility = View.INVISIBLE + binding.scroller.let { it.handleWidth = resources.getDimensionPixelSize(R.dimen.thumb_height) it.handleHeight = resources.getDimensionPixelSize(R.dimen.thumb_width) it.handleDrawable = ContextCompat.getDrawable(this@ReaderActivity, R.drawable.thumb_horizontal) @@ -433,8 +436,8 @@ class ReaderActivity : BaseActivity() { } else { flags = flags and WindowManager.LayoutParams.FLAG_FULLSCREEN.inv() supportActionBar?.show() - this@ReaderActivity.reader_fab.visibility = View.VISIBLE - this@ReaderActivity.scroller.let { + binding.fab.visibility = View.VISIBLE + binding.scroller.let { it.handleWidth = resources.getDimensionPixelSize(R.dimen.thumb_width) it.handleHeight = resources.getDimensionPixelSize(R.dimen.thumb_height) it.handleDrawable = ContextCompat.getDrawable(this@ReaderActivity, R.drawable.thumb) @@ -445,27 +448,27 @@ class ReaderActivity : BaseActivity() { window.attributes = this } - reader_recyclerview.adapter = reader_recyclerview.adapter // Force to redraw + binding.recyclerview.adapter = binding.recyclerview.adapter // Force to redraw } private fun scrollMode(isScroll: Boolean) { if (isScroll) { snapHelper.attachToRecyclerView(null) - reader_recyclerview.layoutManager = LinearLayoutManager(this) + binding.recyclerview.layoutManager = LinearLayoutManager(this) } else { - snapHelper.attachToRecyclerView(reader_recyclerview) - reader_recyclerview.layoutManager = object: LinearLayoutManager(this, HORIZONTAL, Preferences["rtl", false]) { + snapHelper.attachToRecyclerView(binding.recyclerview) + binding.recyclerview.layoutManager = object: LinearLayoutManager(this, HORIZONTAL, Preferences["rtl", false]) { override fun calculateExtraLayoutSpace(state: RecyclerView.State, extraLayoutSpace: IntArray) { extraLayoutSpace.fill(600) } } } - (reader_recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage-1, 0) + (binding.recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage-1, 0) } private fun animateDownloadFAB(animate: Boolean) { - with(reader_fab_download) { + with(binding.downloadFab) { if (animate) { val icon = AnimatedVectorDrawableCompat.create(context, R.drawable.ic_downloading) @@ -494,7 +497,7 @@ class ReaderActivity : BaseActivity() { } val cameraCallback: (List) -> Unit = callback@{ faces -> - eye_card.dot.let { + binding.eyeCard.dot.let { it.visibility = View.VISIBLE CoroutineScope(Dispatchers.Main).launch { delay(50) @@ -504,9 +507,9 @@ class ReaderActivity : BaseActivity() { if (faces.size != 1) ContextCompat.getDrawable(this, R.drawable.eye_off).let { - with(eye_card) { - left_eye.setImageDrawable(it) - right_eye.setImageDrawable(it) + with(binding.eyeCard) { + leftEye.setImageDrawable(it) + rightEye.setImageDrawable(it) } return@callback @@ -517,16 +520,16 @@ class ReaderActivity : BaseActivity() { faces[0].leftEyeOpenProbability?.let { it > 0.4 } == true ) - with(eye_card) { - left_eye.setImageDrawable( + with(binding.eyeCard) { + leftEye.setImageDrawable( ContextCompat.getDrawable( - context, + leftEye.context, if (left) R.drawable.eye else R.drawable.eye_closed ) ) - right_eye.setImageDrawable( + rightEye.setImageDrawable( ContextCompat.getDrawable( - context, + rightEye.context, if (right) R.drawable.eye else R.drawable.eye_closed ) ) @@ -553,7 +556,7 @@ class ReaderActivity : BaseActivity() { } if (eyeType != null && System.currentTimeMillis() - eyeTime > 100) { - (this@ReaderActivity.reader_recyclerview.layoutManager as LinearLayoutManager).let { + (binding.recyclerview.layoutManager as LinearLayoutManager).let { it.scrollToPositionWithOffset(when(eyeType!!) { Eye.RIGHT -> { if (it.reverseLayout) currentPage - 2 else currentPage @@ -569,11 +572,11 @@ class ReaderActivity : BaseActivity() { } private fun toggleCamera() { - val eyes = this@ReaderActivity.eye_card + val eyes = binding.eyeCard.root when (camera) { null -> { - reader_fab_auto.labelText = getString(R.string.reader_fab_auto_cancel) - reader_fab_auto.setImageResource(R.drawable.eye_off_white) + binding.autoFab.labelText = getString(R.string.reader_fab_auto_cancel) + binding.autoFab.setImageResource(R.drawable.eye_off_white) eyes.apply { visibility = View.VISIBLE TranslateAnimation(0F, 0F, -100F, 0F).apply { @@ -586,8 +589,8 @@ class ReaderActivity : BaseActivity() { cameraEnabled = true } else -> { - reader_fab_auto.labelText = getString(R.string.reader_fab_auto) - reader_fab_auto.setImageResource(R.drawable.eye_white) + binding.autoFab.labelText = getString(R.string.reader_fab_auto) + binding.autoFab.setImageResource(R.drawable.eye_white) eyes.apply { TranslateAnimation(0F, 0F, 0F, -100F).apply { duration = 500 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 789e5f3c..cb73f790 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 @@ -18,19 +18,15 @@ package xyz.quaver.pupil.ui.dialog -import android.annotation.SuppressLint import android.app.Dialog import android.content.Context import android.os.Bundle import android.text.Editable import android.text.TextWatcher -import android.view.LayoutInflater -import android.view.View import android.widget.ArrayAdapter import androidx.appcompat.app.AlertDialog -import kotlinx.android.synthetic.main.dialog_default_query.* -import kotlinx.android.synthetic.main.dialog_default_query.view.* import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.DefaultQueryDialogBinding import xyz.quaver.pupil.types.Tags import xyz.quaver.pupil.util.Preferences @@ -49,46 +45,48 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { var onPositiveButtonClickListener : ((Tags) -> (Unit))? = null - @SuppressLint("InflateParams") - override fun onCreate(savedInstanceState: Bundle?) { - setTitle(R.string.default_query_dialog_title) - setView(build()) - setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ -> - val newTags = Tags.parse(default_query_dialog_edittext.text.toString()) + private lateinit var binding: DefaultQueryDialogBinding - with(default_query_dialog_language_selector) { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setTitle(R.string.default_query_dialog_title) + binding = DefaultQueryDialogBinding.inflate(layoutInflater) + setView(binding.root) + + initView() + + setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ -> + val newTags = Tags.parse(binding.edittext.text.toString()) + + with(binding.languageSelector) { if (selectedItemPosition != 0) newTags.add("language:${reverseLanguages[selectedItem]}") } - if (default_query_dialog_BL_checkbox.isChecked) + if (binding.BLCheckbox.isChecked) newTags.add(excludeBL) - if (default_query_dialog_guro_checkbox.isChecked) + if (binding.guroCheckbox.isChecked) excludeGuro.forEach { tag -> newTags.add(tag) } - if (default_query_dialog_loli_checkbox.isChecked) + if (binding.loliCheckbox.isChecked) excludeLoli.forEach { tag -> newTags.add(tag) } onPositiveButtonClickListener?.invoke(newTags) } - - super.onCreate(savedInstanceState) } - @SuppressLint("InflateParams") - private fun build() : View { + private fun initView() { val tags = Tags.parse( Preferences["default_query"] ) - val view = LayoutInflater.from(context).inflate(R.layout.dialog_default_query, null) - - with(view.default_query_dialog_language_selector) { + with(binding.languageSelector) { adapter = ArrayAdapter( context, @@ -111,13 +109,13 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { } } - with(view.default_query_dialog_BL_checkbox) { + with(binding.BLCheckbox) { isChecked = tags.contains(excludeBL) if (tags.contains(excludeBL)) tags.remove(excludeBL) } - with(view.default_query_dialog_guro_checkbox) { + with(binding.guroCheckbox) { isChecked = excludeGuro.all { tags.contains(it) } if (excludeGuro.all { tags.contains(it) }) excludeGuro.forEach { @@ -125,7 +123,7 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { } } - with(view.default_query_dialog_loli_checkbox) { + with(binding.loliCheckbox) { isChecked = excludeLoli.all { tags.contains(it) } if (excludeLoli.all { tags.contains(it) }) excludeLoli.forEach { @@ -133,7 +131,7 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { } } - with(view.default_query_dialog_edittext) { + with(binding.edittext) { setText(tags.toString(), android.widget.TextView.BufferType.EDITABLE) addTextChangedListener(object : TextWatcher { override fun beforeTextChanged( @@ -158,8 +156,6 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) { } }) } - - return view } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadFolderNameDialogFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadFolderNameDialogFragment.kt index 88a2c221..673b4769 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadFolderNameDialogFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadFolderNameDialogFragment.kt @@ -18,17 +18,15 @@ package xyz.quaver.pupil.ui.dialog -import android.annotation.SuppressLint import android.app.Dialog import android.os.Bundle -import android.view.View import android.view.ViewGroup import androidx.core.widget.addTextChangedListener import androidx.fragment.app.DialogFragment import com.google.android.material.snackbar.Snackbar -import kotlinx.android.synthetic.main.dialog_download_folder_name.view.* import kotlinx.coroutines.runBlocking import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.DownloadFolderNameDialogBinding import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.downloader.Cache import xyz.quaver.pupil.util.formatDownloadFolder @@ -37,38 +35,48 @@ import xyz.quaver.pupil.util.formatMap class DownloadFolderNameDialogFragment : DialogFragment() { - @SuppressLint("InflateParams") - private fun build(): View { + private var _binding: DownloadFolderNameDialogBinding? = null + private val binding get() = _binding!! + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + _binding = DownloadFolderNameDialogBinding.inflate(layoutInflater) + + initView() + + return Dialog(requireContext()).apply { + setContentView(binding.root) + window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT + } + } + + override fun onDestroy() { + super.onDestroy() + _binding = null + } + + private fun initView() { val galleryID = Cache.instances.let { if (it.size == 0) 1199708 else it.keys.elementAt((0 until it.size).random()) } val galleryBlock = runBlocking { Cache.getInstance(requireContext(), galleryID).getGalleryBlock() } - return layoutInflater.inflate(R.layout.dialog_download_folder_name, null).apply { - message.text = getString(R.string.settings_download_folder_name_message, formatMap.keys.toString(), galleryBlock?.formatDownloadFolder() ?: "") - edittext.setText(Preferences["download_folder_name", "[-id-] -title-"]) - edittext.addTextChangedListener { - message.text = getString(R.string.settings_download_folder_name_message, formatMap.keys.toString(), galleryBlock?.formatDownloadFolderTest(it.toString()) ?: "") + binding.message.text = getString(R.string.settings_download_folder_name_message, formatMap.keys.toString(), galleryBlock?.formatDownloadFolder() ?: "") + binding.edittext.setText(Preferences["download_folder_name", "[-id-] -title-"]) + binding.edittext.addTextChangedListener { + binding.message.text = requireContext().getString(R.string.settings_download_folder_name_message, formatMap.keys.toString(), galleryBlock?.formatDownloadFolderTest(it.toString()) ?: "") + } + binding.okButton.setOnClickListener { + val newValue = binding.edittext.text.toString() + + if ((newValue as? String)?.contains("/") != false) { + Snackbar.make(binding.root, R.string.settings_invalid_download_folder_name, Snackbar.LENGTH_SHORT).show() + return@setOnClickListener } - ok_button.setOnClickListener { - val newValue = edittext.text.toString() - if ((newValue as? String)?.contains("/") != false) { - Snackbar.make(this, R.string.settings_invalid_download_folder_name, Snackbar.LENGTH_SHORT).show() - return@setOnClickListener - } + Preferences["download_folder_name"] = binding.edittext.text.toString() - Preferences["download_folder_name"] = edittext.text.toString() - - dismiss() - } + dismiss() } } - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = - Dialog(requireContext()).apply { - setContentView(build()) - window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT - } - } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt index 4708a470..e9b83ef2 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt @@ -18,27 +18,24 @@ package xyz.quaver.pupil.ui.dialog -import android.annotation.SuppressLint import android.app.Activity import android.app.Dialog import android.content.Intent import android.os.Build import android.os.Bundle -import android.view.View -import android.widget.LinearLayout import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.fragment.app.DialogFragment import com.google.android.material.snackbar.Snackbar -import kotlinx.android.synthetic.main.dialog_download_folder_name.view.* -import kotlinx.android.synthetic.main.item_download_folder.view.* import net.rdrei.android.dirchooser.DirectoryChooserActivity import net.rdrei.android.dirchooser.DirectoryChooserConfig import xyz.quaver.io.FileX import xyz.quaver.io.util.toFile import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.DownloadLocationDialogBinding +import xyz.quaver.pupil.databinding.DownloadLocationItemBinding import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.byteToString import xyz.quaver.pupil.util.downloader.DownloadManager @@ -46,7 +43,11 @@ import xyz.quaver.pupil.util.migrate import java.io.File class DownloadLocationDialogFragment : DialogFragment() { - private val entries = mutableMapOf() + + private var _binding: DownloadLocationDialogBinding? = null + private val binding get() = _binding!! + + private val entries = mutableMapOf() private val requestDownloadFolderLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == Activity.RESULT_OK) { @@ -63,7 +64,7 @@ class DownloadLocationDialogFragment : DialogFragment() { context.contentResolver.takePersistableUriPermission(uri, takeFlags) if (kotlin.runCatching { FileX(context, uri).canWrite() }.getOrDefault(false)) { - entries[null]?.location_available?.text = uri.toFile(context)?.canonicalPath + entries[null]?.locationAvailable?.text = uri.toFile(context)?.canonicalPath Preferences["download_folder"] = uri.toString() } else { Snackbar.make( @@ -75,7 +76,7 @@ class DownloadLocationDialogFragment : DialogFragment() { val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } entries[key]!!.button.isChecked = true - if (key == null) entries[key]!!.location_available.text = downloadFolder + if (key == null) entries[key]!!.locationAvailable.text = downloadFolder } } } @@ -98,49 +99,44 @@ class DownloadLocationDialogFragment : DialogFragment() { val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } entries[key]!!.button.isChecked = true - if (key == null) entries[key]!!.location_available.text = downloadFolder + if (key == null) entries[key]!!.locationAvailable.text = downloadFolder } else { - entries[null]?.location_available?.text = directory + entries[null]?.locationAvailable?.text = directory Preferences["download_folder"] = File(directory).toURI().toString() } } } - @SuppressLint("InflateParams") - private fun build() : View? { - val context = context ?: return null - - val view = layoutInflater.inflate(R.layout.dialog_download_folder, null) as LinearLayout - - val externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null) + private fun initView() { + val externalFilesDirs = ContextCompat.getExternalFilesDirs(requireContext(), null) externalFilesDirs.forEachIndexed { index, dir -> dir ?: return@forEachIndexed - view.addView(layoutInflater.inflate(R.layout.item_download_folder, view, false).apply { - location_type.text = context.getString(when (index) { + DownloadLocationItemBinding.inflate(layoutInflater, binding.root, true).apply { + locationType.text = requireContext().getString(when (index) { 0 -> R.string.settings_download_folder_internal else -> R.string.settings_download_folder_removable }) - location_available.text = context.getString( + locationAvailable.text = requireContext().getString( R.string.settings_download_folder_available, byteToString(dir.freeSpace) ) - setOnClickListener { - entries.values.forEach { - it.button.isChecked = false + root.setOnClickListener { + entries.values.forEach { _ -> + button.isChecked = false } button.performClick() Preferences["download_folder"] = dir.toUri().toString() } entries[dir] = this - }) + } } - view.addView(layoutInflater.inflate(R.layout.item_download_folder, view, false).apply { - location_type.text = context.getString(R.string.settings_download_folder_custom) - setOnClickListener { + DownloadLocationItemBinding.inflate(layoutInflater, binding.root, true).apply { + locationType.text = requireContext().getString(R.string.settings_download_folder_custom) + root.setOnClickListener { entries.values.forEach { it.button.isChecked = false } @@ -166,31 +162,35 @@ class DownloadLocationDialogFragment : DialogFragment() { } } entries[null] = this - }) + } - val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath + val downloadFolder = DownloadManager.getInstance(requireContext()).downloadFolder.canonicalPath val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } entries[key]!!.button.isChecked = true - if (key == null) entries[key]!!.location_available.text = downloadFolder - - return view + if (key == null) entries[key]!!.locationAvailable.text = downloadFolder } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val builder = AlertDialog.Builder(requireContext()) + _binding = DownloadLocationDialogBinding.inflate(layoutInflater) - builder - .setTitle(R.string.settings_download_folder) - .setView(build()) - .setPositiveButton(requireContext().getText(android.R.string.ok)) { _, _ -> + initView() + + return AlertDialog.Builder(requireContext()).apply { + setTitle(R.string.settings_download_folder) + setView(binding.root) + setPositiveButton(requireContext().getText(android.R.string.ok)) { _, _ -> if (Preferences["download_folder", ""].isEmpty()) - Preferences["download_folder"] = context?.getExternalFilesDir(null)?.toUri()?.toString() ?: "" + Preferences["download_folder"] = context.getExternalFilesDir(null)?.toUri()?.toString() ?: "" DownloadManager.getInstance(requireContext()).migrate() } - isCancelable = false + isCancelable = false + }.create() + } - return builder.create() + override fun onDestroy() { + super.onDestroy() + _binding = null } } \ No newline at end of file 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 e819cacd..693c208d 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 @@ -22,7 +22,6 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout.LayoutParams @@ -32,10 +31,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.snackbar.Snackbar -import kotlinx.android.synthetic.main.dialog_gallery.* -import kotlinx.android.synthetic.main.dialog_gallery_details.view.* -import kotlinx.android.synthetic.main.dialog_gallery_dotindicator.view.* -import kotlinx.android.synthetic.main.item_gallery_details.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -45,6 +40,7 @@ import xyz.quaver.hitomi.getGallery import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.GalleryBlockAdapter import xyz.quaver.pupil.adapters.ThumbnailPageAdapter +import xyz.quaver.pupil.databinding.* import xyz.quaver.pupil.favoriteTags import xyz.quaver.pupil.types.Tag import xyz.quaver.pupil.ui.ReaderActivity @@ -59,9 +55,12 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( val onChipClickedHandler = ArrayList<((Tag) -> (Unit))>() + private lateinit var binding: GalleryDialogBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.dialog_gallery) + binding = GalleryDialogBinding.inflate(layoutInflater) + setContentView(binding.root) window?.attributes.apply { this ?: return@apply @@ -70,7 +69,7 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( height = LayoutParams.MATCH_PARENT } - with(gallery_fab) { + with(binding.fab) { setImageDrawable(ContextCompat.getDrawable(context, R.drawable.arrow_right)) setOnClickListener { context.startActivity(Intent(context, ReaderActivity::class.java).apply { @@ -83,12 +82,12 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( try { val gallery = getGallery(galleryID) - gallery_cover.post { - gallery_progressbar.visibility = View.GONE - gallery_title.text = gallery.title - gallery_artist.text = gallery.artists.joinToString(", ") { it.wordCapitalize() } + launch (Dispatchers.Main) { + binding.progressbar.visibility = View.GONE + binding.title.text = gallery.title + binding.artist.text = gallery.artists.joinToString(", ") { it.wordCapitalize() } - with(gallery_type) { + with(binding.type) { text = gallery.type.wordCapitalize() setOnClickListener { gallery.type.let { @@ -105,14 +104,14 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( } } - gallery_cover.showImage(Uri.parse(gallery.cover)) + binding.cover.showImage(Uri.parse(gallery.cover)) addDetails(gallery) addThumbnails(gallery) addRelated(gallery) } } catch (e: Exception) { - Snackbar.make(gallery_layout, R.string.unable_to_connect, Snackbar.LENGTH_INDEFINITE).apply { + Snackbar.make(binding.root, R.string.unable_to_connect, Snackbar.LENGTH_INDEFINITE).apply { if (Locale.getDefault().language == "ko") setAction(context.getText(R.string.https_text)) { context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(context.getString(R.string.https)))) @@ -123,10 +122,8 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( } private fun addDetails(gallery: Gallery) { - val inflater = LayoutInflater.from(context) - - inflater.inflate(R.layout.dialog_gallery_details, gallery_contents, false).apply { - gallery_details.setText(R.string.gallery_details) + GalleryDialogDetailsBinding.inflate(layoutInflater, binding.contents, true).apply { + type.setText(R.string.gallery_details) listOf( R.string.gallery_artists, @@ -163,13 +160,13 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( } ) ).filter { - (_, content) -> content.isNotEmpty() + (_, content) -> content.isNotEmpty() }.forEach { (title, content) -> - inflater.inflate(R.layout.item_gallery_details, gallery_details_contents, false).apply { - gallery_details_type.setText(title) + GalleryDialogTagsBinding.inflate(layoutInflater, contents, true).apply { + type.setText(title) content.forEach { tag -> - gallery_details_tags.addView( + tags.addView( TagChip(context, tag).apply { setOnClickListener { onChipClickedHandler.forEach { handler -> @@ -179,41 +176,33 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( } ) } - }.let { - gallery_details_contents.addView(it) } } - }.let { - gallery_contents.addView(it) } } private fun addThumbnails(gallery: Gallery) { - val inflater = LayoutInflater.from(context) - - inflater.inflate(R.layout.dialog_gallery_details, gallery_contents, false).apply { - gallery_details.setText(R.string.gallery_thumbnails) + GalleryDialogDetailsBinding.inflate(layoutInflater, binding.contents, true).apply { + type.setText(R.string.gallery_thumbnails) val pager = ViewPager2(context).apply { adapter = ThumbnailPageAdapter(gallery.thumbnails) layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) } - gallery_details_contents.addView( + contents.addView( pager, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) ) - LayoutInflater.from(context).inflate(R.layout.dialog_gallery_dotindicator, gallery_details_contents) - - gallery_dotindicator.setViewPager2(pager) - }.let { - gallery_contents.addView(it) + // TODO: Change to direct allocation + GalleryDialogDotindicatorBinding.inflate(layoutInflater, contents, true).apply { + dotindicator.setViewPager2(pager) + } } } private fun addRelated(gallery: Gallery) { - val inflater = LayoutInflater.from(context) val galleries = ArrayList() val adapter = GalleryBlockAdapter(galleries).apply { @@ -224,8 +213,8 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( } } - inflater.inflate(R.layout.dialog_gallery_details, gallery_contents, false).apply { - gallery_details.setText(R.string.gallery_related) + GalleryDialogDetailsBinding.inflate(layoutInflater, binding.contents, true).apply { + type.setText(R.string.gallery_related) RecyclerView(context).apply { layoutManager = LinearLayoutManager(context) @@ -247,22 +236,18 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog( true } } - }.let { - gallery_details_contents.addView(it, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)) } - }.let { - gallery_contents.addView(it) - } - CoroutineScope(Dispatchers.IO).launch { - gallery.related.forEach { galleryID -> - Cache.getInstance(context, galleryID).getGalleryBlock()?.let { - galleries.add(galleryID) + CoroutineScope(Dispatchers.IO).launch { + gallery.related.forEach { galleryID -> + Cache.getInstance(context, galleryID).getGalleryBlock()?.let { + galleries.add(galleryID) + } } - } - withContext(Dispatchers.Main) { - adapter.notifyDataSetChanged() + withContext(Dispatchers.Main) { + adapter.notifyDataSetChanged() + } } } } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/ProxyDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/ProxyDialog.kt index e19392b9..c0d4a093 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/ProxyDialog.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/ProxyDialog.kt @@ -18,23 +18,19 @@ package xyz.quaver.pupil.ui.dialog -import android.annotation.SuppressLint -import android.app.Dialog import android.content.Context import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.appcompat.app.AlertDialog -import kotlinx.android.synthetic.main.dialog_proxy.view.* import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import xyz.quaver.pupil.R import xyz.quaver.pupil.client import xyz.quaver.pupil.clientBuilder import xyz.quaver.pupil.clientHolder +import xyz.quaver.pupil.databinding.ProxyDialogBinding import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.ProxyInfo import xyz.quaver.pupil.util.getProxyInfo @@ -43,33 +39,35 @@ import java.net.Proxy class ProxyDialog(context: Context) : AlertDialog(context) { - override fun onCreate(savedInstanceState: Bundle?) { - setView(build()) + private lateinit var binding: ProxyDialogBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + binding = ProxyDialogBinding.inflate(layoutInflater) + setView(binding.root) + + initView() } - @SuppressLint("InflateParams") - private fun build() : View { + private fun initView() { val proxyInfo = getProxyInfo() - val view = LayoutInflater.from(context).inflate(R.layout.dialog_proxy, null) - val enabler = { enable: Boolean -> - view?.proxy_addr?.isEnabled = enable - view?.proxy_port?.isEnabled = enable - view?.proxy_username?.isEnabled = enable - view?.proxy_password?.isEnabled = enable + binding.addr.isEnabled = enable + binding.port.isEnabled = enable + binding.username.isEnabled = enable + binding.password.isEnabled = enable if (!enable) { - view?.proxy_addr?.text = null - view?.proxy_port?.text = null - view?.proxy_username?.text = null - view?.proxy_password?.text = null + binding.addr.text = null + binding.port.text = null + binding.username.text = null + binding.password.text = null } } - with(view.proxy_type_selector) { + with(binding.typeSelector) { adapter = ArrayAdapter( context, android.R.layout.simple_spinner_dropdown_item, @@ -87,29 +85,29 @@ class ProxyDialog(context: Context) : AlertDialog(context) { } } - view.proxy_addr.setText(proxyInfo.host) - view.proxy_port.setText(proxyInfo.port?.toString()) - view.proxy_username.setText(proxyInfo.username) - view.proxy_password.setText(proxyInfo.password) + binding.addr.setText(proxyInfo.host) + binding.port.setText(proxyInfo.port?.toString()) + binding.username.setText(proxyInfo.username) + binding.password.setText(proxyInfo.password) enabler.invoke(proxyInfo.type != Proxy.Type.DIRECT) - view.proxy_cancel.setOnClickListener { + binding.cancelButton.setOnClickListener { dismiss() } - view.proxy_ok.setOnClickListener { - val type = Proxy.Type.values()[view.proxy_type_selector.selectedItemPosition] - val addr = view.proxy_addr.text?.toString() - val port = view.proxy_port.text?.toString()?.toIntOrNull() - val username = view.proxy_username.text?.toString() - val password = view.proxy_password.text?.toString() + binding.okButton.setOnClickListener { + val type = Proxy.Type.values()[binding.typeSelector.selectedItemPosition] + val addr = binding.addr.text?.toString() + val port = binding.port.text?.toString()?.toIntOrNull() + val username = binding.username.text?.toString() + val password = binding.password.text?.toString() if (type != Proxy.Type.DIRECT) { if (addr == null || addr.isEmpty()) - view.proxy_addr.error = context.getText(R.string.proxy_dialog_error) + binding.addr.error = context.getText(R.string.proxy_dialog_error) if (port == null) - view.proxy_port.error = context.getText(R.string.proxy_dialog_error) + binding.port.error = context.getText(R.string.proxy_dialog_error) if (addr == null || addr.isEmpty() || port == null) return@setOnClickListener @@ -126,8 +124,6 @@ class ProxyDialog(context: Context) : AlertDialog(context) { dismiss() } - - return view } } \ 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 index b058840d..5a8d3a7f 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/PINLockFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/PINLockFragment.kt @@ -24,30 +24,34 @@ 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 +import xyz.quaver.pupil.databinding.PinLockFragmentBinding -class PINLockFragment : Fragment(), PinLockListener { +class PINLockFragment : Fragment() { + + private var _binding: PinLockFragmentBinding? = null + val binding get() = _binding!! 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 onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + _binding = PinLockFragmentBinding.inflate(inflater, container, false) + + binding.pinLockView.attachIndicatorDots(binding.indicatorDots) + binding.pinLockView.setPinLockListener(object: PinLockListener { + override fun onComplete(p0: String?) { + onPINEntered?.invoke(p0 ?: "") + } + + override fun onEmpty() {} + override fun onPinChange(p0: Int, p1: String?) {} + }) + + return binding.root } - override fun onComplete(pin: String?) { - onPINEntered?.invoke(pin!!) - } - - override fun onEmpty() { - - } - - override fun onPinChange(pinLength: Int, intermediatePin: String?) { - + override fun onDestroy() { + super.onDestroy() + _binding = null } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/PatternLockFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/PatternLockFragment.kt index a500d898..69d48f4a 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/PatternLockFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/PatternLockFragment.kt @@ -26,38 +26,36 @@ import androidx.fragment.app.Fragment import com.andrognito.patternlockview.PatternLockView import com.andrognito.patternlockview.listener.PatternLockViewListener import com.andrognito.patternlockview.utils.PatternLockUtils -import kotlinx.android.synthetic.main.fragment_pattern_lock.* -import kotlinx.android.synthetic.main.fragment_pattern_lock.view.* -import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.PatternLockFragmentBinding -class PatternLockFragment : Fragment(), PatternLockViewListener { +class PatternLockFragment : Fragment() { + + private var _binding: PatternLockFragmentBinding? = null + val binding get() = _binding!! var onPatternDrawn: ((String) -> Unit)? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_pattern_lock, container, false).apply { - lock_pattern_view.addPatternLockListener(this@PatternLockFragment) - } + ): View { + _binding = PatternLockFragmentBinding.inflate(inflater, container, false) + binding.patternLockView.addPatternLockListener(object: PatternLockViewListener { + override fun onComplete(pattern: MutableList?) { + val password = PatternLockUtils.patternToMD5(binding.patternLockView, pattern) + onPatternDrawn?.invoke(password) + } + + override fun onCleared() {} + override fun onProgress(progressPattern: MutableList?) {} + override fun onStarted() {} + }) + return binding.root } - override fun onCleared() { - - } - - override fun onComplete(pattern: MutableList?) { - val password = PatternLockUtils.patternToMD5(lock_pattern_view, pattern) - onPatternDrawn?.invoke(password) - } - - override fun onProgress(progressPattern: MutableList?) { - - } - - override fun onStarted() { - + override fun onDestroy() { + super.onDestroy() + _binding = null } } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/view/ProgressCard.kt b/app/src/main/java/xyz/quaver/pupil/ui/view/ProgressCard.kt index c66bbda1..0b5a32b1 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/view/ProgressCard.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/view/ProgressCard.kt @@ -2,14 +2,14 @@ package xyz.quaver.pupil.ui.view import android.content.Context import android.util.AttributeSet +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.cardview.widget.CardView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat -import kotlinx.android.synthetic.main.view_progress_card.view.* import xyz.quaver.pupil.R +import xyz.quaver.pupil.databinding.ProgressCardViewBinding class ProgressCard @JvmOverloads constructor(context: Context, attr: AttributeSet? = null, defStyle: Int = R.attr.cardViewStyle) : CardView(context, attr, defStyle) { @@ -29,35 +29,35 @@ class ProgressCard @JvmOverloads constructor(context: Context, attr: AttributeSe Type.DOWNLOAD -> R.color.material_green_a700 }.let { val color = ContextCompat.getColor(context, it) - DrawableCompat.setTint(progressbar.progressDrawable, color) + DrawableCompat.setTint(binding.progressbar.progressDrawable, color) } } var progress: Int - get() = progressbar?.progress ?: 0 + get() = binding.progressbar.progress set(value) { - progressbar?.progress = value + binding.progressbar.progress = value } var max: Int - get() = progressbar?.max ?: 0 + get() = binding.progressbar.max set(value) { - progressbar?.max = value + binding.progressbar.max = value - progressbar.visibility = + binding.progressbar.visibility = if (value == 0) GONE else VISIBLE } - init { - inflate(context, R.layout.view_progress_card, this) + val binding = ProgressCardViewBinding.inflate(LayoutInflater.from(context), this) - content.setOnClickListener { + init { + binding.content.setOnClickListener { performClick() } - content.setOnLongClickListener { + binding.content.setOnLongClickListener { performLongClick() } } @@ -66,7 +66,7 @@ class ProgressCard @JvmOverloads constructor(context: Context, attr: AttributeSe if (childCount == 0) super.addView(child, index, params) else - content.addView(child, index, params) + binding.content.addView(child, index, params) } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_default_query.xml b/app/src/main/res/layout/default_query_dialog.xml similarity index 82% rename from app/src/main/res/layout/dialog_default_query.xml rename to app/src/main/res/layout/default_query_dialog.xml index 175438a4..968fde0b 100644 --- a/app/src/main/res/layout/dialog_default_query.xml +++ b/app/src/main/res/layout/default_query_dialog.xml @@ -28,7 +28,7 @@ tools:ignore="Autofill" android:inputType="text" android:hint="@string/settings_default_query" - android:id="@+id/default_query_dialog_edittext" + android:id="@+id/edittext" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" @@ -36,10 +36,10 @@ app:layout_constraintEnd_toEndOf="parent"/> @@ -49,14 +49,14 @@ android:text="@string/default_query_dialog_language"/> @@ -75,14 +75,14 @@ android:text="@string/default_query_dialog_filter_BL"/> @@ -101,7 +101,7 @@ android:text="@string/default_query_dialog_filter_guro"/> @@ -115,7 +115,7 @@ android:paddingStart="0dp" android:paddingEnd="8dp" android:paddingRight="8dp" - app:layout_constraintTop_toBottomOf="@id/default_query_dialog_guro_layout" + app:layout_constraintTop_toBottomOf="@id/guro_layout" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"> @@ -126,7 +126,7 @@ android:text="@string/default_query_dialog_filter_loli"/> diff --git a/app/src/main/res/layout/dialog_download_folder_name.xml b/app/src/main/res/layout/download_folder_name_dialog.xml similarity index 100% rename from app/src/main/res/layout/dialog_download_folder_name.xml rename to app/src/main/res/layout/download_folder_name_dialog.xml diff --git a/app/src/main/res/layout/dialog_download_folder.xml b/app/src/main/res/layout/download_location_dialog.xml similarity index 100% rename from app/src/main/res/layout/dialog_download_folder.xml rename to app/src/main/res/layout/download_location_dialog.xml diff --git a/app/src/main/res/layout/item_download_folder.xml b/app/src/main/res/layout/download_location_item.xml similarity index 100% rename from app/src/main/res/layout/item_download_folder.xml rename to app/src/main/res/layout/download_location_item.xml diff --git a/app/src/main/res/layout/dialog_gallery.xml b/app/src/main/res/layout/gallery_dialog.xml similarity index 82% rename from app/src/main/res/layout/dialog_gallery.xml rename to app/src/main/res/layout/gallery_dialog.xml index b55e780b..cb7c017f 100644 --- a/app/src/main/res/layout/dialog_gallery.xml +++ b/app/src/main/res/layout/gallery_dialog.xml @@ -19,14 +19,13 @@ @@ -41,34 +40,34 @@ android:padding="8dp"> @@ -76,15 +75,15 @@ + app:layout_constraintTop_toBottomOf="@id/artist" + app:layout_constraintBottom_toTopOf="@id/type"/> @@ -100,7 +99,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior"> @@ -112,7 +111,7 @@ android:layout_height="match_parent"> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_gallery_details.xml b/app/src/main/res/layout/gallery_dialog_details.xml similarity index 92% rename from app/src/main/res/layout/dialog_gallery_details.xml rename to app/src/main/res/layout/gallery_dialog_details.xml index 3e7d4d21..1c3448b7 100644 --- a/app/src/main/res/layout/dialog_gallery_details.xml +++ b/app/src/main/res/layout/gallery_dialog_details.xml @@ -25,14 +25,14 @@ android:padding="8dp"> diff --git a/app/src/main/res/layout/dialog_gallery_dotindicator.xml b/app/src/main/res/layout/gallery_dialog_dotindicator.xml similarity index 95% rename from app/src/main/res/layout/dialog_gallery_dotindicator.xml rename to app/src/main/res/layout/gallery_dialog_dotindicator.xml index b1f5de7b..02b91987 100644 --- a/app/src/main/res/layout/dialog_gallery_dotindicator.xml +++ b/app/src/main/res/layout/gallery_dialog_dotindicator.xml @@ -25,7 +25,7 @@ android:layout_margin="8dp"> diff --git a/app/src/main/res/layout/item_galleryblock.xml b/app/src/main/res/layout/galleryblock_item.xml similarity index 100% rename from app/src/main/res/layout/item_galleryblock.xml rename to app/src/main/res/layout/galleryblock_item.xml diff --git a/app/src/main/res/layout/activity_lock.xml b/app/src/main/res/layout/lock_activity.xml similarity index 94% rename from app/src/main/res/layout/activity_lock.xml rename to app/src/main/res/layout/lock_activity.xml index db5b51be..a19341ad 100644 --- a/app/src/main/res/layout/activity_lock.xml +++ b/app/src/main/res/layout/lock_activity.xml @@ -41,7 +41,7 @@ app:layout_constraintBottom_toTopOf="@id/lock_button_layout"> - @@ -43,7 +43,7 @@ app:popupDrawable="@android:color/transparent">