adding some initial widget long press handling

This commit is contained in:
tibbi 2022-09-26 09:50:04 +02:00
parent 03b8ee01f4
commit 7f777cf557
7 changed files with 71 additions and 12 deletions

View file

@ -8,6 +8,10 @@
android:name="android.permission.QUERY_ALL_PACKAGES" android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" /> tools:ignore="QueryAllPackagesPermission" />
<uses-permission
android:name="android.permission.BIND_APPWIDGET"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

View file

@ -151,6 +151,7 @@ class MainActivity : SimpleActivity(), FlingListener {
mTouchDownY = -1 mTouchDownY = -1
mIgnoreMoveEvents = false mIgnoreMoveEvents = false
mLongPressedIcon = null mLongPressedIcon = null
(widgets_fragment as WidgetsFragment).ignoreTouches = false
(all_apps_fragment as AllAppsFragment).ignoreTouches = false (all_apps_fragment as AllAppsFragment).ignoreTouches = false
home_screen_grid.itemDraggingStopped(event.x.toInt(), event.y.toInt()) home_screen_grid.itemDraggingStopped(event.x.toInt(), event.y.toInt())
if (!mIgnoreUpEvent) { if (!mIgnoreUpEvent) {
@ -252,6 +253,12 @@ class MainActivity : SimpleActivity(), FlingListener {
mOpenPopupMenu = handleGridItemPopupMenu(home_screen_popup_menu_anchor, gridItem, isOnAllAppsFragment) mOpenPopupMenu = handleGridItemPopupMenu(home_screen_popup_menu_anchor, gridItem, isOnAllAppsFragment)
} }
fun widgetLongPressedOnList(gridItem: HomeScreenGridItem) {
mLongPressedIcon = gridItem
hideFragment(widgets_fragment)
home_screen_grid.itemDraggingStarted(mLongPressedIcon!!)
}
private fun showMainLongPressMenu(x: Float, y: Float) { private fun showMainLongPressMenu(x: Float, y: Float) {
home_screen_popup_menu_anchor.x = x home_screen_popup_menu_anchor.x = x
home_screen_popup_menu_anchor.y = y - resources.getDimension(R.dimen.home_long_press_anchor_offset_y) home_screen_popup_menu_anchor.y = y - resources.getDimension(R.dimen.home_long_press_anchor_offset_y)

View file

@ -9,10 +9,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory import com.bumptech.glide.request.transition.DrawableCrossFadeFactory
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.extensions.portrait
import com.simplemobiletools.commons.extensions.realScreenSize
import com.simplemobiletools.launcher.R import com.simplemobiletools.launcher.R
import com.simplemobiletools.launcher.activities.SimpleActivity import com.simplemobiletools.launcher.activities.SimpleActivity
import com.simplemobiletools.launcher.interfaces.AllAppsListener import com.simplemobiletools.launcher.interfaces.AllAppsListener

View file

@ -12,6 +12,7 @@ import com.simplemobiletools.launcher.R
import com.simplemobiletools.launcher.activities.SimpleActivity import com.simplemobiletools.launcher.activities.SimpleActivity
import com.simplemobiletools.launcher.helpers.WIDGET_LIST_ITEMS_HOLDER import com.simplemobiletools.launcher.helpers.WIDGET_LIST_ITEMS_HOLDER
import com.simplemobiletools.launcher.helpers.WIDGET_LIST_SECTION import com.simplemobiletools.launcher.helpers.WIDGET_LIST_SECTION
import com.simplemobiletools.launcher.interfaces.WidgetsFragmentListener
import com.simplemobiletools.launcher.models.WidgetsListItem import com.simplemobiletools.launcher.models.WidgetsListItem
import com.simplemobiletools.launcher.models.WidgetsListItemsHolder import com.simplemobiletools.launcher.models.WidgetsListItemsHolder
import com.simplemobiletools.launcher.models.WidgetsListSection import com.simplemobiletools.launcher.models.WidgetsListSection
@ -21,7 +22,8 @@ import kotlinx.android.synthetic.main.item_widget_preview.view.*
class WidgetsAdapter( class WidgetsAdapter(
val activity: SimpleActivity, val activity: SimpleActivity,
val widgetListItems: ArrayList<WidgetsListItem> val widgetListItems: ArrayList<WidgetsListItem>,
val widgetsFragmentListener: WidgetsFragmentListener
) : RecyclerView.Adapter<WidgetsAdapter.ViewHolder>() { ) : RecyclerView.Adapter<WidgetsAdapter.ViewHolder>() {
private var textColor = activity.getProperTextColor() private var textColor = activity.getProperTextColor()
@ -104,6 +106,11 @@ class WidgetsAdapter(
widgetPreview.setOnClickListener { widgetPreview.setOnClickListener {
activity.toast(R.string.touch_hold_widget) activity.toast(R.string.touch_hold_widget)
} }
widgetPreview.setOnLongClickListener { view ->
widgetsFragmentListener.onWidgetLongPressed(widget)
true
}
} }
} }

View file

@ -1,5 +1,6 @@
package com.simplemobiletools.launcher.fragments package com.simplemobiletools.launcher.fragments
import android.annotation.SuppressLint
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -7,6 +8,7 @@ import android.content.pm.LauncherApps
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Process import android.os.Process
import android.util.AttributeSet import android.util.AttributeSet
import android.view.MotionEvent
import android.view.Surface import android.view.Surface
import android.view.WindowManager import android.view.WindowManager
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
@ -14,13 +16,15 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isRPlus import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.launcher.activities.MainActivity import com.simplemobiletools.launcher.activities.MainActivity
import com.simplemobiletools.launcher.adapters.WidgetsAdapter import com.simplemobiletools.launcher.adapters.WidgetsAdapter
import com.simplemobiletools.launcher.models.AppWidget import com.simplemobiletools.launcher.interfaces.WidgetsFragmentListener
import com.simplemobiletools.launcher.models.WidgetsListItem import com.simplemobiletools.launcher.models.*
import com.simplemobiletools.launcher.models.WidgetsListItemsHolder
import com.simplemobiletools.launcher.models.WidgetsListSection
import kotlinx.android.synthetic.main.widgets_fragment.view.* import kotlinx.android.synthetic.main.widgets_fragment.view.*
class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment(context, attributeSet) { class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment(context, attributeSet), WidgetsFragmentListener {
private var touchDownY = -1
private var lastTouchCoords = Pair(0f, 0f)
var ignoreTouches = false
override fun setupFragment(activity: MainActivity) { override fun setupFragment(activity: MainActivity) {
this.activity = activity this.activity = activity
background.applyColorFilter(activity.getProperBackgroundColor()) background.applyColorFilter(activity.getProperBackgroundColor())
@ -36,6 +40,33 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
setupAdapter(appWidgets) setupAdapter(appWidgets)
} }
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
if (ignoreTouches) {
// some devices ACTION_MOVE keeps triggering for the whole long press duration, but we are interested in real moves only, when coords change
if (lastTouchCoords.first != event.x || lastTouchCoords.second != event.y) {
touchDownY = -1
return true
}
}
lastTouchCoords = Pair(event.x, event.y)
var shouldIntercept = false
// pull the whole fragment down if it is scrolled way to the top and the users pulls it even further
if (touchDownY != -1) {
shouldIntercept = touchDownY - event.y.toInt() < 0 && widgets_list.computeVerticalScrollOffset() == 0
if (shouldIntercept) {
activity?.startHandlingTouches(touchDownY)
touchDownY = -1
}
} else {
touchDownY = event.y.toInt()
}
return shouldIntercept
}
@SuppressLint("WrongConstant")
fun getAppWidgets() { fun getAppWidgets() {
ensureBackgroundThread { ensureBackgroundThread {
// get the casual widgets // get the casual widgets
@ -108,7 +139,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
private fun setupAdapter(widgetsListItems: ArrayList<WidgetsListItem>) { private fun setupAdapter(widgetsListItems: ArrayList<WidgetsListItem>) {
activity?.runOnUiThread { activity?.runOnUiThread {
WidgetsAdapter(activity!!, widgetsListItems).apply { WidgetsAdapter(activity!!, widgetsListItems, this).apply {
widgets_list.adapter = this widgets_list.adapter = this
} }
} }
@ -171,4 +202,10 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
return null return null
} }
override fun onWidgetLongPressed(appWidget: AppWidget) {
val gridItem = HomeScreenGridItem(null, -1, -1, -1, 1, appWidget.appPackageName, "", appWidget.widgetPreviewImage)
activity?.widgetLongPressedOnList(gridItem)
ignoreTouches = true
}
} }

View file

@ -0,0 +1,7 @@
package com.simplemobiletools.launcher.interfaces
import com.simplemobiletools.launcher.models.AppWidget
interface WidgetsFragmentListener {
fun onWidgetLongPressed(appWidget: AppWidget)
}

View file

@ -210,7 +210,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Vie
val drawableY = rowYCoords[item.top] + iconSize / 2 + sideMargins.top val drawableY = rowYCoords[item.top] + iconSize / 2 + sideMargins.top
item.drawable!!.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize) item.drawable!!.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize)
if (item.id != draggedItem?.id) { if (item.id != draggedItem?.id && item.title.isNotEmpty()) {
val textX = rowXCoords[item.left].toFloat() + labelSideMargin + sideMargins.left val textX = rowXCoords[item.left].toFloat() + labelSideMargin + sideMargins.left
val textY = rowYCoords[item.top] + iconSize * 1.5f + labelSideMargin + sideMargins.top val textY = rowYCoords[item.top] + iconSize * 1.5f + labelSideMargin + sideMargins.top
val staticLayout = StaticLayout.Builder val staticLayout = StaticLayout.Builder