2023-09-06 10:29:38 +02:00

116 lines
4.5 KiB
Kotlin

package com.simplemobiletools.launcher.extensions
import android.app.Activity
import android.content.ComponentName
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.res.ColorStateList
import android.net.Uri
import android.provider.Settings
import android.view.ContextThemeWrapper
import android.view.Gravity
import android.view.View
import android.widget.PopupMenu
import androidx.core.view.forEach
import com.google.android.material.color.MaterialColors
import com.simplemobiletools.commons.extensions.getPopupMenuTheme
import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.commons.helpers.isQPlus
import com.simplemobiletools.launcher.R
import com.simplemobiletools.launcher.activities.SettingsActivity
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_FOLDER
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_ICON
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_WIDGET
import com.simplemobiletools.launcher.helpers.UNINSTALL_APP_REQUEST_CODE
import com.simplemobiletools.launcher.interfaces.ItemMenuListener
import com.simplemobiletools.launcher.models.HomeScreenGridItem
fun Activity.launchApp(packageName: String, activityName: String) {
// if this is true, launch the app settings
if (packageName == this.packageName) {
startActivity(Intent(applicationContext, SettingsActivity::class.java))
return
}
try {
Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_LAUNCHER)
`package` = packageName
component = ComponentName.unflattenFromString("$packageName/$activityName")
addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
startActivity(this)
}
} catch (e: Exception) {
try {
val launchIntent = packageManager.getLaunchIntentForPackage(packageName)
startActivity(launchIntent)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
fun Activity.launchAppInfo(packageName: String) {
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
startActivity(this)
}
}
fun Activity.canAppBeUninstalled(packageName: String): Boolean {
return try {
(packageManager.getApplicationInfo(packageName, 0).flags and ApplicationInfo.FLAG_SYSTEM) == 0
} catch (ignored: Exception) {
false
}
}
fun Activity.uninstallApp(packageName: String) {
Intent(Intent.ACTION_DELETE).apply {
data = Uri.fromParts("package", packageName, null)
startActivityForResult(this, UNINSTALL_APP_REQUEST_CODE)
}
}
fun Activity.handleGridItemPopupMenu(anchorView: View, gridItem: HomeScreenGridItem, isOnAllAppsFragment: Boolean, listener: ItemMenuListener): PopupMenu {
val contextTheme = ContextThemeWrapper(this, getPopupMenuTheme())
return PopupMenu(contextTheme, anchorView, Gravity.TOP or Gravity.END).apply {
if (isQPlus()) {
setForceShowIcon(true)
}
inflate(R.menu.menu_app_icon)
menu.forEach {
val color = MaterialColors.getColor(contextTheme, android.R.attr.textColorPrimary, getProperTextColor())
it.iconTintList = ColorStateList.valueOf(color)
}
menu.findItem(R.id.rename).isVisible = (gridItem.type == ITEM_TYPE_ICON || gridItem.type == ITEM_TYPE_FOLDER) && !isOnAllAppsFragment
menu.findItem(R.id.hide_icon).isVisible = gridItem.type == ITEM_TYPE_ICON && isOnAllAppsFragment
menu.findItem(R.id.resize).isVisible = gridItem.type == ITEM_TYPE_WIDGET
menu.findItem(R.id.app_info).isVisible = gridItem.type == ITEM_TYPE_ICON
menu.findItem(R.id.uninstall).isVisible = gridItem.type == ITEM_TYPE_ICON && canAppBeUninstalled(gridItem.packageName)
menu.findItem(R.id.remove).isVisible = !isOnAllAppsFragment
setOnMenuItemClickListener { item ->
listener.onAnyClick()
when (item.itemId) {
R.id.hide_icon -> listener.hide(gridItem)
R.id.rename -> listener.rename(gridItem)
R.id.resize -> listener.resize(gridItem)
R.id.app_info -> listener.appInfo(gridItem)
R.id.remove -> listener.remove(gridItem)
R.id.uninstall -> listener.uninstall(gridItem)
}
true
}
setOnDismissListener {
listener.onDismiss()
}
listener.beforeShow(menu)
show()
}
}