Переглянути джерело

added broadcast receiver for package changes, update database when app created

sduduzog 7 роки тому
батько
коміт
7156bfd109

+ 48 - 1
app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt

@@ -1,12 +1,17 @@
 package com.sduduzog.slimlauncher
 
-import android.content.SharedPreferences
+import android.arch.lifecycle.ViewModelProviders
+import android.content.*
+import android.content.pm.ResolveInfo
 import android.content.res.Resources
 import android.os.Bundle
 import android.support.v7.app.AppCompatActivity
 import androidx.navigation.NavController
 import androidx.navigation.NavDestination
 import androidx.navigation.Navigation.findNavController
+import com.sduduzog.slimlauncher.data.App
+import com.sduduzog.slimlauncher.ui.main.MainViewModel
+import java.util.*
 
 
 class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, NavController.OnNavigatedListener {
@@ -15,6 +20,9 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
     private val label = "main_fragment"
     private lateinit var currentLabel: String
 
+    private lateinit var viewModel: MainViewModel
+    private lateinit var receiver: PackageInfoReceiver
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.main_activity)
@@ -22,6 +30,8 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
         settings.registerOnSharedPreferenceChangeListener(this)
         val navigator = findNavController(this, R.id.nav_host_fragment)
         navigator.addOnNavigatedListener(this)
+        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
+        updateApps()
     }
 
     override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, s: String?) {
@@ -50,4 +60,41 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
         currentLabel = destination.label.toString()
     }
 
+    private fun updateApps(){
+        val apps: MutableList<App> = mutableListOf()
+        val pm = packageManager
+        val main = Intent(Intent.ACTION_MAIN, null)
+
+        main.addCategory(Intent.CATEGORY_LAUNCHER)
+
+        val launchables = pm.queryIntentActivities(main, 0)
+        Collections.sort(launchables,
+                ResolveInfo.DisplayNameComparator(pm))
+        for (i in launchables.indices) {
+            val item = launchables[i]
+            val activity = item.activityInfo
+            val app = App(activity.loadLabel(pm).toString(), activity.name, activity.applicationInfo.packageName)
+            apps.add(app)
+        }
+        viewModel.bulkInsert(apps)
+    }
+
+    override fun onStart() {
+        super.onStart()
+        receiver = PackageInfoReceiver()
+        registerReceiver(receiver, IntentFilter(Intent.ACTION_PACKAGE_ADDED))
+        registerReceiver(receiver, IntentFilter(Intent.ACTION_PACKAGE_REMOVED))
+    }
+
+    override fun onStop() {
+        super.onStop()
+        unregisterReceiver(receiver)
+    }
+
+    inner class PackageInfoReceiver: BroadcastReceiver() {
+        override fun onReceive(ctx: Context?, intent: Intent?) {
+            updateApps()
+        }
+
+    }
 }