mirror of
https://github.com/He4eT/yamf_launcher.git
synced 2026-05-05 01:47:24 +00:00
(Probably buggy) Renaming now moves the app correctly and searched items align to bottom.
This commit is contained in:
parent
faea9c95e3
commit
23ff67f388
4 changed files with 86 additions and 34 deletions
|
|
@ -15,6 +15,7 @@ import android.view.inputmethod.InputMethodManager
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import androidx.appcompat.widget.AppCompatButton
|
||||||
import eu.ottop.yamlauncher.databinding.ActivityAppMenuBinding
|
import eu.ottop.yamlauncher.databinding.ActivityAppMenuBinding
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
@ -68,17 +69,21 @@ class AppActionMenu {
|
||||||
editLayout.visibility = View.VISIBLE
|
editLayout.visibility = View.VISIBLE
|
||||||
actionMenu.visibility = View.INVISIBLE
|
actionMenu.visibility = View.INVISIBLE
|
||||||
val editText = editLayout.findViewById<EditText>(R.id.app_name_edit)
|
val editText = editLayout.findViewById<EditText>(R.id.app_name_edit)
|
||||||
|
val resetButton = editLayout.findViewById<AppCompatButton>(R.id.reset)
|
||||||
|
|
||||||
|
val app = Pair(mainActivity!!, Pair(userHandle, workProfile))
|
||||||
|
|
||||||
searchView.visibility = View.INVISIBLE
|
searchView.visibility = View.INVISIBLE
|
||||||
editText.requestFocus()
|
editText.requestFocus()
|
||||||
|
|
||||||
val handler = Handler(Looper.getMainLooper())
|
val handler = Handler(Looper.getMainLooper())
|
||||||
handler.postDelayed({
|
handler.postDelayed({
|
||||||
val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
val imm =
|
||||||
|
activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
|
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
|
||||||
}, 100)
|
}, 100)
|
||||||
|
|
||||||
binding.root.addOnLayoutChangeListener {
|
binding.root.addOnLayoutChangeListener { _, _, top, _, bottom, _, oldTop, _, oldBottom ->
|
||||||
_, _, top, _, bottom, _, oldTop, _, oldBottom ->
|
|
||||||
if (bottom - top > oldBottom - oldTop) {
|
if (bottom - top > oldBottom - oldTop) {
|
||||||
editLayout.clearFocus()
|
editLayout.clearFocus()
|
||||||
|
|
||||||
|
|
@ -90,24 +95,51 @@ class AppActionMenu {
|
||||||
|
|
||||||
editText.setOnEditorActionListener { _, actionId, _ ->
|
editText.setOnEditorActionListener { _, actionId, _ ->
|
||||||
if (actionId == EditorInfo.IME_ACTION_DONE) {
|
if (actionId == EditorInfo.IME_ACTION_DONE) {
|
||||||
val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
val imm =
|
||||||
|
activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
imm.hideSoftInputFromWindow(editText.windowToken, 0)
|
imm.hideSoftInputFromWindow(editText.windowToken, 0)
|
||||||
sharedPreferenceManager.setAppName(activity, appInfo.packageName, workProfile, editText.text.toString())
|
sharedPreferenceManager.setAppName(
|
||||||
|
activity,
|
||||||
|
appInfo.packageName,
|
||||||
|
workProfile,
|
||||||
|
editText.text.toString()
|
||||||
|
)
|
||||||
|
|
||||||
|
val newPosition = activity.getInstalledApps()
|
||||||
|
.indexOfFirst { it.first.applicationInfo.packageName == appInfo.packageName && it.second.second == workProfile }
|
||||||
uiScope.launch {
|
uiScope.launch {
|
||||||
activity.updateItem(position,Pair(mainActivity!!, Pair(userHandle, workProfile)))
|
activity.updateItem(position, app)
|
||||||
|
activity.moveItem(position, newPosition)
|
||||||
|
activity.manualRefresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
return@setOnEditorActionListener true
|
return@setOnEditorActionListener true
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resetButton.setOnClickListener {
|
||||||
|
val imm =
|
||||||
|
activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
|
imm.hideSoftInputFromWindow(editLayout.windowToken, 0)
|
||||||
|
sharedPreferenceManager.resetAppName(
|
||||||
|
activity,
|
||||||
|
app.first.applicationInfo.packageName,
|
||||||
|
app.second.second
|
||||||
|
)
|
||||||
|
val newPosition = activity.getInstalledApps()
|
||||||
|
.indexOfFirst { it.first.applicationInfo.packageName == appInfo.packageName && it.second.second == workProfile }
|
||||||
|
activity.updateItem(position, app)
|
||||||
|
activity.moveItem(position, newPosition)
|
||||||
|
activity.manualRefresh()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
actionMenu.findViewById<TextView>(R.id.hide).setOnClickListener {
|
actionMenu.findViewById<TextView>(R.id.hide).setOnClickListener {
|
||||||
sharedPreferenceManager.setAppHidden(activity, appInfo.packageName, workProfile, true)
|
|
||||||
textView.visibility = View.GONE
|
|
||||||
editLayout.visibility = View.GONE
|
editLayout.visibility = View.GONE
|
||||||
|
textView.visibility = View.GONE
|
||||||
actionMenu.visibility = View.GONE
|
actionMenu.visibility = View.GONE
|
||||||
|
sharedPreferenceManager.setAppHidden(activity, appInfo.packageName, workProfile, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
actionMenu.findViewById<TextView>(R.id.close).setOnClickListener {
|
actionMenu.findViewById<TextView>(R.id.close).setOnClickListener {
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,9 @@ import android.os.Bundle
|
||||||
import android.os.UserHandle
|
import android.os.UserHandle
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.view.inputmethod.InputMethodManager
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
|
@ -72,7 +74,7 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
searchView = findViewById(R.id.searchView)
|
searchView = findViewById(R.id.searchView)
|
||||||
|
|
||||||
recyclerView = findViewById(R.id.recycler_view)
|
recyclerView = findViewById(R.id.recycler_view)
|
||||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
recyclerView.scrollToPosition(0)
|
||||||
installedApps = getInstalledApps()
|
installedApps = getInstalledApps()
|
||||||
filteredApps = mutableListOf()
|
filteredApps = mutableListOf()
|
||||||
filteredApps.addAll(installedApps)
|
filteredApps.addAll(installedApps)
|
||||||
|
|
@ -88,7 +90,6 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
val mainActivity = launcherApps.getActivityList(appInfo.applicationInfo.packageName, userHandle).firstOrNull()
|
val mainActivity = launcherApps.getActivityList(appInfo.applicationInfo.packageName, userHandle).firstOrNull()
|
||||||
if (mainActivity != null) {
|
if (mainActivity != null) {
|
||||||
launcherApps.startMainActivity(mainActivity.componentName, userHandle, null, null)
|
launcherApps.startMainActivity(mainActivity.componentName, userHandle, null, null)
|
||||||
finish()
|
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(this, "Cannot launch app", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Cannot launch app", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|
@ -182,7 +183,7 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
return this.replace("[^a-zA-Z0-9]".toRegex(), "")
|
return this.replace("[^a-zA-Z0-9]".toRegex(), "")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getInstalledApps(): List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>> {
|
fun getInstalledApps(): List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>> {
|
||||||
val allApps = mutableListOf<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>()
|
val allApps = mutableListOf<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>()
|
||||||
val launcherApps = getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps
|
val launcherApps = getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps
|
||||||
for (i in launcherApps.profiles.indices) {
|
for (i in launcherApps.profiles.indices) {
|
||||||
|
|
@ -202,30 +203,39 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
override fun onStop() {
|
override fun onStop() {
|
||||||
super.onStop()
|
super.onStop()
|
||||||
job.cancel()
|
job.cancel()
|
||||||
//finish()
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
super.onStart()
|
super.onStart()
|
||||||
startTask()
|
startTask()
|
||||||
|
val imm =
|
||||||
|
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
|
imm.hideSoftInputFromWindow(binding.root.windowToken, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startTask() {
|
private fun startTask() {
|
||||||
job = CoroutineScope(Dispatchers.Default).launch {
|
job = CoroutineScope(Dispatchers.Default).launch {
|
||||||
while (true) {
|
while (true) {
|
||||||
val updatedApps = getInstalledApps()
|
manualRefresh()
|
||||||
val changes = detectChanges(installedApps, updatedApps)
|
|
||||||
installedApps = updatedApps
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
applyChanges(changes, installedApps)
|
|
||||||
}
|
|
||||||
delay(5000)
|
delay(5000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data class Change(val type: ChangeType, val position: Int)
|
fun manualRefresh() {
|
||||||
|
CoroutineScope(Dispatchers.Default).launch {
|
||||||
|
val updatedApps = getInstalledApps()
|
||||||
|
val changes = detectChanges(installedApps, updatedApps)
|
||||||
|
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
applyChanges(changes, installedApps)
|
||||||
|
}
|
||||||
|
installedApps = updatedApps
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Change(val type: ChangeType, val position: Int, val newPosition: Int = 0)
|
||||||
|
|
||||||
enum class ChangeType {
|
enum class ChangeType {
|
||||||
INSERT, REMOVE, UPDATE
|
INSERT, REMOVE, UPDATE
|
||||||
|
|
@ -237,6 +247,16 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
val oldSet = oldList.map { Pair(it.first.applicationInfo.packageName, it.second.second) }.toSet()
|
val oldSet = oldList.map { Pair(it.first.applicationInfo.packageName, it.second.second) }.toSet()
|
||||||
val newSet = newList.map { Pair(it.first.applicationInfo.packageName, it.second.second) }.toSet()
|
val newSet = newList.map { Pair(it.first.applicationInfo.packageName, it.second.second) }.toSet()
|
||||||
|
|
||||||
|
oldList.forEachIndexed { index, oldItem ->
|
||||||
|
if (newSet.contains(Pair(oldItem.first.applicationInfo.packageName, oldItem.second.second))) {
|
||||||
|
val newIndex = newList.indexOfFirst { it.first.applicationInfo.packageName == oldItem.first.applicationInfo.packageName && it.second.second == oldItem.second.second }
|
||||||
|
if (oldItem.first.componentName != newList[newIndex].first.componentName) {
|
||||||
|
changes.add(Change(ChangeType.UPDATE, index))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Detect insertions
|
// Detect insertions
|
||||||
newList.forEachIndexed { index, newItem ->
|
newList.forEachIndexed { index, newItem ->
|
||||||
if (!oldSet.contains(Pair(newItem.first.applicationInfo.packageName, newItem.second.second))) {
|
if (!oldSet.contains(Pair(newItem.first.applicationInfo.packageName, newItem.second.second))) {
|
||||||
|
|
@ -252,14 +272,7 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detect updates
|
// Detect updates
|
||||||
oldList.forEachIndexed { index, oldItem ->
|
|
||||||
if (newSet.contains(Pair(oldItem.first.applicationInfo.packageName, oldItem.second.second))) {
|
|
||||||
val newIndex = newList.indexOfFirst { it.first.applicationInfo.packageName == oldItem.first.applicationInfo.packageName }
|
|
||||||
if (oldItem.first.componentName != newList[newIndex].first.componentName) {
|
|
||||||
changes.add(Change(ChangeType.UPDATE, index))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
changes.addAll(removalChanges.reversed())
|
changes.addAll(removalChanges.reversed())
|
||||||
|
|
||||||
|
|
@ -296,4 +309,10 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
adapter.notifyItemChanged(position)
|
adapter.notifyItemChanged(position)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun moveItem(position: Int, newPosition: Int) {
|
||||||
|
Log.d("Movestatus","MOVED")
|
||||||
|
adapter.moveApp(position, newPosition)
|
||||||
|
adapter.notifyItemMoved(position, newPosition)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -114,12 +114,6 @@ class AppMenuAdapter(
|
||||||
holder.textView.text = sharedPreferenceManager.getAppName(activity, app.first.applicationInfo.packageName,app.second.second, appInfo.loadLabel(holder.itemView.context.packageManager))
|
holder.textView.text = sharedPreferenceManager.getAppName(activity, app.first.applicationInfo.packageName,app.second.second, appInfo.loadLabel(holder.itemView.context.packageManager))
|
||||||
holder.editView.findViewById<EditText>(R.id.app_name_edit).setText(holder.textView.text)
|
holder.editView.findViewById<EditText>(R.id.app_name_edit).setText(holder.textView.text)
|
||||||
holder.textView.visibility = View.VISIBLE
|
holder.textView.visibility = View.VISIBLE
|
||||||
holder.editView.findViewById<AppCompatButton>(R.id.reset).setOnClickListener {
|
|
||||||
val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
|
||||||
imm.hideSoftInputFromWindow(holder.editView.windowToken, 0)
|
|
||||||
sharedPreferenceManager.resetAppName(activity, app.first.applicationInfo.packageName, app.second.second)
|
|
||||||
activity.updateItem(position, app)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int {
|
||||||
|
|
@ -137,4 +131,10 @@ class AppMenuAdapter(
|
||||||
fun updateApp(position: Int, app: Pair<LauncherActivityInfo, Pair<UserHandle, Int>>) {
|
fun updateApp(position: Int, app: Pair<LauncherActivityInfo, Pair<UserHandle, Int>>) {
|
||||||
apps[position] = app
|
apps[position] = app
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun moveApp(position: Int, newPosition: Int) {
|
||||||
|
val app = apps.removeAt(position)
|
||||||
|
apps.add(newPosition, app)
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -36,7 +36,8 @@
|
||||||
android:padding="0dp"
|
android:padding="0dp"
|
||||||
android:requiresFadingEdge="vertical"
|
android:requiresFadingEdge="vertical"
|
||||||
android:scrollbars="none"
|
android:scrollbars="none"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager">
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
|
app:stackFromEnd="true">
|
||||||
|
|
||||||
</androidx.recyclerview.widget.RecyclerView>
|
</androidx.recyclerview.widget.RecyclerView>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue