allow removing widgets
This commit is contained in:
parent
f37840094b
commit
10373af40d
|
@ -317,19 +317,20 @@ class MainActivity : SimpleActivity(), FlingListener {
|
|||
|
||||
private fun handleGridItemPopupMenu(anchorView: View, gridItem: HomeScreenGridItem, isOnAllAppsFragment: Boolean): PopupMenu {
|
||||
if (gridItem.type == ITEM_TYPE_WIDGET) {
|
||||
anchorView.y += resources.getDimension(R.dimen.home_long_press_anchor_offset_y)
|
||||
anchorView.y -= resources.getDimension(R.dimen.home_long_press_anchor_offset_y)
|
||||
}
|
||||
|
||||
val contextTheme = ContextThemeWrapper(this, getPopupMenuTheme())
|
||||
return PopupMenu(contextTheme, anchorView, Gravity.TOP or Gravity.END).apply {
|
||||
inflate(R.menu.menu_app_icon)
|
||||
menu.findItem(R.id.app_info).isVisible = gridItem.type == ITEM_TYPE_ICON
|
||||
menu.findItem(R.id.uninstall).isVisible = gridItem.type == ITEM_TYPE_ICON
|
||||
menu.findItem(R.id.remove).isVisible = !isOnAllAppsFragment
|
||||
setOnMenuItemClickListener { item ->
|
||||
(all_apps_fragment as AllAppsFragment).ignoreTouches = false
|
||||
when (item.itemId) {
|
||||
R.id.app_info -> launchAppInfo(gridItem.packageName)
|
||||
R.id.remove -> home_screen_grid.removeAppIcon(gridItem.id!!)
|
||||
R.id.remove -> home_screen_grid.removeAppIcon(gridItem)
|
||||
R.id.uninstall -> uninstallApp(gridItem.packageName)
|
||||
}
|
||||
true
|
||||
|
@ -436,7 +437,7 @@ class MainActivity : SimpleActivity(), FlingListener {
|
|||
try {
|
||||
val defaultDialerPackage = (getSystemService(Context.TELECOM_SERVICE) as TelecomManager).defaultDialerPackage
|
||||
appLaunchers.firstOrNull { it.packageName == defaultDialerPackage }?.apply {
|
||||
val dialerIcon = HomeScreenGridItem(null, 0, ROW_COUNT - 1, 1, ROW_COUNT, 1, 1, defaultDialerPackage, title, ITEM_TYPE_ICON, "", null)
|
||||
val dialerIcon = HomeScreenGridItem(null, 0, ROW_COUNT - 1, 1, ROW_COUNT, 1, 1, defaultDialerPackage, title, ITEM_TYPE_ICON, "", -1, null)
|
||||
homeScreenGridItems.add(dialerIcon)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
|
@ -446,7 +447,7 @@ class MainActivity : SimpleActivity(), FlingListener {
|
|||
val defaultSMSMessengerPackage = Telephony.Sms.getDefaultSmsPackage(this)
|
||||
appLaunchers.firstOrNull { it.packageName == defaultSMSMessengerPackage }?.apply {
|
||||
val SMSMessengerIcon =
|
||||
HomeScreenGridItem(null, 1, ROW_COUNT - 1, 2, ROW_COUNT, 1, 1, defaultSMSMessengerPackage, title, ITEM_TYPE_ICON, "", null)
|
||||
HomeScreenGridItem(null, 1, ROW_COUNT - 1, 2, ROW_COUNT, 1, 1, defaultSMSMessengerPackage, title, ITEM_TYPE_ICON, "", -1, null)
|
||||
homeScreenGridItems.add(SMSMessengerIcon)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
|
@ -457,7 +458,7 @@ class MainActivity : SimpleActivity(), FlingListener {
|
|||
val resolveInfo = packageManager.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY)
|
||||
val defaultBrowserPackage = resolveInfo!!.activityInfo.packageName
|
||||
appLaunchers.firstOrNull { it.packageName == defaultBrowserPackage }?.apply {
|
||||
val browserIcon = HomeScreenGridItem(null, 2, ROW_COUNT - 1, 3, ROW_COUNT, 1, 1, defaultBrowserPackage, title, ITEM_TYPE_ICON, "", null)
|
||||
val browserIcon = HomeScreenGridItem(null, 2, ROW_COUNT - 1, 3, ROW_COUNT, 1, 1, defaultBrowserPackage, title, ITEM_TYPE_ICON, "", -1, null)
|
||||
homeScreenGridItems.add(browserIcon)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
|
@ -468,7 +469,7 @@ class MainActivity : SimpleActivity(), FlingListener {
|
|||
val storePackage = potentialStores.firstOrNull { isPackageInstalled(it) && appLaunchers.map { it.packageName }.contains(it) }
|
||||
if (storePackage != null) {
|
||||
appLaunchers.firstOrNull { it.packageName == storePackage }?.apply {
|
||||
val storeIcon = HomeScreenGridItem(null, 3, ROW_COUNT - 1, 4, ROW_COUNT, 1, 1, storePackage, title, ITEM_TYPE_ICON, "", null)
|
||||
val storeIcon = HomeScreenGridItem(null, 3, ROW_COUNT - 1, 4, ROW_COUNT, 1, 1, storePackage, title, ITEM_TYPE_ICON, "", -1, null)
|
||||
homeScreenGridItems.add(storeIcon)
|
||||
}
|
||||
}
|
||||
|
@ -480,7 +481,7 @@ class MainActivity : SimpleActivity(), FlingListener {
|
|||
val resolveInfo = packageManager.resolveActivity(cameraIntent, PackageManager.MATCH_DEFAULT_ONLY)
|
||||
val defaultCameraPackage = resolveInfo!!.activityInfo.packageName
|
||||
appLaunchers.firstOrNull { it.packageName == defaultCameraPackage }?.apply {
|
||||
val cameraIcon = HomeScreenGridItem(null, 4, ROW_COUNT - 1, 5, ROW_COUNT, 1, 1, defaultCameraPackage, title, ITEM_TYPE_ICON, "", null)
|
||||
val cameraIcon = HomeScreenGridItem(null, 4, ROW_COUNT - 1, 5, ROW_COUNT, 1, 1, defaultCameraPackage, title, ITEM_TYPE_ICON, "", -1, null)
|
||||
homeScreenGridItems.add(cameraIcon)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
|
|
|
@ -136,7 +136,7 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
}
|
||||
|
||||
override fun onAppLauncherLongPressed(x: Float, y: Float, appLauncher: AppLauncher) {
|
||||
val gridItem = HomeScreenGridItem(null, -1, -1, -1, -1, 1, 1, appLauncher.packageName, appLauncher.title, ITEM_TYPE_ICON, "", appLauncher.drawable)
|
||||
val gridItem = HomeScreenGridItem(null, -1, -1, -1, -1, 1, 1, appLauncher.packageName, appLauncher.title, ITEM_TYPE_ICON, "", -1, appLauncher.drawable)
|
||||
activity?.showHomeIconMenu(x, y, gridItem, true)
|
||||
ignoreTouches = true
|
||||
}
|
||||
|
|
|
@ -240,6 +240,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
"",
|
||||
type,
|
||||
appWidget.shortClassName,
|
||||
-1,
|
||||
appWidget.widgetPreviewImage
|
||||
)
|
||||
|
||||
|
|
|
@ -18,8 +18,9 @@ data class HomeScreenGridItem(
|
|||
@ColumnInfo(name = "title") var title: String,
|
||||
@ColumnInfo(name = "type") var type: Int,
|
||||
@ColumnInfo(name = "short_class_name") var shortClassName: String,
|
||||
@ColumnInfo(name = "widget_id") var widgetId: Int,
|
||||
|
||||
@Ignore var drawable: Drawable?
|
||||
) {
|
||||
constructor() : this(null, -1, -1, -1, -1, 1, 1, "", "", ITEM_TYPE_ICON, "", null)
|
||||
constructor() : this(null, -1, -1, -1, -1, 1, 1, "", "", ITEM_TYPE_ICON, "", -1, null)
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
|||
private var gridItems = ArrayList<HomeScreenGridItem>()
|
||||
private var gridCenters = ArrayList<Pair<Int, Int>>()
|
||||
private var draggedItemCurrentCoords = Pair(-1, -1)
|
||||
private var widgetViews = ArrayList<MyAppWidgetHostView>()
|
||||
|
||||
val appWidgetHost = MyAppWidgetHost(context, WIDGET_HOST_ID)
|
||||
private val appWidgetManager = AppWidgetManager.getInstance(context)
|
||||
|
@ -88,10 +89,18 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
|||
}
|
||||
}
|
||||
|
||||
fun removeAppIcon(iconId: Long) {
|
||||
fun removeAppIcon(item: HomeScreenGridItem) {
|
||||
ensureBackgroundThread {
|
||||
context.homeScreenGridItemsDB.deleteById(iconId)
|
||||
gridItems.removeIf { it.id == iconId }
|
||||
context.homeScreenGridItemsDB.deleteById(item.id!!)
|
||||
if (item.type == ITEM_TYPE_WIDGET) {
|
||||
appWidgetHost.deleteAppWidgetId(item.widgetId)
|
||||
|
||||
post {
|
||||
removeView(widgetViews.firstOrNull { it.tag == item.widgetId })
|
||||
}
|
||||
}
|
||||
|
||||
gridItems.removeIf { it.id == item.id }
|
||||
redrawGrid()
|
||||
}
|
||||
}
|
||||
|
@ -188,6 +197,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
|||
draggedItem!!.title,
|
||||
draggedItem!!.type,
|
||||
"",
|
||||
-1,
|
||||
draggedItem!!.drawable
|
||||
)
|
||||
|
||||
|
@ -297,15 +307,21 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
|||
}
|
||||
|
||||
private fun placeAppWidget(appWidgetId: Int, appWidgetProviderInfo: AppWidgetProviderInfo, item: HomeScreenGridItem) {
|
||||
item.widgetId = appWidgetId
|
||||
// we have to pass the base context here, else there will be errors with the themes
|
||||
val widgetView = appWidgetHost.createView((context as MainActivity).baseContext, appWidgetId, appWidgetProviderInfo) as MyAppWidgetHostView
|
||||
widgetView.tag = appWidgetId
|
||||
widgetView.setAppWidget(appWidgetId, appWidgetProviderInfo)
|
||||
widgetView.longPressListener = { x, y ->
|
||||
(context as? MainActivity)?.showHomeIconMenu(x, y, item, false)
|
||||
}
|
||||
|
||||
widgetView.x = item.left * rowWidth + sideMargins.left.toFloat()
|
||||
widgetView.y = item.top * rowHeight + sideMargins.top.toFloat()
|
||||
val widgetWidth = item.widthCells * rowWidth
|
||||
val widgetHeight = item.heightCells * rowHeight
|
||||
addView(widgetView, widgetWidth, widgetHeight)
|
||||
widgetViews.add(widgetView)
|
||||
}
|
||||
|
||||
// convert stuff like 102x192 to grid cells like 0x1
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simplemobiletools.launcher.views
|
|||
|
||||
import android.appwidget.AppWidgetHostView
|
||||
import android.content.Context
|
||||
import android.graphics.PointF
|
||||
import android.os.Handler
|
||||
import android.view.MotionEvent
|
||||
import android.view.ViewConfiguration
|
||||
|
@ -10,6 +11,8 @@ import com.simplemobiletools.commons.extensions.performHapticFeedback
|
|||
class MyAppWidgetHostView(context: Context) : AppWidgetHostView(context) {
|
||||
private var longPressHandler = Handler()
|
||||
private var hasLongPressed = false
|
||||
private var actionDownCoords = PointF()
|
||||
var longPressListener: ((x: Float, y: Float) -> Unit)? = null
|
||||
|
||||
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
|
||||
if (hasLongPressed) {
|
||||
|
@ -18,7 +21,11 @@ class MyAppWidgetHostView(context: Context) : AppWidgetHostView(context) {
|
|||
}
|
||||
|
||||
when (event.actionMasked) {
|
||||
MotionEvent.ACTION_DOWN -> longPressHandler.postDelayed(longPressRunnable, ViewConfiguration.getLongPressTimeout().toLong())
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
longPressHandler.postDelayed(longPressRunnable, ViewConfiguration.getLongPressTimeout().toLong())
|
||||
actionDownCoords.x = event.rawX
|
||||
actionDownCoords.y = event.rawY
|
||||
}
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> longPressHandler.removeCallbacksAndMessages(null)
|
||||
}
|
||||
|
||||
|
@ -28,6 +35,7 @@ class MyAppWidgetHostView(context: Context) : AppWidgetHostView(context) {
|
|||
private val longPressRunnable = Runnable {
|
||||
longPressHandler.removeCallbacksAndMessages(null)
|
||||
hasLongPressed = true
|
||||
longPressListener?.invoke(actionDownCoords.x, actionDownCoords.y)
|
||||
performHapticFeedback()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue