From c1060f35bad4b464ef1e7b6c984fc8cbef9140a9 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Mon, 1 Aug 2022 17:40:27 +0600 Subject: [PATCH] update button disabled after signature mismatch show keyboard on launch of searchfragment --- .../e/apps/AppInfoFetchViewModel.kt | 9 +++ .../api/faultyApps/FaultyAppRepository.kt | 6 ++ .../model/ApplicationListRVAdapter.kt | 56 +++++++++++++++++-- .../e/apps/manager/pkg/InstallerService.kt | 2 +- .../e/apps/search/SearchFragment.kt | 17 +++++- .../e/apps/updates/UpdatesFragment.kt | 7 ++- .../updates/manager/UpdatesManagerImpl.kt | 3 +- app/src/main/res/layout/fragment_search.xml | 3 +- 8 files changed, 90 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/AppInfoFetchViewModel.kt b/app/src/main/java/foundation/e/apps/AppInfoFetchViewModel.kt index 5bd0e8eb0..9520922e2 100644 --- a/app/src/main/java/foundation/e/apps/AppInfoFetchViewModel.kt +++ b/app/src/main/java/foundation/e/apps/AppInfoFetchViewModel.kt @@ -9,6 +9,7 @@ import com.aurora.gplayapi.data.models.AuthData import com.google.gson.Gson import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.api.cleanapk.blockedApps.BlockedAppRepository +import foundation.e.apps.api.faultyApps.FaultyAppRepository import foundation.e.apps.api.fdroid.FdroidRepository import foundation.e.apps.api.fdroid.models.FdroidEntity import foundation.e.apps.api.fused.data.FusedApp @@ -27,6 +28,7 @@ import javax.inject.Inject class AppInfoFetchViewModel @Inject constructor( private val fdroidRepository: FdroidRepository, private val gPlayAPIRepository: GPlayAPIRepository, + private val faultyAppRepository: FaultyAppRepository, private val dataStoreModule: DataStoreModule, private val blockedAppRepository: BlockedAppRepository, private val gson: Gson @@ -89,4 +91,11 @@ class AppInfoFetchViewModel @Inject constructor( fun isAppInBlockedList(fusedApp: FusedApp): Boolean { return blockedAppRepository.getBlockedAppPackages().contains(fusedApp.package_name) } + + fun isAppFaulty(fusedApp: FusedApp) = liveData> { + val faultyApp = faultyAppRepository.getAllFaultyApps() + .find { faultyApp -> faultyApp.packageName.contentEquals(fusedApp.package_name) } + val faultyAppResult = Pair(faultyApp != null, faultyApp?.error ?: "") + emit(faultyAppResult) + } } diff --git a/app/src/main/java/foundation/e/apps/api/faultyApps/FaultyAppRepository.kt b/app/src/main/java/foundation/e/apps/api/faultyApps/FaultyAppRepository.kt index aebbb2822..b1c826009 100644 --- a/app/src/main/java/foundation/e/apps/api/faultyApps/FaultyAppRepository.kt +++ b/app/src/main/java/foundation/e/apps/api/faultyApps/FaultyAppRepository.kt @@ -20,6 +20,7 @@ package foundation.e.apps.api.faultyApps +import foundation.e.apps.api.fused.data.FusedApp import javax.inject.Inject import javax.inject.Singleton @@ -38,4 +39,9 @@ class FaultyAppRepository @Inject constructor(private val faultyAppDao: FaultyAp suspend fun deleteFaultyAppByPackageName(packageName: String) { faultyAppDao.deleteFaultyAppByPackageName(packageName) } + + suspend fun removeFaultyApps(fusedApps: List): List { + val faultyAppsPackageNames = getAllFaultyApps().map { it.packageName } + return fusedApps.filter { !faultyAppsPackageNames.contains(it.package_name) } + } } diff --git a/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt b/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt index 737341f4e..951be9aec 100644 --- a/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt @@ -47,6 +47,7 @@ import foundation.e.apps.api.fused.FusedAPIInterface import foundation.e.apps.api.fused.data.FusedApp import foundation.e.apps.applicationlist.ApplicationListFragmentDirections import foundation.e.apps.databinding.ApplicationListItemBinding +import foundation.e.apps.manager.pkg.InstallerService import foundation.e.apps.search.SearchFragmentDirections import foundation.e.apps.updates.UpdatesFragmentDirections import foundation.e.apps.utils.enums.Origin @@ -243,21 +244,60 @@ class ApplicationListRVAdapter( private fun ApplicationListItemBinding.handleInstallationIssue( view: View, searchApp: FusedApp, + ) { + progressBarInstall.visibility = View.GONE + if (lifecycleOwner == null) { + return + } + + appInfoFetchViewModel.isAppFaulty(searchApp).observe(lifecycleOwner!!) { + updateInstallButton(it, view, searchApp) + } + } + + private fun ApplicationListItemBinding.updateInstallButton( + faultyAppResult: Pair, + view: View, + searchApp: FusedApp ) { installButton.apply { - isEnabled = true - text = view.context.getString(R.string.retry) - setTextColor(context.getColor(R.color.colorAccent)) + isEnabled = !faultyAppResult.first + text = getInstallationIssueText(faultyAppResult, view) + strokeColor = getStrokeColor(isEnabled, view) + setButtonTextColor(isEnabled) backgroundTintList = ContextCompat.getColorStateList(view.context, android.R.color.transparent) - strokeColor = ContextCompat.getColorStateList(view.context, R.color.colorAccent) setOnClickListener { installApplication(searchApp, appIcon) } } - progressBarInstall.visibility = View.GONE } + private fun MaterialButton.getInstallationIssueText( + faultyAppResult: Pair, + view: View + ) = + if (faultyAppResult.second.contentEquals(InstallerService.INSTALL_FAILED_UPDATE_INCOMPATIBLE)) + view.context.getText(R.string.update) + else + view.context.getString(R.string.retry) + + private fun MaterialButton.getStrokeColor( + isEnabled: Boolean, + view: View + ) = if (isEnabled) { + ContextCompat.getColorStateList(view.context, R.color.colorAccent) + } else { + ContextCompat.getColorStateList(view.context, R.color.light_grey) + } + + private fun MaterialButton.setButtonTextColor(isEnabled: Boolean) = + if (isEnabled) { + setTextColor(context.getColor(R.color.colorAccent)) + } else { + setTextColor(context.getColor(R.color.light_grey)) + } + private fun ApplicationListItemBinding.handleBlocked(view: View) { installButton.apply { isEnabled = true @@ -455,7 +495,11 @@ class ApplicationListRVAdapter( if (searchApp.is_pwa) { mainActivityViewModel.launchPwa(searchApp) } else { - context.startActivity(mainActivityViewModel.getLaunchIntentForPackageName(searchApp.package_name)) + context.startActivity( + mainActivityViewModel.getLaunchIntentForPackageName( + searchApp.package_name + ) + ) } } } diff --git a/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt b/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt index 8871caf04..832ef837a 100644 --- a/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt +++ b/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt @@ -50,7 +50,7 @@ class InstallerService : Service() { companion object { const val TAG = "InstallerService" - private const val INSTALL_FAILED_UPDATE_INCOMPATIBLE = "INSTALL_FAILED_UPDATE_INCOMPATIBLE" + const val INSTALL_FAILED_UPDATE_INCOMPATIBLE = "INSTALL_FAILED_UPDATE_INCOMPATIBLE" } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) diff --git a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt index 2544fd0b9..dcf766038 100644 --- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt @@ -19,6 +19,7 @@ package foundation.e.apps.search import android.app.Activity +import android.content.Context import android.database.MatrixCursor import android.os.Bundle import android.provider.BaseColumns @@ -295,6 +296,11 @@ class SearchFragment : refreshData(it) } } + + if (searchText.isEmpty() && (recyclerView?.adapter as ApplicationListRVAdapter).currentList.isEmpty()) { + searchView?.requestFocus() + showKeyboard() + } } private fun shouldRefreshData() = @@ -304,12 +310,15 @@ class SearchFragment : override fun onPause() { binding.shimmerLayout.stopShimmer() + hideKeyboard(requireActivity()) super.onPause() } override fun onQueryTextSubmit(query: String?): Boolean { query?.let { text -> - hideKeyboard(activity as Activity) + if (text.isNotEmpty()) { + hideKeyboard(activity as Activity) + } view?.requestFocus() searchHintLayout?.visibility = View.GONE shimmerLayout?.visibility = View.VISIBLE @@ -369,6 +378,12 @@ class SearchFragment : inputMethodManager.hideSoftInputFromWindow(view?.windowToken, 0) } + private fun showKeyboard() { + val imm = + requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY) + } + private fun populateSuggestionsAdapter(suggestions: List?) { val cursor = MatrixCursor(arrayOf(BaseColumns._ID, SUGGESTION_KEY)) suggestions?.let { diff --git a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt index 99e04d020..5e8d1a100 100644 --- a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt +++ b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt @@ -131,11 +131,14 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), FusedAPIInte } WorkManager.getInstance(requireContext()) - .getWorkInfosForUniqueWorkLiveData(INSTALL_WORK_NAME).observe(viewLifecycleOwner) { workInfoList -> + .getWorkInfosForUniqueWorkLiveData(INSTALL_WORK_NAME) + .observe(viewLifecycleOwner) { workInfoList -> lifecycleScope.launchWhenResumed { binding.button.isEnabled = !( it.first.isNullOrEmpty() || - updatesViewModel.checkWorkInfoListHasAnyUpdatableWork(workInfoList) + updatesViewModel.checkWorkInfoListHasAnyUpdatableWork( + workInfoList + ) ) } } diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt index 2c2ce9d2e..ffd48afa1 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt @@ -77,8 +77,7 @@ class UpdatesManagerImpl @Inject constructor( } } } - val faultyAppsPackageNames = faultyAppRepository.getAllFaultyApps().map { it.packageName } - val nonFaultyUpdateList = updateList.filter { !faultyAppsPackageNames.contains(it.package_name) } + val nonFaultyUpdateList = faultyAppRepository.removeFaultyApps(updateList) return Pair(nonFaultyUpdateList, status) } diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index a4e3fbf23..10d4481e0 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -36,7 +36,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:iconifiedByDefault="false" - app:searchIcon="@drawable/ic_menu_search" /> + app:searchIcon="@drawable/ic_menu_search" + android:focusable="true" />