From acc5d7866456c67bb9687d1d21ef4b807070a228 Mon Sep 17 00:00:00 2001 From: LooKeR Date: Tue, 26 Oct 2021 15:08:34 +0530 Subject: [PATCH] Add: Long Press on Source Icon to copy link Fix: Installer Spamming coroutines Remove: Unused Variables and methods/functions --- .../looker/droidify/installer/AppInstaller.kt | 26 ++++++++----------- .../droidify/installer/BaseInstaller.kt | 1 + .../droidify/installer/RootInstaller.kt | 21 ++++++++------- .../looker/droidify/screen/ProductAdapter.kt | 7 ++--- .../looker/droidify/screen/ProductFragment.kt | 13 +++++----- .../looker/droidify/screen/ScreenFragment.kt | 6 +++++ .../looker/droidify/screen/TabsFragment.kt | 9 +------ src/main/res/layout/fragment.xml | 2 +- 8 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/installer/AppInstaller.kt b/src/main/kotlin/com/looker/droidify/installer/AppInstaller.kt index 3ea6b0c5..fca683a6 100644 --- a/src/main/kotlin/com/looker/droidify/installer/AppInstaller.kt +++ b/src/main/kotlin/com/looker/droidify/installer/AppInstaller.kt @@ -2,8 +2,6 @@ package com.looker.droidify.installer import android.content.Context import com.looker.droidify.utility.Utils.rootInstallerEnabled -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext abstract class AppInstaller { abstract val defaultInstaller: BaseInstaller? @@ -11,21 +9,19 @@ abstract class AppInstaller { companion object { @Volatile private var INSTANCE: AppInstaller? = null - suspend fun getInstance(context: Context?): AppInstaller? { + fun getInstance(context: Context?): AppInstaller? { if (INSTANCE == null) { - withContext(Dispatchers.IO) { - synchronized(AppInstaller::class.java) { - if (INSTANCE == null) { - context?.let { - INSTANCE = object : AppInstaller() { - override val defaultInstaller: BaseInstaller - get() { - return when (rootInstallerEnabled) { - false -> DefaultInstaller(it) - true -> RootInstaller(it) - } + synchronized(AppInstaller::class.java) { + if (INSTANCE == null) { + context?.let { + INSTANCE = object : AppInstaller() { + override val defaultInstaller: BaseInstaller + get() { + return when (rootInstallerEnabled) { + false -> DefaultInstaller(it) + true -> RootInstaller(it) } - } + } } } } diff --git a/src/main/kotlin/com/looker/droidify/installer/BaseInstaller.kt b/src/main/kotlin/com/looker/droidify/installer/BaseInstaller.kt index a017641e..26387d06 100644 --- a/src/main/kotlin/com/looker/droidify/installer/BaseInstaller.kt +++ b/src/main/kotlin/com/looker/droidify/installer/BaseInstaller.kt @@ -10,6 +10,7 @@ abstract class BaseInstaller(val context: Context) : InstallationEvents { companion object { const val ROOT_INSTALL_PACKAGE = "cat %s | pm install --user %s -t -r -S %s" const val ROOT_UNINSTALL_PACKAGE = "pm uninstall --user %s %s" + const val DELETE_PACKAGE = "%s rm %s" } private val job = Job() diff --git a/src/main/kotlin/com/looker/droidify/installer/RootInstaller.kt b/src/main/kotlin/com/looker/droidify/installer/RootInstaller.kt index fc3a3c21..f9049dd1 100644 --- a/src/main/kotlin/com/looker/droidify/installer/RootInstaller.kt +++ b/src/main/kotlin/com/looker/droidify/installer/RootInstaller.kt @@ -26,7 +26,7 @@ class RootInstaller(context: Context) : BaseInstaller(context) { scope.launch { mRootUninstaller(packageName) } } - private suspend fun mRootInstaller(cacheFile: File) { + private fun mRootInstaller(cacheFile: File) { if (rootInstallerEnabled) { val installCommand = String.format( @@ -35,15 +35,16 @@ class RootInstaller(context: Context) : BaseInstaller(context) { getCurrentUserState, cacheFile.length() ) - Log.e("Install", installCommand) - withContext(Dispatchers.IO) { - launch { - val result = Shell.su(installCommand).exec() - launch { - if (result.isSuccess) { - Shell.su("$getUtilBoxPath rm ${cacheFile.absolutePath.quote}") - .submit() - } + val deleteCommand = + String.format( + DELETE_PACKAGE, + getUtilBoxPath, + cacheFile.absolutePath.quote + ) + scope.launch { + Shell.su(installCommand).submit { + if (it.isSuccess) { + Shell.su(deleteCommand).submit() } } } diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt b/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt index 9221be9e..708ad1e2 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt @@ -1151,7 +1151,6 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) ViewType.HEADER -> { holder as HeaderViewHolder item as Item.HeaderItem - val installedItem = installedItem val updateStatus = Payload.STATUS in payloads val updateAll = !updateStatus if (updateAll) { @@ -1170,8 +1169,6 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) holder.icon.setImageDrawable(holder.defaultIcon) } holder.name.text = item.product.name - val canUpdate = item.product.canUpdate(installedItem) && - !ProductPreferences[item.product.packageName].shouldIgnoreUpdate(item.product.versionCode) holder.packageName.apply { text = item.product.packageName setTextSizeScaled(15) @@ -1264,6 +1261,10 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) holder.dev.setOnClickListener { context.startActivity(Intent(Intent.ACTION_VIEW, product?.source?.toUri())) } + holder.dev.setOnLongClickListener { + product?.source?.let { copyLinkToClipboard(context, it) } + true + } } ViewType.SWITCH -> { holder as SwitchViewHolder diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt index 1d8b85c1..fd9f3a37 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt @@ -16,7 +16,6 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.appbar.CollapsingToolbarLayout import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.looker.droidify.R import com.looker.droidify.content.ProductPreferences @@ -329,7 +328,7 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks { (it.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() != 0 } == true - (toolbar.parent as CollapsingToolbarLayout).title = + collapsingToolbar.title = if (showPackageName) products[0].first.name.trimAfter(' ', 2) else getString(R.string.application) } @@ -372,12 +371,12 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks { if (state is DownloadService.State.Success && isResumed) { lifecycleScope.launch(Dispatchers.IO) { state.consume() - AppInstaller - .getInstance(context)?.defaultInstaller?.install( - "", - state.release.cacheFileName - ) } + AppInstaller + .getInstance(context)?.defaultInstaller?.install( + "", + state.release.cacheFileName + ) } } diff --git a/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt index a7372490..d9365b53 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt @@ -5,10 +5,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.appbar.CollapsingToolbarLayout import com.looker.droidify.R open class ScreenFragment : BaseFragment() { lateinit var toolbar: Toolbar + lateinit var collapsingToolbar: CollapsingToolbarLayout + lateinit var appBar: AppBarLayout override fun onCreateView( inflater: LayoutInflater, @@ -17,6 +21,8 @@ open class ScreenFragment : BaseFragment() { ): View? { val view = inflater.inflate(R.layout.fragment, container, false) this.toolbar = view.findViewById(R.id.toolbar) + this.collapsingToolbar = view.findViewById(R.id.collapsing_toolbar) + this.appBar = view.findViewById(R.id.appbar_layout) return view } } diff --git a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt index 553a6907..94a61f5f 100644 --- a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt @@ -13,8 +13,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 -import com.google.android.material.appbar.AppBarLayout -import com.google.android.material.appbar.CollapsingToolbarLayout import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator @@ -109,12 +107,6 @@ class TabsFragment : ScreenFragment() { toolbar.isFocusableInTouchMode = true val searchView = FocusSearchView(toolbar.context).apply { - setOnSearchClickListener { - ((toolbar.parent as CollapsingToolbarLayout).parent as AppBarLayout).setExpanded( - false, - true - ) - } maxWidth = Int.MAX_VALUE queryHint = getString(R.string.search) setOnQueryTextListener(object : SearchView.OnQueryTextListener { @@ -131,6 +123,7 @@ class TabsFragment : ScreenFragment() { return true } }) + setOnSearchClickListener { appBar.setExpanded(false, true) } } toolbar.menu.apply { diff --git a/src/main/res/layout/fragment.xml b/src/main/res/layout/fragment.xml index cd8d126d..7e63d851 100644 --- a/src/main/res/layout/fragment.xml +++ b/src/main/res/layout/fragment.xml @@ -16,7 +16,7 @@ android:fitsSystemWindows="true">