Shortcut base functionality implemented (not saved yet)

This commit is contained in:
ottoptj 2024-05-19 15:28:50 +03:00
commit 288c7921f6
3 changed files with 124 additions and 31 deletions

View file

@ -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,7 +27,7 @@ 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
@ -38,8 +41,27 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
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,
@ -76,9 +103,23 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
) { ) {
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() {

View file

@ -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,20 +59,34 @@ 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
if (menuMode == "shortcut") {
shortcutListener.onShortcut(app, apps[position].second.first, textView)
}
else if (menuMode == "app") {
itemClickListener.onItemClick(app, apps[position].second.first) itemClickListener.onItemClick(app, apps[position].second.first)
} }
} }
}
if (menuMode == "app") {
itemView.setOnLongClickListener { itemView.setOnLongClickListener {
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
itemLongClickListener.onItemLongClick(app, apps[position].second.first, apps[position].second.second, textView, actionMenuLayout, editView) itemLongClickListener.onItemLongClick(
app,
apps[position].second.first,
apps[position].second.second,
textView,
actionMenuLayout,
editView
)
return@setOnLongClickListener true return@setOnLongClickListener true
} }
false false
} }
} }
} }
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder {
val view = LayoutInflater.from(parent.context) val view = LayoutInflater.from(parent.context)

View file

@ -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) {
}
} }
} }