diff --git a/app/src/main/java/com/finnmglas/launcher/Functions.kt b/app/src/main/java/com/finnmglas/launcher/Functions.kt index 5bd3a59..ba60fd2 100644 --- a/app/src/main/java/com/finnmglas/launcher/Functions.kt +++ b/app/src/main/java/com/finnmglas/launcher/Functions.kt @@ -22,6 +22,7 @@ import android.widget.ImageView import android.widget.Switch import android.widget.Toast import com.finnmglas.launcher.list.ListActivity +import com.finnmglas.launcher.list.apps.AppInfo import com.finnmglas.launcher.list.apps.AppsRecyclerAdapter import com.finnmglas.launcher.settings.SettingsActivity import com.finnmglas.launcher.settings.intendedSettingsPause @@ -61,7 +62,7 @@ const val PREF_STARTED_TIME = "firstStartup" const val PREF_VERSION = "version" /* Objects used by multiple activities */ -lateinit var appListViewAdapter: AppsRecyclerAdapter +val appsList: MutableList = ArrayList() /* Variables containing settings */ val displayMetrics = DisplayMetrics() @@ -301,6 +302,29 @@ fun openAppsList(activity: Activity){ activity.startActivity(intent) } +/** + * [loadApps] is used to speed up the [AppsRecyclerAdapter] loading time, + * as it caches all the apps and allows for fast access to the data. + */ +fun loadApps(packageManager: PackageManager) { + val loadList = mutableListOf() + + val i = Intent(Intent.ACTION_MAIN, null) + i.addCategory(Intent.CATEGORY_LAUNCHER) + val allApps = packageManager.queryIntentActivities(i, 0) + for (ri in allApps) { + val app = AppInfo() + app.label = ri.loadLabel(packageManager) + app.packageName = ri.activityInfo.packageName + app.icon = ri.activityInfo.loadIcon(packageManager) + loadList.add(app) + } + loadList.sortBy { it.label.toString() } + + appsList.clear() + appsList.addAll(loadList) +} + fun loadSettings() { upApp = launcherPreferences.getString(ACTION_UP, "")!! downApp = launcherPreferences.getString(ACTION_DOWN, "")!! diff --git a/app/src/main/java/com/finnmglas/launcher/HomeActivity.kt b/app/src/main/java/com/finnmglas/launcher/HomeActivity.kt index 7f62c58..7f144d6 100644 --- a/app/src/main/java/com/finnmglas/launcher/HomeActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/HomeActivity.kt @@ -52,11 +52,6 @@ class HomeActivity: UIObject, AppCompatActivity(), loadSettings() - // Preload list of apps (speed up loading time) - AsyncTask.execute { - appListViewAdapter = AppsRecyclerAdapter(this) - } - // First time opening the app: show Tutorial, else: check versions if (!launcherPreferences.getBoolean(PREF_STARTED, false)) startActivity(Intent(this, TutorialActivity::class.java)) @@ -86,6 +81,9 @@ class HomeActivity: UIObject, AppCompatActivity(), } } + // Preload apps to speed up the Apps Recycler + AsyncTask.execute { loadApps(packageManager) } + // Initialise layout setContentView(R.layout.home) } diff --git a/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt index b3cc908..a1fb607 100644 --- a/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri +import android.os.AsyncTask import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -32,7 +33,6 @@ class AppsRecyclerAdapter(val activity: Activity, val forApp: String? = ""): RecyclerView.Adapter() { - private val appsList: MutableList private val appsListDisplayed: MutableList inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), @@ -140,22 +140,15 @@ class AppsRecyclerAdapter(val activity: Activity, } init { - appsList = ArrayList() - appsListDisplayed = ArrayList() - - val pm: PackageManager = activity.packageManager - - val i = Intent(Intent.ACTION_MAIN, null) - i.addCategory(Intent.CATEGORY_LAUNCHER) - val allApps = pm.queryIntentActivities(i, 0) - for (ri in allApps) { - val app = AppInfo() - app.label = ri.loadLabel(pm) - app.packageName = ri.activityInfo.packageName - app.icon = ri.activityInfo.loadIcon(pm) - appsList.add(app) + // Load the apps + if (appsList.size == 0) + loadApps(activity.packageManager) + else { + AsyncTask.execute { loadApps(activity.packageManager) } + notifyDataSetChanged() } - appsList.sortBy { it.label.toString() } + + appsListDisplayed = ArrayList() appsListDisplayed.addAll(appsList) }