mirror of
https://github.com/Aviortheking/Neo-Store.git
synced 2025-04-23 19:32:16 +00:00
Clean up
This commit is contained in:
parent
7c759cd937
commit
3b4bb5d869
@ -1,56 +0,0 @@
|
|||||||
package com.machiav3lli.fdroid.graphics
|
|
||||||
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.graphics.ColorFilter
|
|
||||||
import android.graphics.Rect
|
|
||||||
import android.graphics.drawable.Drawable
|
|
||||||
|
|
||||||
open class DrawableWrapper(val drawable: Drawable) : Drawable() {
|
|
||||||
init {
|
|
||||||
drawable.callback = object : Callback {
|
|
||||||
override fun invalidateDrawable(who: Drawable) {
|
|
||||||
callback?.invalidateDrawable(who)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {
|
|
||||||
callback?.scheduleDrawable(who, what, `when`)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun unscheduleDrawable(who: Drawable, what: Runnable) {
|
|
||||||
callback?.unscheduleDrawable(who, what)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBoundsChange(bounds: Rect) {
|
|
||||||
drawable.bounds = bounds
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getIntrinsicWidth(): Int = drawable.intrinsicWidth
|
|
||||||
override fun getIntrinsicHeight(): Int = drawable.intrinsicHeight
|
|
||||||
override fun getMinimumWidth(): Int = drawable.minimumWidth
|
|
||||||
override fun getMinimumHeight(): Int = drawable.minimumHeight
|
|
||||||
|
|
||||||
override fun draw(canvas: Canvas) {
|
|
||||||
drawable.draw(canvas)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getAlpha(): Int {
|
|
||||||
return drawable.alpha
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setAlpha(alpha: Int) {
|
|
||||||
drawable.alpha = alpha
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getColorFilter(): ColorFilter? {
|
|
||||||
return drawable.colorFilter
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setColorFilter(colorFilter: ColorFilter?) {
|
|
||||||
drawable.colorFilter = colorFilter
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Deprecated in Java", ReplaceWith("drawable.opacity"))
|
|
||||||
override fun getOpacity(): Int = drawable.opacity
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package com.machiav3lli.fdroid.graphics
|
|
||||||
|
|
||||||
import android.graphics.Rect
|
|
||||||
import android.graphics.drawable.Drawable
|
|
||||||
import kotlin.math.roundToInt
|
|
||||||
|
|
||||||
class PaddingDrawable(drawable: Drawable, private val factor: Float) : DrawableWrapper(drawable) {
|
|
||||||
override fun getIntrinsicWidth(): Int = (factor * super.getIntrinsicWidth()).roundToInt()
|
|
||||||
override fun getIntrinsicHeight(): Int = (factor * super.getIntrinsicHeight()).roundToInt()
|
|
||||||
|
|
||||||
override fun onBoundsChange(bounds: Rect) {
|
|
||||||
val width = (bounds.width() / factor).roundToInt()
|
|
||||||
val height = (bounds.height() / factor).roundToInt()
|
|
||||||
val left = (bounds.width() - width) / 2
|
|
||||||
val top = (bounds.height() - height) / 2
|
|
||||||
drawable.setBounds(
|
|
||||||
bounds.left + left, bounds.top + top,
|
|
||||||
bounds.left + left + width, bounds.top + top + height
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,272 +0,0 @@
|
|||||||
package com.machiav3lli.fdroid.screen
|
|
||||||
|
|
||||||
import android.app.Dialog
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.PixelFormat
|
|
||||||
import android.graphics.drawable.Drawable
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.view.WindowManager
|
|
||||||
import androidx.core.graphics.ColorUtils
|
|
||||||
import androidx.core.view.WindowCompat
|
|
||||||
import androidx.core.view.WindowInsetsCompat
|
|
||||||
import androidx.core.view.WindowInsetsControllerCompat
|
|
||||||
import androidx.fragment.app.DialogFragment
|
|
||||||
import androidx.fragment.app.FragmentManager
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import androidx.viewpager2.widget.MarginPageTransformer
|
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
|
||||||
import coil.load
|
|
||||||
import com.google.android.material.imageview.ShapeableImageView
|
|
||||||
import com.machiav3lli.fdroid.R
|
|
||||||
import com.machiav3lli.fdroid.database.DatabaseX
|
|
||||||
import com.machiav3lli.fdroid.database.entity.Repository
|
|
||||||
import com.machiav3lli.fdroid.entity.Screenshot
|
|
||||||
import com.machiav3lli.fdroid.graphics.PaddingDrawable
|
|
||||||
import com.machiav3lli.fdroid.network.CoilDownloader
|
|
||||||
import com.machiav3lli.fdroid.utility.RxUtils
|
|
||||||
import com.machiav3lli.fdroid.utility.extension.android.Android
|
|
||||||
import com.machiav3lli.fdroid.utility.extension.resources.getColorFromAttr
|
|
||||||
import com.machiav3lli.fdroid.utility.extension.resources.getDrawableCompat
|
|
||||||
import com.machiav3lli.fdroid.utility.extension.resources.sizeScaled
|
|
||||||
import com.machiav3lli.fdroid.widget.StableRecyclerAdapter
|
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.rxjava3.core.Observable
|
|
||||||
import io.reactivex.rxjava3.disposables.Disposable
|
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
|
||||||
|
|
||||||
class ScreenshotsFragment() : DialogFragment() {
|
|
||||||
companion object {
|
|
||||||
private const val EXTRA_PACKAGE_NAME = "packageName"
|
|
||||||
private const val EXTRA_REPOSITORY_ID = "repositoryId"
|
|
||||||
private const val EXTRA_IDENTIFIER = "identifier"
|
|
||||||
|
|
||||||
private const val STATE_IDENTIFIER = "identifier"
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(packageName: String, repositoryId: Long, identifier: String) : this() {
|
|
||||||
arguments = Bundle().apply {
|
|
||||||
putString(EXTRA_PACKAGE_NAME, packageName)
|
|
||||||
putLong(EXTRA_REPOSITORY_ID, repositoryId)
|
|
||||||
putString(EXTRA_IDENTIFIER, identifier)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun show(fragmentManager: FragmentManager) {
|
|
||||||
show(fragmentManager, this::class.java.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
private var viewPager: ViewPager2? = null
|
|
||||||
|
|
||||||
private var productDisposable: Disposable? = null
|
|
||||||
|
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
|
||||||
val packageName = requireArguments().getString(EXTRA_PACKAGE_NAME)!!
|
|
||||||
val repositoryId = requireArguments().getLong(EXTRA_REPOSITORY_ID)
|
|
||||||
val dialog = Dialog(requireContext(), R.style.Theme_Main_Amoled)
|
|
||||||
|
|
||||||
val window = dialog.window
|
|
||||||
val decorView = window?.decorView
|
|
||||||
val db = DatabaseX.getInstance(requireContext())
|
|
||||||
|
|
||||||
if (window != null) {
|
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
val background = dialog.context.getColorFromAttr(R.attr.colorSurface).defaultColor
|
|
||||||
decorView?.setBackgroundColor(
|
|
||||||
ColorUtils.blendARGB(
|
|
||||||
0x00FFFFFF and background,
|
|
||||||
background,
|
|
||||||
0.9f
|
|
||||||
)
|
|
||||||
)
|
|
||||||
decorView?.setPadding(0, 0, 0, 0)
|
|
||||||
if (window != null) {
|
|
||||||
window.attributes = window.attributes.apply {
|
|
||||||
title = ScreenshotsFragment::class.java.name
|
|
||||||
format = PixelFormat.TRANSLUCENT
|
|
||||||
windowAnimations = run {
|
|
||||||
val typedArray = dialog.context.obtainStyledAttributes(
|
|
||||||
null, intArrayOf(android.R.attr.windowAnimationStyle),
|
|
||||||
android.R.attr.dialogTheme, 0
|
|
||||||
)
|
|
||||||
try {
|
|
||||||
typedArray.getResourceId(0, 0)
|
|
||||||
} finally {
|
|
||||||
typedArray.recycle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Android.sdk(28)) {
|
|
||||||
layoutInDisplayCutoutMode =
|
|
||||||
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
val toggleSystemUi = {
|
|
||||||
if (window != null && decorView != null) {
|
|
||||||
WindowInsetsControllerCompat(window, decorView).let { controller ->
|
|
||||||
controller.hide(WindowInsetsCompat.Type.statusBars())
|
|
||||||
controller.hide(WindowInsetsCompat.Type.navigationBars())
|
|
||||||
controller.systemBarsBehavior =
|
|
||||||
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val viewPager = ViewPager2(dialog.context)
|
|
||||||
viewPager.adapter = Adapter(packageName) { toggleSystemUi() }
|
|
||||||
viewPager.setPageTransformer(MarginPageTransformer(resources.sizeScaled(16)))
|
|
||||||
viewPager.viewTreeObserver.addOnGlobalLayoutListener {
|
|
||||||
(viewPager.adapter as Adapter).size = Pair(viewPager.width, viewPager.height)
|
|
||||||
}
|
|
||||||
dialog.addContentView(
|
|
||||||
viewPager, ViewGroup.LayoutParams(
|
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT
|
|
||||||
)
|
|
||||||
)
|
|
||||||
this.viewPager = viewPager
|
|
||||||
|
|
||||||
var restored = false
|
|
||||||
productDisposable = Observable.just(Unit)
|
|
||||||
//.concatWith(Database.observable(Database.Subject.Products)) // TODO have to be replaced like whole rxJava
|
|
||||||
.observeOn(Schedulers.io())
|
|
||||||
.flatMapSingle {
|
|
||||||
RxUtils.querySingle {
|
|
||||||
db.productDao.get(packageName).filterNotNull()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.map { it ->
|
|
||||||
Pair(
|
|
||||||
it.find { it.repositoryId == repositoryId },
|
|
||||||
db.repositoryDao.get(repositoryId)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe { it ->
|
|
||||||
val (product, repository) = it
|
|
||||||
val screenshots = product?.screenshots.orEmpty()
|
|
||||||
(viewPager.adapter as Adapter).update(viewPager, repository, screenshots)
|
|
||||||
if (!restored) {
|
|
||||||
restored = true
|
|
||||||
val identifier = savedInstanceState?.getString(STATE_IDENTIFIER)
|
|
||||||
?: requireArguments().getString(STATE_IDENTIFIER)
|
|
||||||
if (identifier != null) {
|
|
||||||
val index = screenshots.indexOfFirst { it.identifier == identifier }
|
|
||||||
if (index >= 0) {
|
|
||||||
viewPager.setCurrentItem(index, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return dialog
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroyView() {
|
|
||||||
super.onDestroyView()
|
|
||||||
|
|
||||||
viewPager = null
|
|
||||||
|
|
||||||
productDisposable?.dispose()
|
|
||||||
productDisposable = null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSaveInstanceState(outState: Bundle) {
|
|
||||||
super.onSaveInstanceState(outState)
|
|
||||||
|
|
||||||
val viewPager = viewPager
|
|
||||||
if (viewPager != null) {
|
|
||||||
val identifier = (viewPager.adapter as Adapter).getCurrentIdentifier(viewPager)
|
|
||||||
identifier?.let { outState.putString(STATE_IDENTIFIER, it) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Adapter(private val packageName: String, private val onClick: () -> Unit) :
|
|
||||||
StableRecyclerAdapter<Adapter.ViewType, RecyclerView.ViewHolder>() {
|
|
||||||
enum class ViewType { SCREENSHOT }
|
|
||||||
|
|
||||||
private class ViewHolder(context: Context) :
|
|
||||||
RecyclerView.ViewHolder(ShapeableImageView(context)) {
|
|
||||||
val image: ShapeableImageView
|
|
||||||
get() = itemView as ShapeableImageView
|
|
||||||
|
|
||||||
val placeholder: Drawable
|
|
||||||
|
|
||||||
init {
|
|
||||||
itemView.layoutParams = RecyclerView.LayoutParams(
|
|
||||||
RecyclerView.LayoutParams.MATCH_PARENT,
|
|
||||||
RecyclerView.LayoutParams.MATCH_PARENT
|
|
||||||
)
|
|
||||||
|
|
||||||
val placeholder =
|
|
||||||
itemView.context.getDrawableCompat(R.drawable.ic_photo_camera).mutate()
|
|
||||||
placeholder.setTint(itemView.context.getColorFromAttr(R.attr.colorSurface).defaultColor)
|
|
||||||
this.placeholder = PaddingDrawable(placeholder, 4f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var repository: Repository? = null
|
|
||||||
private var screenshots = emptyList<Screenshot>()
|
|
||||||
|
|
||||||
fun update(
|
|
||||||
viewPager: ViewPager2,
|
|
||||||
repository: Repository?,
|
|
||||||
screenshots: List<Screenshot>,
|
|
||||||
) {
|
|
||||||
this.repository = repository
|
|
||||||
this.screenshots = screenshots
|
|
||||||
notifyItemChanged(viewPager.currentItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
var size = Pair(0, 0)
|
|
||||||
set(value) {
|
|
||||||
if (field != value) {
|
|
||||||
field = value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getCurrentIdentifier(viewPager: ViewPager2): String? {
|
|
||||||
val position = viewPager.currentItem
|
|
||||||
return screenshots.getOrNull(position)?.identifier
|
|
||||||
}
|
|
||||||
|
|
||||||
override val viewTypeClass: Class<ViewType>
|
|
||||||
get() = ViewType::class.java
|
|
||||||
|
|
||||||
override fun getItemCount(): Int = screenshots.size
|
|
||||||
override fun getItemDescriptor(position: Int): String = screenshots[position].identifier
|
|
||||||
override fun getItemEnumViewType(position: Int): ViewType = ViewType.SCREENSHOT
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(
|
|
||||||
parent: ViewGroup,
|
|
||||||
viewType: ViewType,
|
|
||||||
): RecyclerView.ViewHolder {
|
|
||||||
return ViewHolder(parent.context).apply {
|
|
||||||
itemView.setOnClickListener { onClick() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
|
||||||
holder as ViewHolder
|
|
||||||
val screenshot = screenshots[position]
|
|
||||||
val (width, height) = size
|
|
||||||
repository?.let {
|
|
||||||
holder.image.load(
|
|
||||||
CoilDownloader.createScreenshotUri(
|
|
||||||
it,
|
|
||||||
packageName,
|
|
||||||
screenshot
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
placeholder(holder.placeholder)
|
|
||||||
error(holder.placeholder)
|
|
||||||
size(width, height)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,12 +3,10 @@ package com.machiav3lli.fdroid.ui.compose.utils
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import com.machiav3lli.fdroid.database.entity.Release
|
import com.machiav3lli.fdroid.database.entity.Release
|
||||||
import com.machiav3lli.fdroid.entity.ActionState
|
import com.machiav3lli.fdroid.entity.ActionState
|
||||||
import com.machiav3lli.fdroid.entity.Screenshot
|
|
||||||
|
|
||||||
interface Callbacks {
|
interface Callbacks {
|
||||||
fun onActionClick(action: ActionState?)
|
fun onActionClick(action: ActionState?)
|
||||||
fun onPermissionsClick(group: String?, permissions: List<String>)
|
fun onPermissionsClick(group: String?, permissions: List<String>)
|
||||||
fun onScreenshotClick(screenshot: Screenshot)
|
|
||||||
fun onReleaseClick(release: Release)
|
fun onReleaseClick(release: Release)
|
||||||
fun onUriClick(uri: Uri, shouldConfirm: Boolean): Boolean
|
fun onUriClick(uri: Uri, shouldConfirm: Boolean): Boolean
|
||||||
}
|
}
|
@ -63,11 +63,9 @@ import com.machiav3lli.fdroid.entity.ActionState
|
|||||||
import com.machiav3lli.fdroid.entity.AntiFeature
|
import com.machiav3lli.fdroid.entity.AntiFeature
|
||||||
import com.machiav3lli.fdroid.entity.DonateType
|
import com.machiav3lli.fdroid.entity.DonateType
|
||||||
import com.machiav3lli.fdroid.entity.DownloadState
|
import com.machiav3lli.fdroid.entity.DownloadState
|
||||||
import com.machiav3lli.fdroid.entity.Screenshot
|
|
||||||
import com.machiav3lli.fdroid.installer.AppInstaller
|
import com.machiav3lli.fdroid.installer.AppInstaller
|
||||||
import com.machiav3lli.fdroid.network.CoilDownloader
|
import com.machiav3lli.fdroid.network.CoilDownloader
|
||||||
import com.machiav3lli.fdroid.screen.MessageDialog
|
import com.machiav3lli.fdroid.screen.MessageDialog
|
||||||
import com.machiav3lli.fdroid.screen.ScreenshotsFragment
|
|
||||||
import com.machiav3lli.fdroid.service.Connection
|
import com.machiav3lli.fdroid.service.Connection
|
||||||
import com.machiav3lli.fdroid.service.DownloadService
|
import com.machiav3lli.fdroid.service.DownloadService
|
||||||
import com.machiav3lli.fdroid.ui.activities.MainActivityX
|
import com.machiav3lli.fdroid.ui.activities.MainActivityX
|
||||||
@ -273,25 +271,6 @@ class AppSheetX() : FullscreenBottomSheetDialogFragment(), Callbacks {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onScreenshotClick(screenshot: Screenshot) {
|
|
||||||
val pair = viewModel.productRepos.asSequence()
|
|
||||||
.map { it ->
|
|
||||||
Pair(
|
|
||||||
it.second,
|
|
||||||
it.first.screenshots.find { it === screenshot }?.identifier
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.filter { it.second != null }.firstOrNull()
|
|
||||||
if (pair != null) {
|
|
||||||
val (repository, identifier) = pair
|
|
||||||
if (identifier != null) {
|
|
||||||
ScreenshotsFragment(packageName, repository.id, identifier).show(
|
|
||||||
childFragmentManager
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onReleaseClick(release: Release) {
|
override fun onReleaseClick(release: Release) {
|
||||||
val installedItem = viewModel.installedItem.value
|
val installedItem = viewModel.installedItem.value
|
||||||
when {
|
when {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user