mirror of
https://github.com/He4eT/yamf_launcher.git
synced 2026-05-05 09:57:26 +00:00
Shortcut base functionality implemented (not saved yet)
This commit is contained in:
parent
6db5725aa5
commit
288c7921f6
3 changed files with 124 additions and 31 deletions
|
|
@ -1,12 +1,15 @@
|
||||||
package eu.ottop.yamlauncher
|
package eu.ottop.yamlauncher
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
import android.content.pm.LauncherActivityInfo
|
import android.content.pm.LauncherActivityInfo
|
||||||
import android.content.pm.LauncherApps
|
import android.content.pm.LauncherApps
|
||||||
import android.os.Bundle
|
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.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
|
@ -24,22 +27,41 @@ import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
|
|
||||||
class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, AppMenuAdapter.OnItemLongClickListener {
|
class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, AppMenuAdapter.OnShortcutListener, AppMenuAdapter.OnItemLongClickListener {
|
||||||
|
|
||||||
private lateinit var binding: ActivityAppMenuBinding
|
private lateinit var binding: ActivityAppMenuBinding
|
||||||
private lateinit var recyclerView: RecyclerView
|
private lateinit var recyclerView: RecyclerView
|
||||||
private lateinit var searchView: EditText
|
private lateinit var searchView: EditText
|
||||||
private lateinit var adapter: AppMenuAdapter
|
private lateinit var adapter: AppMenuAdapter
|
||||||
private lateinit var filteredApps: MutableList<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
|
private lateinit var filteredApps: MutableList<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
|
||||||
private lateinit var installedApps: List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
|
private lateinit var installedApps: List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
|
||||||
private lateinit var job: Job
|
private lateinit var job: Job
|
||||||
private var appActionMenu = AppActionMenu()
|
private var appActionMenu = AppActionMenu()
|
||||||
private lateinit var launcherApps: LauncherApps
|
private lateinit var launcherApps: LauncherApps
|
||||||
|
|
||||||
private val sharedPreferenceManager = SharedPreferenceManager()
|
private val sharedPreferenceManager = SharedPreferenceManager()
|
||||||
|
|
||||||
|
private lateinit var menuMode: String
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private lateinit var callback: (Pair<String, Pair<LauncherActivityInfo, UserHandle>>) -> Unit
|
||||||
|
private const val MENU_MODE = "abcd"
|
||||||
|
|
||||||
|
fun start(context: Context, param1: String = "app", callback: (Pair<String, Pair<LauncherActivityInfo, UserHandle>>) -> Unit) {
|
||||||
|
val intent = Intent(context, AppMenuActivity::class.java).apply {
|
||||||
|
putExtra(MENU_MODE, param1)
|
||||||
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
|
||||||
|
this.callback = callback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
menuMode = intent.getStringExtra(MENU_MODE) ?: "app"
|
||||||
|
|
||||||
binding = ActivityAppMenuBinding.inflate(layoutInflater)
|
binding = ActivityAppMenuBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
setSupportActionBar(null)
|
setSupportActionBar(null)
|
||||||
|
|
@ -50,7 +72,7 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
recyclerView.layoutManager = LinearLayoutManager(this)
|
||||||
installedApps = getInstalledApps()
|
installedApps = getInstalledApps()
|
||||||
filteredApps = mutableListOf()
|
filteredApps = mutableListOf()
|
||||||
adapter = AppMenuAdapter(this@AppMenuActivity, installedApps, this, this)
|
adapter = AppMenuAdapter(this@AppMenuActivity, installedApps, this, this,this, menuMode)
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
|
|
||||||
setupSearch()
|
setupSearch()
|
||||||
|
|
@ -60,12 +82,17 @@ 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 {
|
||||||
// Handle the case when launch intent is null (e.g., app cannot be launched)
|
|
||||||
Toast.makeText(this, "Cannot launch app", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Cannot launch app", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onShortcut(appInfo: LauncherActivityInfo, userHandle: UserHandle, textView: TextView) {
|
||||||
|
callback.invoke(Pair(textView.text.toString(), Pair(appInfo, userHandle,)))
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onItemLongClick(
|
override fun onItemLongClick(
|
||||||
appInfo: LauncherActivityInfo,
|
appInfo: LauncherActivityInfo,
|
||||||
userHandle: UserHandle,
|
userHandle: UserHandle,
|
||||||
|
|
@ -74,11 +101,25 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
|
||||||
actionMenuLayout: LinearLayout,
|
actionMenuLayout: LinearLayout,
|
||||||
editView: LinearLayout
|
editView: LinearLayout
|
||||||
) {
|
) {
|
||||||
textView.visibility = View.INVISIBLE
|
textView.visibility = View.INVISIBLE
|
||||||
actionMenuLayout.visibility = View.VISIBLE
|
actionMenuLayout.visibility = View.VISIBLE
|
||||||
val mainActivity = launcherApps.getActivityList(appInfo.applicationInfo.packageName, userHandle).firstOrNull()
|
val mainActivity =
|
||||||
appActionMenu.setActionListeners(this@AppMenuActivity, CoroutineScope(Dispatchers.Main), binding, textView, editView, actionMenuLayout, searchView, appInfo.applicationInfo, userHandle, userProfile, launcherApps, mainActivity)
|
launcherApps.getActivityList(appInfo.applicationInfo.packageName, userHandle)
|
||||||
|
.firstOrNull()
|
||||||
|
appActionMenu.setActionListeners(
|
||||||
|
this@AppMenuActivity,
|
||||||
|
CoroutineScope(Dispatchers.Main),
|
||||||
|
binding,
|
||||||
|
textView,
|
||||||
|
editView,
|
||||||
|
actionMenuLayout,
|
||||||
|
searchView,
|
||||||
|
appInfo.applicationInfo,
|
||||||
|
userHandle,
|
||||||
|
userProfile,
|
||||||
|
launcherApps,
|
||||||
|
mainActivity
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupSearch() {
|
private fun setupSearch() {
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,16 @@ import android.widget.FrameLayout
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.widget.AppCompatButton
|
import androidx.appcompat.widget.AppCompatButton
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
|
||||||
class AppMenuAdapter(private val activity: AppMenuActivity, var apps: List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>, private val itemClickListener: OnItemClickListener, private val itemLongClickListener: OnItemLongClickListener) :
|
class AppMenuAdapter(
|
||||||
|
private val activity: AppMenuActivity,
|
||||||
|
var apps: List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>,
|
||||||
|
private val itemClickListener: OnItemClickListener,
|
||||||
|
private val shortcutListener: OnShortcutListener,
|
||||||
|
private val itemLongClickListener: OnItemLongClickListener,
|
||||||
|
private val menuMode: String
|
||||||
|
) :
|
||||||
RecyclerView.Adapter<AppMenuAdapter.AppViewHolder>() {
|
RecyclerView.Adapter<AppMenuAdapter.AppViewHolder>() {
|
||||||
|
|
||||||
private val sharedPreferenceManager = SharedPreferenceManager()
|
private val sharedPreferenceManager = SharedPreferenceManager()
|
||||||
|
|
@ -24,6 +30,10 @@ class AppMenuAdapter(private val activity: AppMenuActivity, var apps: List<Pair<
|
||||||
fun onItemClick(appInfo: LauncherActivityInfo, userHandle: UserHandle)
|
fun onItemClick(appInfo: LauncherActivityInfo, userHandle: UserHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface OnShortcutListener {
|
||||||
|
fun onShortcut(appInfo: LauncherActivityInfo, userHandle: UserHandle, textView: TextView)
|
||||||
|
}
|
||||||
|
|
||||||
interface OnItemLongClickListener {
|
interface OnItemLongClickListener {
|
||||||
fun onItemLongClick(
|
fun onItemLongClick(
|
||||||
appInfo: LauncherActivityInfo,
|
appInfo: LauncherActivityInfo,
|
||||||
|
|
@ -49,17 +59,31 @@ class AppMenuAdapter(private val activity: AppMenuActivity, var apps: List<Pair<
|
||||||
val position = bindingAdapterPosition
|
val position = bindingAdapterPosition
|
||||||
if (position != RecyclerView.NO_POSITION) {
|
if (position != RecyclerView.NO_POSITION) {
|
||||||
val app = apps[position].first
|
val app = apps[position].first
|
||||||
itemClickListener.onItemClick(app, apps[position].second.first)
|
if (menuMode == "shortcut") {
|
||||||
|
shortcutListener.onShortcut(app, apps[position].second.first, textView)
|
||||||
|
}
|
||||||
|
else if (menuMode == "app") {
|
||||||
|
itemClickListener.onItemClick(app, apps[position].second.first)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
itemView.setOnLongClickListener {
|
if (menuMode == "app") {
|
||||||
val position = bindingAdapterPosition
|
itemView.setOnLongClickListener {
|
||||||
if (position != RecyclerView.NO_POSITION) {
|
val position = bindingAdapterPosition
|
||||||
val app = apps[position].first
|
if (position != RecyclerView.NO_POSITION) {
|
||||||
itemLongClickListener.onItemLongClick(app, apps[position].second.first, apps[position].second.second, textView, actionMenuLayout, editView)
|
val app = apps[position].first
|
||||||
return@setOnLongClickListener true
|
itemLongClickListener.onItemLongClick(
|
||||||
|
app,
|
||||||
|
apps[position].second.first,
|
||||||
|
apps[position].second.second,
|
||||||
|
textView,
|
||||||
|
actionMenuLayout,
|
||||||
|
editView
|
||||||
|
)
|
||||||
|
return@setOnLongClickListener true
|
||||||
|
}
|
||||||
|
false
|
||||||
}
|
}
|
||||||
false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,19 @@
|
||||||
package eu.ottop.yamlauncher
|
package eu.ottop.yamlauncher
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.pm.LauncherApps
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.GestureDetector
|
import android.view.GestureDetector
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.children
|
import androidx.core.view.children
|
||||||
import eu.ottop.yamlauncher.databinding.ActivityMainBinding
|
import eu.ottop.yamlauncher.databinding.ActivityMainBinding
|
||||||
|
|
@ -16,7 +23,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var binding: ActivityMainBinding
|
private lateinit var binding: ActivityMainBinding
|
||||||
private lateinit var gestureDetector: GestureDetector
|
private lateinit var gestureDetector: GestureDetector
|
||||||
private val sharedPreferenceManager = SharedPreferenceManager()
|
private lateinit var launcherApps: LauncherApps
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
@ -24,12 +31,29 @@ class MainActivity : AppCompatActivity() {
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
setSupportActionBar(null)
|
setSupportActionBar(null)
|
||||||
|
|
||||||
|
launcherApps = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
|
||||||
|
|
||||||
for (i in findViewById<LinearLayout>(R.id.shortcuts).children) {
|
for (i in findViewById<LinearLayout>(R.id.shortcuts).children) {
|
||||||
|
|
||||||
|
var textView = i as TextView
|
||||||
|
|
||||||
i.setOnClickListener {
|
i.setOnClickListener {
|
||||||
Log.d("hHJKJFAF", "Click done")
|
Log.d("hHJKJFAF", "Click done")
|
||||||
}
|
}
|
||||||
|
|
||||||
i.setOnLongClickListener {
|
i.setOnLongClickListener {
|
||||||
Log.d("hHJKJFAF", "long click done")
|
AppMenuActivity.start(this@MainActivity, "shortcut") { newText ->
|
||||||
|
textView.text = newText.first
|
||||||
|
i.setOnClickListener {
|
||||||
|
val mainActivity = launcherApps.getActivityList(newText.second.first.applicationInfo.packageName, newText.second.second).firstOrNull()
|
||||||
|
if (mainActivity != null) {
|
||||||
|
launcherApps.startMainActivity(mainActivity.componentName, newText.second.second, null, null)
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "Cannot launch app", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -38,6 +62,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override fun onTouchEvent(event: MotionEvent): Boolean {
|
override fun onTouchEvent(event: MotionEvent): Boolean {
|
||||||
gestureDetector.onTouchEvent(event)
|
gestureDetector.onTouchEvent(event)
|
||||||
return super.onTouchEvent(event)
|
return super.onTouchEvent(event)
|
||||||
|
|
@ -68,7 +94,9 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun openAppMenuActivity() {
|
fun openAppMenuActivity() {
|
||||||
startActivity(Intent(this, AppMenuActivity::class.java))
|
AppMenuActivity.start(this) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue