Quellcode durchsuchen

fix(#163): remove uninstalled apps from home screen (#164)

Co-authored-by: Joshua Kuestersteffen <jkuester@kuester7.com>
Hayri Bakici vor 2 Jahren
Ursprung
Commit
d9518e8b86

+ 1 - 1
app/src/main/java/com/sduduzog/slimlauncher/datasource/apps/UnlauncherAppsRepository.kt

@@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.launch
 import java.io.IOException
-import java.util.*
+import java.util.Locale
 
 class UnlauncherAppsRepository(
     private val unlauncherAppsStore: DataStore<UnlauncherApps>,

+ 14 - 1
app/src/main/java/com/sduduzog/slimlauncher/models/MainViewModel.kt

@@ -2,16 +2,29 @@ package com.sduduzog.slimlauncher.models
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.ViewModel
+import com.sduduzog.slimlauncher.data.model.App
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
 
 @HiltViewModel
 class MainViewModel @Inject constructor(
-    _baseRepository: Repository
+    private var _baseRepository: Repository
 ) : ViewModel() {
 
     private var _apps: LiveData<List<HomeApp>> = _baseRepository.apps
 
     val apps: LiveData<List<HomeApp>>
         get() = _apps
+
+    fun filterHomeApps(updatedApps: List<App>) {
+        _baseRepository.apps.value
+            .orEmpty()
+            .filter { currentApp ->
+                updatedApps.find { updatedApp ->
+                    updatedApp.packageName == currentApp.packageName && updatedApp.activityName == currentApp.activityName
+                } == null
+            }.forEach {
+                _baseRepository.remove(it)
+            }
+    }
 }

+ 26 - 6
app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt

@@ -1,7 +1,12 @@
 package com.sduduzog.slimlauncher.ui.main
 
 import android.app.Activity
-import android.content.*
+import android.content.ActivityNotFoundException
+import android.content.BroadcastReceiver
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
 import android.content.pm.LauncherApps
 import android.net.Uri
 import android.os.Bundle
@@ -18,6 +23,8 @@ import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputMethodManager
 import android.widget.PopupMenu
 import android.widget.Toast
+import androidx.activity.result.ActivityResultLauncher
+import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
 import androidx.constraintlayout.motion.widget.MotionLayout
 import androidx.constraintlayout.motion.widget.MotionLayout.TransitionListener
 import androidx.fragment.app.viewModels
@@ -43,7 +50,8 @@ import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import java.text.DateFormat
 import java.text.SimpleDateFormat
-import java.util.*
+import java.util.Date
+import java.util.Locale
 import javax.inject.Inject
 
 @AndroidEntryPoint
@@ -55,6 +63,12 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
 
     private lateinit var receiver: BroadcastReceiver
     private lateinit var appDrawerAdapter: AppDrawerAdapter
+    private lateinit var uninstallAppLauncher: ActivityResultLauncher<Intent>
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        uninstallAppLauncher = registerForActivityResult(StartActivityForResult()) { refreshApps() }
+    }
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
         val coreRepository = unlauncherDataSource.corePreferencesRepo
@@ -124,9 +138,7 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
         super.onResume()
         updateClock()
 
-        lifecycleScope.launch(Dispatchers.IO) {
-            unlauncherDataSource.unlauncherAppsRepo.setApps(getInstalledApps())
-        }
+        refreshApps()
         if (!::appDrawerAdapter.isInitialized) {
             appDrawerAdapter.setAppFilter()
         }
@@ -138,6 +150,14 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
         }
     }
 
+    private fun refreshApps() {
+        val installedApps = getInstalledApps()
+        lifecycleScope.launch(Dispatchers.IO) {
+            unlauncherDataSource.unlauncherAppsRepo.setApps(installedApps)
+            viewModel.filterHomeApps(installedApps)
+        }
+    }
+
     override fun onStop() {
         super.onStop()
         activity?.unregisterReceiver(receiver)
@@ -353,7 +373,7 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
                     R.id.uninstall -> {
                         val intent = Intent(Intent.ACTION_DELETE)
                         intent.data = Uri.parse("package:" + app.packageName)
-                        startActivity(intent)
+                        uninstallAppLauncher.launch(intent)
                         //appDrawerAdapter.notifyDataSetChanged()
                         // TODO: Handle the case when this is done for system apps
                     }