mirror of
				https://github.com/SimpleMobileTools/Simple-Launcher.git
				synced 2025-06-05 21:59:15 +02:00 
			
		
		
		
	allow removing widgets
This commit is contained in:
		| @@ -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() | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user