Преглед на файлове

:art: AddApps refactor and dependency upgrades

Beautus преди 6 години
родител
ревизия
6bab7ead14

+ 9 - 3
app/build.gradle

@@ -9,10 +9,13 @@ plugins{
 }
 
 android {
+    dataBinding {
+        enabled = true
+    }
     compileSdkVersion 29
     defaultConfig {
         applicationId "com.sduduzog.slimlauncher"
-        minSdkVersion 16
+        minSdkVersion 21
         targetSdkVersion 29
         versionCode 40
         versionName "2.3.5"
@@ -36,6 +39,9 @@ android {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
     }
+    kotlinOptions {
+        jvmTarget = "1.8"
+    }
 }
 
 dependencies {
@@ -50,12 +56,12 @@ dependencies {
     implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
 
     // Arch Components
-    implementation 'androidx.core:core-ktx:1.2.0-alpha02'
+    implementation 'androidx.core:core-ktx:1.2.0-alpha03'
     implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
     implementation 'android.arch.navigation:navigation-fragment:1.0.0'
     implementation 'androidx.room:room-runtime:2.1.0'
+    implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0"
     kapt "androidx.room:room-compiler:2.1.0"
-    kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"
 
     //3rd party libs
     implementation 'com.intuit.sdp:sdp-android:1.0.6'

+ 1 - 0
app/src/main/java/com/sduduzog/slimlauncher/data/MainViewModel.kt

@@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import com.sduduzog.slimlauncher.data.model.App
 import com.sduduzog.slimlauncher.data.model.HomeApp
+import com.sduduzog.slimlauncher.models.Repository
 
 class MainViewModel(application: Application) : AndroidViewModel(application) {
 

+ 5 - 1
app/src/main/java/com/sduduzog/slimlauncher/data/model/App.kt

@@ -4,4 +4,8 @@ data class App(
         val appName: String,
         val packageName: String,
         val activityName: String
-)
+){
+    companion object{
+        fun from(homeApp: HomeApp) = App(homeApp.appName, homeApp.packageName, homeApp.activityName)
+    }
+}

+ 51 - 0
app/src/main/java/com/sduduzog/slimlauncher/models/AddAppFragmentViewModel.kt

@@ -0,0 +1,51 @@
+package com.sduduzog.slimlauncher.models
+
+import android.app.Application
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.Observer
+import com.sduduzog.slimlauncher.data.model.App
+import com.sduduzog.slimlauncher.data.model.HomeApp
+
+class AddAppFragmentViewModel(application: Application) : AndroidViewModel(application) {
+    private val repository = Repository(application)
+    private var filterQuery = ""
+    private val _installedApps = mutableListOf<App>()
+    private val _homeApps = mutableListOf<App>()
+    private val homeAppsObserver = Observer<List<HomeApp>> {
+        this._homeApps.clear()
+        it.orEmpty().forEach { item -> this._homeApps.add(App.from(item)) }
+        if (it !== null) updateDisplayedApps()
+    }
+    val apps = MutableLiveData<List<App>>()
+
+    init {
+        repository.apps.observeForever(homeAppsObserver)
+    }
+
+    fun filterApps(query: String = "") {
+        this.filterQuery = query
+        this.updateDisplayedApps()
+    }
+
+    private fun updateDisplayedApps() {
+        val filteredApps = _installedApps.filterNot { _homeApps.contains(it) }
+        this.apps.postValue(filteredApps.filter { it.appName.contains(filterQuery) })
+    }
+
+    fun setInstalledApps(apps: List<App>) {
+        this.filterQuery = ""
+        this._installedApps.clear()
+        this._installedApps.addAll(apps)
+    }
+
+    fun addAppToHomeScreen(app: App) {
+        val index = _homeApps.size
+        repository.add(HomeApp.from(app, index))
+    }
+
+    override fun onCleared() {
+        super.onCleared()
+        repository.apps.removeObserver(homeAppsObserver)
+    }
+}

+ 3 - 1
app/src/main/java/com/sduduzog/slimlauncher/data/Repository.kt → app/src/main/java/com/sduduzog/slimlauncher/models/Repository.kt

@@ -1,8 +1,10 @@
-package com.sduduzog.slimlauncher.data
+package com.sduduzog.slimlauncher.models
 
 import android.app.Application
 import android.os.AsyncTask
 import androidx.lifecycle.LiveData
+import com.sduduzog.slimlauncher.data.BaseDao
+import com.sduduzog.slimlauncher.data.BaseDatabase
 import com.sduduzog.slimlauncher.data.model.HomeApp
 
 class Repository(application: Application) {

+ 14 - 23
app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt

@@ -1,12 +1,6 @@
 package com.sduduzog.slimlauncher.ui.main
 
-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.os.Build
+import android.content.*
 import android.os.Bundle
 import android.provider.AlarmClock
 import android.provider.MediaStore
@@ -24,8 +18,7 @@ import com.sduduzog.slimlauncher.utils.BaseFragment
 import com.sduduzog.slimlauncher.utils.OnLaunchAppListener
 import kotlinx.android.synthetic.main.home_fragment.*
 import java.text.SimpleDateFormat
-import java.util.Date
-import java.util.Locale
+import java.util.*
 
 
 class HomeFragment : BaseFragment(), OnLaunchAppListener {
@@ -85,20 +78,18 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
     private fun setEventListeners() {
 
         home_fragment_time.setOnClickListener { view ->
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-                try {
-                    val pm = context?.packageManager!!
-                    val intent = Intent(AlarmClock.ACTION_SHOW_ALARMS)
-                    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
-                    val componentName = intent.resolveActivity(pm)
-                    if (componentName == null) launchActivity(view, intent) else
-                        pm.getLaunchIntentForPackage(componentName.packageName)?.let {
-                            launchActivity(view, it)
-                        }
-                } catch (e: ActivityNotFoundException) {
-                    e.printStackTrace()
-                    // Do nothing, we've failed :(
-                }
+            try {
+                val pm = context?.packageManager!!
+                val intent = Intent(AlarmClock.ACTION_SHOW_ALARMS)
+                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+                val componentName = intent.resolveActivity(pm)
+                if (componentName == null) launchActivity(view, intent) else
+                    pm.getLaunchIntentForPackage(componentName.packageName)?.let {
+                        launchActivity(view, it)
+                    }
+            } catch (e: ActivityNotFoundException) {
+                e.printStackTrace()
+                // Do nothing, we've failed :(
             }
         }
 

+ 36 - 10
app/src/main/java/com/sduduzog/slimlauncher/ui/options/AddAppFragment.kt

@@ -1,5 +1,7 @@
 package com.sduduzog.slimlauncher.ui.options
 
+import android.content.Intent
+import android.content.pm.ResolveInfo
 import android.os.Bundle
 import android.text.Editable
 import android.text.TextWatcher
@@ -9,20 +11,21 @@ import android.view.ViewGroup
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProviders
 import androidx.navigation.Navigation
+import com.sduduzog.slimlauncher.BuildConfig
 import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.adapters.AddAppAdapter
-import com.sduduzog.slimlauncher.data.MainViewModel
 import com.sduduzog.slimlauncher.data.model.App
+import com.sduduzog.slimlauncher.models.AddAppFragmentViewModel
 import com.sduduzog.slimlauncher.utils.BaseFragment
-import com.sduduzog.slimlauncher.utils.LoadInstalledApps
 import com.sduduzog.slimlauncher.utils.OnAppClickedListener
 import kotlinx.android.synthetic.main.add_app_fragment.*
+import java.util.*
 
 class AddAppFragment : BaseFragment(), OnAppClickedListener {
 
     override fun getFragmentView(): ViewGroup = add_app_fragment
 
-    private lateinit var viewModel: MainViewModel
+    private lateinit var viewModel: AddAppFragmentViewModel
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         return inflater.inflate(R.layout.add_app_fragment, container, false)
@@ -35,13 +38,11 @@ class AddAppFragment : BaseFragment(), OnAppClickedListener {
         add_app_fragment_list.adapter = adapter
 
         activity?.let {
-            viewModel = ViewModelProviders.of(it).get(MainViewModel::class.java)
+            viewModel = ViewModelProviders.of(it).get(AddAppFragmentViewModel::class.java)
         } ?: throw Error("How the fuck is this fragment alive while there's no activity?")
-
-        viewModel.installedApps.observe(this, Observer {
-            val homeApps = viewModel.apps.value.orEmpty()
+        viewModel.apps.observe(this, Observer {
             it?.let { apps ->
-                adapter.setItems(apps.filterNot { app -> homeApps.map { homeApp -> homeApp.packageName }.contains(app.packageName) })
+                adapter.setItems(apps)
                 add_app_fragment_progress_bar.visibility = View.GONE
             } ?: run {
                 add_app_fragment_progress_bar.visibility = View.VISIBLE
@@ -50,6 +51,11 @@ class AddAppFragment : BaseFragment(), OnAppClickedListener {
         add_app_fragment_edit_text.addTextChangedListener(onTextChangeListener)
     }
 
+    override fun onResume() {
+        super.onResume()
+        viewModel.setInstalledApps(getInstalledApps())
+    }
+
     override fun onDestroy() {
         super.onDestroy()
         add_app_fragment_edit_text?.removeTextChangedListener(onTextChangeListener)
@@ -66,13 +72,33 @@ class AddAppFragment : BaseFragment(), OnAppClickedListener {
         }
 
         override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
-            LoadInstalledApps(viewModel, s.toString()).execute(context!!.packageManager)
+            viewModel.filterApps(s.toString())
         }
     }
 
     override fun onAppClicked(app: App) {
-        viewModel.add(app)
+        viewModel.addAppToHomeScreen(app)
         Navigation.findNavController(add_app_fragment).popBackStack()
     }
 
+    private fun getInstalledApps(): List<App> {
+        val pm = activity!!.packageManager
+        val list = mutableListOf<App>()
+        val main = Intent(Intent.ACTION_MAIN, null)
+        main.addCategory(Intent.CATEGORY_LAUNCHER)
+        val activitiesList = pm.queryIntentActivities(main, 0)
+        Collections.sort(activitiesList, ResolveInfo.DisplayNameComparator(pm))
+        activitiesList.indices.forEach {
+            val item = activitiesList[it]
+            val activity = item.activityInfo
+            val app = App(
+                    activitiesList[it].loadLabel(pm).toString(),
+                    activity.applicationInfo.packageName, activity.name
+            )
+            list.add(app)
+        }
+        val filter = mutableListOf<String>()
+        filter.add(BuildConfig.APPLICATION_ID)
+        return list.filterNot { filter.contains(it.packageName) }
+    }
 }

+ 0 - 2
app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomiseAppsFragment.kt

@@ -17,7 +17,6 @@ import com.sduduzog.slimlauncher.data.MainViewModel
 import com.sduduzog.slimlauncher.data.model.HomeApp
 import com.sduduzog.slimlauncher.dialogs.RenameAppDialog
 import com.sduduzog.slimlauncher.utils.BaseFragment
-import com.sduduzog.slimlauncher.utils.LoadInstalledApps
 import com.sduduzog.slimlauncher.utils.OnItemActionListener
 import com.sduduzog.slimlauncher.utils.OnShitDoneToAppsListener
 import kotlinx.android.synthetic.main.customise_apps_fragment.*
@@ -59,7 +58,6 @@ class CustomiseAppsFragment : BaseFragment(), OnShitDoneToAppsListener {
                 viewModel.remove(*it.toTypedArray())
             }
         }
-        LoadInstalledApps(viewModel).execute(context!!.packageManager)
 
         customise_apps_fragment_list.adapter = adapter
         val listener: OnItemActionListener = adapter

+ 1 - 0
app/src/main/java/com/sduduzog/slimlauncher/utils/BaseFragment.kt

@@ -32,6 +32,7 @@ abstract class BaseFragment : Fragment() {
             context!!.theme.resolveAttribute(R.attr.colorPrimary, value, true)
             activity!!.window.statusBarColor = value.data
         }
+
     }
 
     override fun onStart() {

+ 0 - 64
app/src/main/java/com/sduduzog/slimlauncher/utils/LoadInstalledApps.kt

@@ -1,64 +0,0 @@
-package com.sduduzog.slimlauncher.utils
-
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.content.pm.ResolveInfo
-import android.os.AsyncTask
-import android.os.Build
-import android.provider.AlarmClock
-import android.provider.MediaStore
-import com.sduduzog.slimlauncher.BuildConfig
-import com.sduduzog.slimlauncher.data.MainViewModel
-import com.sduduzog.slimlauncher.data.model.App
-import java.util.Collections
-
-class LoadInstalledApps(private val viewModel: MainViewModel?, private val filterString: String = "") : AsyncTask<PackageManager, Unit, List<App>>() {
-
-    private lateinit var packageManager: PackageManager
-
-    override fun doInBackground(vararg params: PackageManager): List<App> {
-        val pm = params[0]
-        packageManager = pm
-        val list = mutableListOf<App>()
-        val main = Intent(Intent.ACTION_MAIN, null)
-        main.addCategory(Intent.CATEGORY_LAUNCHER)
-        val activitiesList = pm.queryIntentActivities(main, 0)
-        Collections.sort(activitiesList, ResolveInfo.DisplayNameComparator(pm))
-        activitiesList.indices.forEach {
-            val item = activitiesList[it]
-            val activity = item.activityInfo
-            val app = App(
-                    activitiesList[it].loadLabel(pm).toString(),
-                    activity.applicationInfo.packageName, activity.name
-            )
-            list.add(app)
-        }
-
-        val filter = mutableListOf<String>()
-
-        Intent(Intent.ACTION_DIAL).resolveActivity(packageManager)?.let {
-            filter.add(it.packageName)
-        }
-        Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_CALENDAR).resolveActivity(packageManager)?.let {
-            filter.add(it.packageName)
-        }
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            Intent(AlarmClock.ACTION_SHOW_ALARMS).resolveActivity(packageManager)?.let {
-                filter.add(it.packageName)
-            }
-        }
-
-        Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA).resolveActivity(packageManager)?.let {
-            filter.add(it.packageName)
-        }
-
-        filter.add(BuildConfig.APPLICATION_ID)
-
-        return list.filterNot { filter.contains(it.packageName) }
-    }
-
-    override fun onPostExecute(result: List<App>) {
-        viewModel?.installedApps?.value = result.filter { it.appName.contains(filterString, true) }
-    }
-}

+ 2 - 2
build.gradle

@@ -1,13 +1,13 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 
 buildscript {
-    ext.kotlin_version = '1.3.31'
+    ext.kotlin_version = '1.3.41'
     repositories {
         google()
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.4.2'
+        classpath 'com.android.tools.build:gradle:3.5.0'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
         // NOTE: Do not place your application dependencies here; they belong

+ 1 - 1
gradle.properties

@@ -6,7 +6,7 @@
 # http://www.gradle.org/docs/current/userguide/build_environment.html
 # Specifies the JVM arguments used for the daemon process.
 # The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx4096m
+org.gradle.jvmargs=-Xmx6114m
 android.useAndroidX=true
 android.enableJetifier=true
 android.enableR8=true

+ 2 - 2
gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,6 @@
-#Thu Apr 18 16:23:43 CAT 2019
+#Sat Aug 24 16:44:55 CAT 2019
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip