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
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.LauncherActivityInfo
import android.content.pm.LauncherApps
import android.os.Bundle
import android.os.UserHandle
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.View
import android.widget.EditText
import android.widget.LinearLayout
@ -24,22 +27,41 @@ import kotlinx.coroutines.launch
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 recyclerView: RecyclerView
private lateinit var searchView: EditText
private lateinit var adapter: AppMenuAdapter
private lateinit var filteredApps: MutableList<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
private lateinit var installedApps: List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
private lateinit var job: Job
private var appActionMenu = AppActionMenu()
private lateinit var launcherApps: LauncherApps
private lateinit var binding: ActivityAppMenuBinding
private lateinit var recyclerView: RecyclerView
private lateinit var searchView: EditText
private lateinit var adapter: AppMenuAdapter
private lateinit var filteredApps: MutableList<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
private lateinit var installedApps: List<Pair<LauncherActivityInfo, Pair<UserHandle, Int>>>
private lateinit var job: Job
private var appActionMenu = AppActionMenu()
private lateinit var launcherApps: LauncherApps
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?) {
super.onCreate(savedInstanceState)
menuMode = intent.getStringExtra(MENU_MODE) ?: "app"
binding = ActivityAppMenuBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(null)
@ -50,7 +72,7 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
recyclerView.layoutManager = LinearLayoutManager(this)
installedApps = getInstalledApps()
filteredApps = mutableListOf()
adapter = AppMenuAdapter(this@AppMenuActivity, installedApps, this, this)
adapter = AppMenuAdapter(this@AppMenuActivity, installedApps, this, this,this, menuMode)
recyclerView.adapter = adapter
setupSearch()
@ -60,12 +82,17 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
val mainActivity = launcherApps.getActivityList(appInfo.applicationInfo.packageName, userHandle).firstOrNull()
if (mainActivity != null) {
launcherApps.startMainActivity(mainActivity.componentName, userHandle, null, null)
finish()
} 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()
}
}
override fun onShortcut(appInfo: LauncherActivityInfo, userHandle: UserHandle, textView: TextView) {
callback.invoke(Pair(textView.text.toString(), Pair(appInfo, userHandle,)))
finish()
}
override fun onItemLongClick(
appInfo: LauncherActivityInfo,
userHandle: UserHandle,
@ -74,11 +101,25 @@ class AppMenuActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener,
actionMenuLayout: LinearLayout,
editView: LinearLayout
) {
textView.visibility = View.INVISIBLE
actionMenuLayout.visibility = View.VISIBLE
val 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)
textView.visibility = View.INVISIBLE
actionMenuLayout.visibility = View.VISIBLE
val 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() {

View file

@ -12,10 +12,16 @@ import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.widget.AppCompatButton
import androidx.recyclerview.widget.DiffUtil
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>() {
private val sharedPreferenceManager = SharedPreferenceManager()
@ -24,6 +30,10 @@ class AppMenuAdapter(private val activity: AppMenuActivity, var apps: List<Pair<
fun onItemClick(appInfo: LauncherActivityInfo, userHandle: UserHandle)
}
interface OnShortcutListener {
fun onShortcut(appInfo: LauncherActivityInfo, userHandle: UserHandle, textView: TextView)
}
interface OnItemLongClickListener {
fun onItemLongClick(
appInfo: LauncherActivityInfo,
@ -49,17 +59,31 @@ class AppMenuAdapter(private val activity: AppMenuActivity, var apps: List<Pair<
val position = bindingAdapterPosition
if (position != RecyclerView.NO_POSITION) {
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 {
val position = bindingAdapterPosition
if (position != RecyclerView.NO_POSITION) {
val app = apps[position].first
itemLongClickListener.onItemLongClick(app, apps[position].second.first, apps[position].second.second, textView, actionMenuLayout, editView)
return@setOnLongClickListener true
if (menuMode == "app") {
itemView.setOnLongClickListener {
val position = bindingAdapterPosition
if (position != RecyclerView.NO_POSITION) {
val app = apps[position].first
itemLongClickListener.onItemLongClick(
app,
apps[position].second.first,
apps[position].second.second,
textView,
actionMenuLayout,
editView
)
return@setOnLongClickListener true
}
false
}
false
}
}
}

View file

@ -1,12 +1,19 @@
package eu.ottop.yamlauncher
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.LauncherApps
import android.os.Bundle
import android.util.Log
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
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.core.view.children
import eu.ottop.yamlauncher.databinding.ActivityMainBinding
@ -16,7 +23,7 @@ class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var gestureDetector: GestureDetector
private val sharedPreferenceManager = SharedPreferenceManager()
private lateinit var launcherApps: LauncherApps
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -24,12 +31,29 @@ class MainActivity : AppCompatActivity() {
setContentView(binding.root)
setSupportActionBar(null)
launcherApps = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
for (i in findViewById<LinearLayout>(R.id.shortcuts).children) {
var textView = i as TextView
i.setOnClickListener {
Log.d("hHJKJFAF", "Click done")
}
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
}
}
@ -38,6 +62,8 @@ class MainActivity : AppCompatActivity() {
}
override fun onTouchEvent(event: MotionEvent): Boolean {
gestureDetector.onTouchEvent(event)
return super.onTouchEvent(event)
@ -68,7 +94,9 @@ class MainActivity : AppCompatActivity() {
}
fun openAppMenuActivity() {
startActivity(Intent(this, AppMenuActivity::class.java))
AppMenuActivity.start(this) {
}
}
}