From de79b2752dbc8731a4deecb1a42d80cb8fcdea4e Mon Sep 17 00:00:00 2001 From: ottoptj Date: Mon, 3 Jun 2024 15:13:24 +0300 Subject: [PATCH] Now passively checks for moved apps (for app name changing between updates, etc) --- app/src/main/AndroidManifest.xml | 1 + .../eu/ottop/yamlauncher/AppActionMenu.kt | 4 ++ .../eu/ottop/yamlauncher/AppMenuAdapter.kt | 4 ++ .../java/eu/ottop/yamlauncher/MainActivity.kt | 51 +++++++++++++++---- .../eu/ottop/yamlauncher/SettingsActivity.kt | 1 - .../eu/ottop/yamlauncher/WeatherSystem.kt | 4 ++ app/src/main/res/layout/activity_settings.xml | 1 - app/src/main/res/values-night/themes.xml | 7 +-- app/src/main/res/values-v23/themes.xml | 7 --- app/src/main/res/values/themes.xml | 9 ++++ 10 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d509005..8f87ec6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,7 @@ tools:targetApi="34"> >>) { + apps = newApps.toMutableList() + } } \ No newline at end of file diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt index fe89754..fc2da3b 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt @@ -16,7 +16,6 @@ import android.text.TextWatcher import android.view.GestureDetector import android.view.MotionEvent import android.view.View -import android.view.WindowManager import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.LinearLayout @@ -65,6 +64,8 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap private val swipeThreshold = 100 private val swipeVelocityThreshold = 100 + var appUpdate = true + @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -120,9 +121,7 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap startTask() // Keyboard is sometimes open when going back to the app, so close it. - val imm = - getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(binding.root.windowToken, 0) + closeKeyboard() } open inner class GestureListener : GestureDetector.SimpleOnGestureListener() { @@ -187,10 +186,12 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap val newApps = installedApps.toMutableList() setupRecyclerView(newApps) + + searchView = findViewById(R.id.searchView) + setupSearch() } - searchView = findViewById(R.id.searchView) - setupSearch() + } @@ -284,19 +285,20 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap } private fun setupSearch() { - binding.root.addOnLayoutChangeListener { _, _, top, _, bottom, _, oldTop, _, oldBottom -> + recyclerView.addOnLayoutChangeListener { _, _, top, _, bottom, _, oldTop, _, oldBottom -> if (bottom - top > oldBottom - oldTop) { searchView.clearFocus() if (searchView.text.isNullOrEmpty()) { - job?.cancel() startTask() + appUpdate = true } } - else { + else if (bottom - top < oldBottom - oldTop) { job?.cancel() + appUpdate = false } } @@ -355,6 +357,7 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap } private fun startTask() { + job?.cancel() job = CoroutineScope(Dispatchers.Default).launch { while (true) { refreshAppMenu() @@ -371,6 +374,8 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap } fun backToHome() { + closeKeyboard() + searchView.setText("") animations.showHome(binding) animations.backgroundOut(this@MainActivity, binding) val handler = Handler(Looper.getMainLooper()) @@ -464,6 +469,12 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap } + private fun closeKeyboard() { + val imm = + getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(binding.root.windowToken, 0) + } + private fun detectChanges(oldList: List>>, newList: List>>): List { val changes = mutableListOf() val removalChanges = mutableListOf() @@ -477,6 +488,12 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap if (oldItem.first.componentName != newList[newIndex].first.componentName) { changes.add(Change(ChangeType.UPDATE, index)) } + if (index != newIndex) { + if (appUpdate) { + changes.add(Change(ChangeType.MOVE, index)) + appUpdate = false + } + } } } @@ -500,6 +517,7 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap return changes } + @SuppressLint("NotifyDataSetChanged") private fun applyChanges(changes: List, updatedApps: List>>) { changes.forEach { change -> when (change.type) { @@ -516,6 +534,14 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap ChangeType.UPDATE -> { updateItem(change.position, updatedApps[change.position]) } + + ChangeType.MOVE -> { + adapter.updateApps(updatedApps) + adapter.notifyDataSetChanged() + println("moved") + appUpdate = true + } + } } } @@ -538,10 +564,15 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap adapter.moveApp(position, newPosition) adapter.notifyItemMoved(position, newPosition) } + + fun updateInstalledApps() { + installedApps = appUtils.getInstalledApps(this@MainActivity) + appUpdate = true + } } data class Change(val type: ChangeType, val position: Int, val newPosition: Int = 0) enum class ChangeType { - INSERT, REMOVE, UPDATE + INSERT, REMOVE, UPDATE, MOVE } \ No newline at end of file diff --git a/app/src/main/java/eu/ottop/yamlauncher/SettingsActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/SettingsActivity.kt index 894877f..f468bfd 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/SettingsActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/SettingsActivity.kt @@ -12,6 +12,5 @@ class SettingsActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivitySettingsBinding.inflate(layoutInflater) setContentView(binding.root) - window.statusBarColor = getColor(R.color.settings_bg) } } \ No newline at end of file diff --git a/app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt b/app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt new file mode 100644 index 0000000..8d8e316 --- /dev/null +++ b/app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt @@ -0,0 +1,4 @@ +package eu.ottop.yamlauncher + +class WeatherSystem { +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 4b2a354..4985303 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -5,7 +5,6 @@ android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/settings_bg" android:orientation="vertical" tools:context=".SettingsActivity"> diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 12bbade..cc40175 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,9 +1,4 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml index 8980861..2a710f3 100644 --- a/app/src/main/res/values-v23/themes.xml +++ b/app/src/main/res/values-v23/themes.xml @@ -1,10 +1,3 @@ - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 7bfbe2b..42f8435 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -4,9 +4,18 @@ @android:color/transparent @android:color/transparent true + @android:color/transparent + @android:color/transparent + ?attr/isLightTheme + true + shortEdges + +