diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index e312f9b..6f26569 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -46,6 +46,7 @@ dependencies {
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.navigation:navigation-fragment-ktx:2.6.0")
implementation("androidx.navigation:navigation-ui-ktx:2.6.0")
+ implementation("com.google.code.gson:gson:2.10")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 84bb871..4a10807 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
+
>>()
+ shownApps = listOf()
searchView = findViewById(R.id.searchView)
container = findViewById(R.id.container)
@@ -62,7 +58,7 @@ class AppMenuActivity : AppCompatActivity() {
})
- binding.root.addOnLayoutChangeListener { view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
+ binding.root.addOnLayoutChangeListener { _, _, top, _, bottom, _, oldTop, _, oldBottom ->
if (bottom - top > oldBottom - oldTop) {
searchView.clearFocus()
}
@@ -70,45 +66,6 @@ class AppMenuActivity : AppCompatActivity() {
}
- override fun onStop() {
- super.onStop()
- checkApps?.cancel()
- }
-
- override fun onStart() {
- super.onStart()
- startTask()
- }
-
- private fun startTask() {
- checkApps = GlobalScope.launch {
- while (true) {
- if (!listsEqual(shownApps, getInstalledPersonalApps())) {
- Log.d("AHAHHAHAA","AHJAHAHA")
- shownApps = getInstalledPersonalApps()
- runOnUiThread {
- deleteAppMenuContents()
- createPersonalAppMenu()
- }
-
- }
- delay(1000)
- }
- }
- }
-
- private fun listsEqual(list1: List>>, list2: List>>): Boolean {
- if (list1.size != list2.size) return false
-
- for (i in list1.indices) {
- if (list1[i].first.componentName != list2[i].first.componentName || list1[i].second.first != list2[i].second.first) {
- return false
- }
- }
-
- return true
- }
-
private fun filterItems(query: String?) {
val cleanQuery = query?.replace("[^a-zA-Z0-9]".toRegex(), "")
@@ -128,30 +85,101 @@ class AppMenuActivity : AppCompatActivity() {
}
}
+ override fun onStop() {
+ super.onStop()
+ checkApps?.cancel()
+ }
+
+ override fun onStart() {
+ super.onStart()
+ startTask()
+ }
+
+ private fun startTask() {
+ checkApps = GlobalScope.launch {
+ while (true) {
+ if (!listsEqual(shownApps, getInstalledApps())) {
+ shownApps = getInstalledApps()
+ runOnUiThread {
+ refreshAppMenu()
+ }
+
+ }
+ delay(1000)
+ }
+ }
+ }
+
+ private fun listsEqual(
+ list1: List>>,
+ list2: List>>
+ ): Boolean {
+ if (list1.size != list2.size) return false
+
+ for (i in list1.indices) {
+ if (list1[i].first.componentName != list2[i].first.componentName || list1[i].second.first != list2[i].second.first) {
+ return false
+ }
+ }
+
+ return true
+ }
+
+ private fun refreshAppMenu() {
+ deleteAppMenuContents()
+ createAppMenu()
+ }
+
+ private fun deleteAppMenuContents(): Boolean {
+ binding.container.removeAllViewsInLayout()
+ return true
+ }
+
+ private fun createAppMenu(): Boolean {
+ val apps = getInstalledApps()
+ apps.forEach { appInfo ->
+ createAppText(appInfo.first, appInfo.second.first, appInfo.second.second)
+ }
+ return true
+ }
+
private fun getInstalledApps(): List>> {
val allApps = mutableListOf>>()
val launcherApps = this.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
for (i in launcherApps.profiles.indices) {
launcherApps.getActivityList(null, launcherApps.profiles[i]).forEach { app ->
- allApps.add(Pair(app, Pair(launcherApps.profiles[i], i)))
+ if (!isAppHidden(app.activityInfo.applicationInfo.packageName, i)) {
+ allApps.add(Pair(app, Pair(launcherApps.profiles[i], i)))
+ }
}
-
}
- return allApps.sortedBy { it.first.label.toString().lowercase() }
+ return allApps.sortedBy {
+ it.first.applicationInfo.loadLabel(packageManager).toString().lowercase()
+ }
}
- private fun getInstalledPersonalApps(): List>> {
- return getInstalledApps()
- }
-
- private fun getInstalledWorkApps(): List>> {
- return getInstalledApps()
- }
-
- private fun createAppMenu(appInfo: LauncherActivityInfo, userHandle: UserHandle, workProfile: Int): Boolean {
+ private fun createAppText(
+ appInfo: LauncherActivityInfo,
+ userHandle: UserHandle,
+ workProfile: Int
+ ): Boolean {
val appInfo = appInfo.activityInfo.applicationInfo
- val textView = TextView(this)
+ val textView = TextView(this)
+ val launcherApps = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
+ val mainActivity =
+ launcherApps.getActivityList(appInfo.packageName, userHandle).firstOrNull()
+
+ setupTextView(textView, appInfo, workProfile)
+
+ setupTextListeners(textView, appInfo, userHandle, workProfile, launcherApps, mainActivity)
+
+ binding.container.addView(textView)
+
+ return true
+ }
+
+ private fun setupTextView(textView: TextView, appInfo: ApplicationInfo, workProfile: Int) {
val states = arrayOf(
intArrayOf(-android.R.attr.state_pressed),
intArrayOf(android.R.attr.state_pressed)
@@ -164,57 +192,136 @@ class AppMenuActivity : AppCompatActivity() {
with(textView) {
textSize = 28f
- setPadding(0,0,0,50)
+ setPadding(0, 10, 0, 80)
isClickable = true
focusable = View.FOCUSABLE
gravity = Gravity.START
- if (workProfile != 0) {
- text = "*"+appInfo.loadLabel(packageManager)
- }
- else {
- text = appInfo.loadLabel(packageManager)
+ text = if (workProfile != 0) {
+ "*" + appInfo.loadLabel(packageManager)
+ } else {
+ appInfo.loadLabel(packageManager)
}
setTextColor(ColorStateList(states, colors))
}
+ }
-
+ private fun setupTextListeners(
+ textView: TextView,
+ appInfo: ApplicationInfo,
+ userHandle: UserHandle,
+ workProfile: Int,
+ launcherApps: LauncherApps,
+ mainActivity: LauncherActivityInfo?
+ ) {
textView.setOnLongClickListener {
- Toast.makeText(this, "Long press detected on ${appInfo.loadLabel(packageManager)}", Toast.LENGTH_SHORT).show()
-
- true
+ appActionMenu(textView, appInfo, userHandle, workProfile, launcherApps, mainActivity)
}
textView.setOnClickListener {
- val launcherApps = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
- val packageName = appInfo.packageName
-
- val mainActivity = launcherApps.getActivityList(packageName, userHandle).firstOrNull()
-
if (mainActivity != null) {
launcherApps.startMainActivity(mainActivity.componentName, userHandle, null, null)
} else {
- Toast.makeText(this, "Unable to launch ${appInfo.loadLabel(packageManager)}", Toast.LENGTH_SHORT).show()
+ Toast.makeText(
+ this,
+ "Unable to launch ${appInfo.loadLabel(packageManager)}",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+ }
+
+ private fun appActionMenu(
+ textView: TextView,
+ appInfo: ApplicationInfo,
+ userHandle: UserHandle,
+ workProfile: Int,
+ launcherApps: LauncherApps,
+ mainActivity: LauncherActivityInfo?
+ ): Boolean {
+ val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
+ val popupView = inflater.inflate(R.layout.app_action_menu, null)
+
+ val popupWindow = PopupWindow(
+ popupView,
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ )
+
+ popupWindow.isOutsideTouchable = true
+ popupWindow.isFocusable = true
+
+ popupWindow.animationStyle = android.R.style.Animation_Translucent
+
+ if (appInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0) {
+ popupView.findViewById(R.id.uninstall).visibility = View.GONE
+ }
+
+ textView.visibility = View.INVISIBLE
+
+ popupWindow.showAsDropDown(textView, 0, -textView.height)
+
+ popupWindow.setOnDismissListener {
+ textView.visibility = View.VISIBLE
+ }
+
+ popupView.findViewById(R.id.info).setOnClickListener {
+ if (mainActivity != null) {
+ launcherApps.startAppDetailsActivity(
+ mainActivity.componentName,
+ userHandle,
+ null,
+ null
+ )
}
+ popupWindow.dismiss()
}
- // Add the button to the LinearLayout
- binding.container.addView(textView)
+ popupView.findViewById(R.id.uninstall).setOnClickListener {
+ val intent = Intent(Intent.ACTION_DELETE)
+ intent.data = Uri.parse("package:${appInfo.packageName}")
+ intent.putExtra(Intent.EXTRA_USER, userHandle)
+ startActivity(intent)
- return true
- }
-
- private fun createPersonalAppMenu(): Boolean {
- val pApps = getInstalledPersonalApps()
- pApps.forEach { appInfo ->
- createAppMenu(appInfo.first, appInfo.second.first, appInfo.second.second)
+ popupWindow.dismiss()
}
- return true
+
+ popupView.findViewById(R.id.rename).setOnClickListener {
+ // Handle rename action
+ popupWindow.dismiss()
+ }
+
+ popupView.findViewById(R.id.hide).setOnClickListener {
+ setAppHidden(appInfo.packageName, workProfile, true)
+ refreshAppMenu()
+
+ popupWindow.dismiss()
+ }
+
+ return true // Indicate that the long click event is consumed}
}
- private fun deleteAppMenuContents(): Boolean {
- binding.container.removeAllViewsInLayout()
- return true
+ private fun setAppHidden(packageName: String, profile: Int, hidden: Boolean) {
+ // Get the shared preferences editor
+ val editor = getSharedPreferences("app_data", MODE_PRIVATE).edit()
+ val key = "$packageName-${profile}"
+ editor.putBoolean(key, hidden)
+ editor.apply()
}
-}
+
+ private fun isAppHidden(packageName: String, profile: Int): Boolean {
+ // Get the shared preferences object
+ val sharedPref = getSharedPreferences("app_data", MODE_PRIVATE)
+ val key = "$packageName-${profile}"
+ return sharedPref.getBoolean(key, false) // Default to false (visible)
+ }
+
+ private fun setAppVisible(packageName: String, profile: Int) {
+ // Get the shared preferences editor
+ val editor = getSharedPreferences("app_data", MODE_PRIVATE).edit()
+ val key = "$packageName-${profile}"
+ editor.remove(key)
+ editor.apply()
+ }
+}
\ 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 fa72616..ae84924 100644
--- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt
+++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt
@@ -1,24 +1,9 @@
package eu.ottop.yamlauncher
import android.content.Intent
-import android.content.res.ColorStateList
-import android.graphics.Color
import android.os.Bundle
-import android.view.Gravity
-import android.view.Menu
-import android.view.MenuItem
-import android.view.MotionEvent
import android.view.View
-import android.view.View.FOCUSABLE
-import android.view.View.OnFocusChangeListener
-import android.widget.LinearLayout
-import android.widget.SearchView
-import android.widget.TextView
-import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
-import androidx.navigation.findNavController
-import androidx.navigation.ui.AppBarConfiguration
-import androidx.navigation.ui.navigateUp
import eu.ottop.yamlauncher.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
diff --git a/app/src/main/java/eu/ottop/yamlauncher/PersonalAppsFragment.kt b/app/src/main/java/eu/ottop/yamlauncher/PersonalAppsFragment.kt
deleted file mode 100644
index 4e70ec3..0000000
--- a/app/src/main/java/eu/ottop/yamlauncher/PersonalAppsFragment.kt
+++ /dev/null
@@ -1,241 +0,0 @@
-package eu.ottop.yamlauncher
-
-import android.content.Context
-import android.content.pm.LauncherActivityInfo
-import android.content.pm.LauncherApps
-import android.content.res.ColorStateList
-import android.graphics.Color
-import android.os.Bundle
-import android.os.UserHandle
-import android.util.Log
-import android.view.Gravity
-import androidx.fragment.app.Fragment
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.LinearLayout
-import android.widget.SearchView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.core.content.getSystemService
-import com.google.android.material.tabs.TabLayout
-import com.google.android.material.tabs.TabLayoutMediator
-import eu.ottop.yamlauncher.databinding.ActivityAppMenuBinding
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-
-// TODO: Rename parameter arguments, choose names that match
-// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
-private const val ARG_PARAM1 = "param1"
-private const val ARG_PARAM2 = "param2"
-
-/**
- * A simple [Fragment] subclass.
- * Use the [PersonalAppsFragment.newInstance] factory method to
- * create an instance of this fragment.
- */
-class PersonalAppsFragment : Fragment() {
-
- private lateinit var binding: ActivityAppMenuBinding
- private lateinit var searchView: SearchView
- private lateinit var container: LinearLayout
- private lateinit var tabLayout: TabLayout
- private var checkApps: Job? = null
- private lateinit var shownApps: List
-
-
- override fun onCreateView(
- inflater: LayoutInflater, viewContainer: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- val view = inflater.inflate(R.layout.fragment_personal_apps, viewContainer, false)
-
- // Initialize views from the fragment layout
- container = view.findViewById(R.id.container)
- searchView = requireActivity().findViewById(R.id.searchView)
-
- shownApps = listOf()
-
- searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
- override fun onQueryTextSubmit(query: String?): Boolean {
- searchView.clearFocus()
- return true
- }
-
- override fun onQueryTextChange(newText: String?): Boolean {
- // Filter items based on the search query
- filterItems(newText)
- return true
- }
-
- })
-
- return view
- }
-
- override fun onPause() {
- super.onPause()
- checkApps?.cancel()
- searchView.setOnQueryTextListener(null)
- }
-
- override fun onStart() {
- super.onStart()
- startTask()
- }
-
- private fun filterItems(query: String?) {
- val cleanQuery = query?.replace("[^a-zA-Z0-9]".toRegex(), "")
-
- for (i in 0 until container.childCount) {
- val view = container.getChildAt(i)
-
- if (view is TextView) {
- val itemText = view.text.toString()
- val cleanItemText = itemText.replace("[^a-zA-Z0-9]".toRegex(), "")
-
- if (cleanItemText.contains(cleanQuery ?: "", ignoreCase = true)) {
- view.visibility = View.VISIBLE
- } else {
- view.visibility = View.GONE
- }
- }
- }
- }
-
- private fun startTask() {
- checkApps = GlobalScope.launch {
- while (true) {
- Log.d("APPSITUATION", "Ahahahaha")
- if (!listsEqual(shownApps, getInstalledPersonalApps())) {
- shownApps = getInstalledPersonalApps()
- requireActivity().runOnUiThread {
- deleteAppMenuContents()
- createPersonalAppMenu()
- }
-
- }
- delay(1000)
- }
- }
- }
-
- private fun listsEqual(
- list1: List,
- list2: List
- ): Boolean {
- if (list1.size != list2.size) return false
-
- for (i in list1.indices) {
- if (list1[i].label != list2[i].label) {
- return false
- }
- }
-
- return true
- }
-
- private fun getInstalledApps(profile: Int): List {
- val allApps = mutableListOf()
- val launcherApps =
- requireActivity().getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
-
- allApps.addAll(launcherApps.getActivityList(null, launcherApps.profiles[profile]))
-
- return allApps.sortedWith(compareBy {
- it.applicationInfo.loadLabel(requireActivity().packageManager).toString().lowercase()
- })
- }
-
- private fun getInstalledPersonalApps(): List {
- return getInstalledApps(0)
- }
-
- private fun createAppMenu(
- appInfo: LauncherActivityInfo,
- userHandle: UserHandle,
- workProfile: Boolean
- ): Boolean {
- val appInfo = appInfo.activityInfo.applicationInfo
- val textView = TextView(requireContext())
- textView.textSize = 28f
- textView.setPadding(0, 0, 0, 50)
-
- val states = arrayOf(
- intArrayOf(-android.R.attr.state_pressed),
- intArrayOf(android.R.attr.state_pressed)
- )
-
- val colors = intArrayOf(
- Color.parseColor("#f3f3f3"), // Default text color
- Color.parseColor("#c3c3c3") // Text color when pressed
- )
-
- textView.setTextColor(ColorStateList(states, colors))
-
- textView.isClickable = true
- textView.focusable = View.FOCUSABLE
- textView.gravity = Gravity.START
- textView.text = appInfo.loadLabel(requireActivity().packageManager)
-
- textView.setOnLongClickListener {
- Toast.makeText(
- requireContext(),
- "Long press detected on ${appInfo.loadLabel(requireActivity().packageManager)}",
- Toast.LENGTH_SHORT
- ).show()
-
- true
- }
-
- textView.setOnClickListener {
- val launcherApps =
- requireActivity().getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
- val packageName = appInfo.packageName
-
- val mainActivity = launcherApps.getActivityList(packageName, userHandle).firstOrNull()
-
- if (mainActivity != null) {
- launcherApps.startMainActivity(mainActivity.componentName, userHandle, null, null)
- } else {
- Toast.makeText(
- requireContext(),
- "Unable to launch ${appInfo.loadLabel(requireActivity().packageManager)}",
- Toast.LENGTH_SHORT
- ).show()
- }
-
- }
-
- // Add the button to the LinearLayout
- container.addView(textView)
-
- return true
- }
-
- private fun createPersonalAppMenu(): Boolean {
- val pApps = getInstalledPersonalApps()
- pApps.forEach { appInfo ->
- createAppMenu(appInfo, pApps.first().user, false)
- }
- return true
- }
-
- private fun deleteAppMenuContents(): Boolean {
- binding.container.removeAllViewsInLayout()
- return true
-
- }
-
- fun setActivityReferences(binding: ActivityAppMenuBinding) {
- this.binding = binding
- }
-
- companion object {
- fun newInstance(binding: ActivityAppMenuBinding) = PersonalAppsFragment().apply {
- this.binding = binding
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/eu/ottop/yamlauncher/WorkAppsFragment.kt b/app/src/main/java/eu/ottop/yamlauncher/WorkAppsFragment.kt
deleted file mode 100644
index 1cefc46..0000000
--- a/app/src/main/java/eu/ottop/yamlauncher/WorkAppsFragment.kt
+++ /dev/null
@@ -1,237 +0,0 @@
-package eu.ottop.yamlauncher
-
-import android.content.Context
-import android.content.pm.LauncherActivityInfo
-import android.content.pm.LauncherApps
-import android.content.res.ColorStateList
-import android.graphics.Color
-import android.os.Bundle
-import android.os.UserHandle
-import android.util.Log
-import android.view.Gravity
-import androidx.fragment.app.Fragment
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.LinearLayout
-import android.widget.SearchView
-import android.widget.TextView
-import android.widget.Toast
-import com.google.android.material.tabs.TabLayout
-import eu.ottop.yamlauncher.databinding.ActivityAppMenuBinding
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-
-// TODO: Rename parameter arguments, choose names that match
-// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
-private const val ARG_PARAM1 = "param1"
-private const val ARG_PARAM2 = "param2"
-
-/**
- * A simple [Fragment] subclass.
- * Use the [WorkAppsFragment.newInstance] factory method to
- * create an instance of this fragment.
- */
-class WorkAppsFragment : Fragment() {
- private lateinit var binding: ActivityAppMenuBinding
- private lateinit var searchView: SearchView
- private lateinit var container: LinearLayout
- private lateinit var tabLayout: TabLayout
- private var checkApps: Job? = null
- private lateinit var shownApps: List
-
-
- override fun onCreateView(
- inflater: LayoutInflater, viewContainer: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- val view = inflater.inflate(R.layout.fragment_personal_apps, viewContainer, false)
-
- // Initialize views from the fragment layout
- container = view.findViewById(R.id.container)
- searchView = requireActivity().findViewById(R.id.searchView)
-
- shownApps = listOf()
-
- searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
- override fun onQueryTextSubmit(query: String?): Boolean {
- searchView.clearFocus()
- return true
- }
-
- override fun onQueryTextChange(newText: String?): Boolean {
-
- filterItems(newText)
- return true
- }
-
- })
-
- return view
- }
-
- override fun onPause() {
- super.onPause()
- checkApps?.cancel()
- }
-
- override fun onStart() {
- super.onStart()
- startTask()
- }
-
- private fun filterItems(query: String?) {
- val cleanQuery = query?.replace("[^a-zA-Z0-9]".toRegex(), "")
-
- for (i in 0 until container.childCount) {
- val view = container.getChildAt(i)
-
- if (view is TextView) {
- val itemText = view.text.toString()
- val cleanItemText = itemText.replace("[^a-zA-Z0-9]".toRegex(), "")
-
- if (cleanItemText.contains(cleanQuery ?: "", ignoreCase = true)) {
- view.visibility = View.VISIBLE
- } else {
- view.visibility = View.GONE
- }
- }
- }
- }
-
- private fun startTask() {
- checkApps = GlobalScope.launch {
- while (true) {
- Log.d("APPSITUATION1234", "Ahahahaha")
- if (!listsEqual(shownApps, getInstalledWorkApps())) {
- shownApps = getInstalledWorkApps()
- requireActivity().runOnUiThread {
- deleteAppMenuContents()
- createWorkAppMenu()
- }
-
- }
- delay(1000)
- }
- }
- }
-
- private fun listsEqual(
- list1: List,
- list2: List
- ): Boolean {
- if (list1.size != list2.size) return false
-
- for (i in list1.indices) {
- if (list1[i].label != list2[i].label) {
- return false
- }
- }
-
- return true
- }
-
- private fun getInstalledApps(profile: Int): List {
- val allApps = mutableListOf()
- val launcherApps =
- requireActivity().getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
-
- allApps.addAll(launcherApps.getActivityList(null, launcherApps.profiles[profile]))
-
- return allApps.sortedWith(compareBy {
- it.applicationInfo.loadLabel(requireActivity().packageManager).toString().lowercase()
- })
- }
-
- private fun getInstalledWorkApps(): List {
- return getInstalledApps(1)
- }
-
- private fun createAppMenu(
- appInfo: LauncherActivityInfo,
- userHandle: UserHandle,
- workProfile: Boolean
- ): Boolean {
- val appInfo = appInfo.activityInfo.applicationInfo
- val textView = TextView(requireContext())
- textView.textSize = 28f
- textView.setPadding(0, 0, 0, 50)
-
- val states = arrayOf(
- intArrayOf(-android.R.attr.state_pressed),
- intArrayOf(android.R.attr.state_pressed)
- )
-
- val colors = intArrayOf(
- Color.parseColor("#f3f3f3"), // Default text color
- Color.parseColor("#c3c3c3") // Text color when pressed
- )
-
- textView.setTextColor(ColorStateList(states, colors))
-
- textView.isClickable = true
- textView.focusable = View.FOCUSABLE
- textView.gravity = Gravity.START
- textView.text = appInfo.loadLabel(requireActivity().packageManager)
-
- textView.setOnLongClickListener {
- Toast.makeText(
- requireContext(),
- "Long press detected on ${appInfo.loadLabel(requireActivity().packageManager)}",
- Toast.LENGTH_SHORT
- ).show()
-
- true
- }
-
- textView.setOnClickListener {
- val launcherApps =
- requireActivity().getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
- val packageName = appInfo.packageName
-
- val mainActivity = launcherApps.getActivityList(packageName, userHandle).firstOrNull()
-
- if (mainActivity != null) {
- launcherApps.startMainActivity(mainActivity.componentName, userHandle, null, null)
- } else {
- Toast.makeText(
- requireContext(),
- "Unable to launch ${appInfo.loadLabel(requireActivity().packageManager)}",
- Toast.LENGTH_SHORT
- ).show()
- }
-
- }
-
- // Add the button to the LinearLayout
- container.addView(textView)
-
- return true
- }
-
- private fun createWorkAppMenu(): Boolean {
- val pApps = getInstalledWorkApps()
- pApps.forEach { appInfo ->
- createAppMenu(appInfo, pApps.first().user, false)
- }
- return true
- }
-
- private fun deleteAppMenuContents(): Boolean {
- binding.container.removeAllViewsInLayout()
- return true
-
- }
-
- fun setActivityReferences(binding: ActivityAppMenuBinding) {
- this.binding = binding
- }
-
- companion object {
- fun newInstance(binding: ActivityAppMenuBinding) = WorkAppsFragment().apply {
- this.binding = binding
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/app_action_foreground.xml b/app/src/main/res/drawable/app_action_foreground.xml
new file mode 100644
index 0000000..5373e2e
--- /dev/null
+++ b/app/src/main/res/drawable/app_action_foreground.xml
@@ -0,0 +1,15 @@
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/app_action_menu.xml b/app/src/main/res/layout/app_action_menu.xml
new file mode 100644
index 0000000..09edb44
--- /dev/null
+++ b/app/src/main/res/layout/app_action_menu.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_personal_apps.xml b/app/src/main/res/layout/fragment_personal_apps.xml
deleted file mode 100644
index df57df5..0000000
--- a/app/src/main/res/layout/fragment_personal_apps.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_work_apps.xml b/app/src/main/res/layout/fragment_work_apps.xml
deleted file mode 100644
index e37d527..0000000
--- a/app/src/main/res/layout/fragment_work_apps.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file