diff --git a/res/drawable/gm_edit_24.xml b/res/drawable/gm_edit_24.xml new file mode 100644 index 0000000000..59a0dc2faf --- /dev/null +++ b/res/drawable/gm_edit_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/res/drawable/widget_reconfigure_button_frame.xml b/res/drawable/widget_reconfigure_button_frame.xml new file mode 100644 index 0000000000..37d93ade95 --- /dev/null +++ b/res/drawable/widget_reconfigure_button_frame.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/res/layout/app_widget_resize_frame.xml b/res/layout/app_widget_resize_frame.xml index 671dbc63c0..53db5edd8a 100644 --- a/res/layout/app_widget_resize_frame.xml +++ b/res/layout/app_widget_resize_frame.xml @@ -73,5 +73,17 @@ android:src="@drawable/ic_widget_resize_handle" android:tint="?android:attr/colorAccent" /> + + \ No newline at end of file diff --git a/res/values/dimens.xml b/res/values/dimens.xml index cf830c7ed4..c051d6d4e6 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -56,6 +56,12 @@ 24dp 22dp + + 14dp + 6dp + 32dp + 36dp + 6dp 8dp diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index ab9178556e..5d41bb5c3e 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -22,6 +22,7 @@ import android.util.SizeF; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.widget.ImageButton; import android.widget.ImageView; import androidx.annotation.Nullable; @@ -74,6 +75,7 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O private LauncherAppWidgetHostView mWidgetView; private CellLayout mCellLayout; private DragLayer mDragLayer; + private ImageButton mReconfigureButton; private Rect mWidgetPadding; @@ -211,6 +213,17 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O mDragHandles[INDEX_RIGHT].setVisibility(GONE); } + mReconfigureButton = (ImageButton) findViewById(R.id.widget_reconfigure_button); + if (info.isReconfigurable()) { + mReconfigureButton.setVisibility(VISIBLE); + mReconfigureButton.setOnClickListener(view -> mLauncher + .getAppWidgetHost() + .startConfigActivity( + mLauncher, + mWidgetView.getAppWidgetId(), + Launcher.REQUEST_RECONFIGURE_APPWIDGET)); + } + // When we create the resize frame, we first mark all cells as unoccupied. The appropriate // cells (same if not resized, or different) will be marked as occupied when the resize // frame is dismissed. @@ -582,6 +595,13 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O return false; } + private boolean isTouchOnReconfigureButton(MotionEvent ev) { + int xFrame = (int) ev.getX() - getLeft(); + int yFrame = (int) ev.getY() - getTop(); + mReconfigureButton.getHitRect(sTmpRect); + return sTmpRect.contains(xFrame, yFrame); + } + @Override public boolean onControllerTouchEvent(MotionEvent ev) { int action = ev.getAction(); @@ -609,6 +629,11 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O if (ev.getAction() == MotionEvent.ACTION_DOWN && handleTouchDown(ev)) { return true; } + // Keep the resize frame open but let a click on the reconfigure button fall through to the + // button's OnClickListener. + if (isTouchOnReconfigureButton(ev)) { + return false; + } close(false); return false; } diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java index 8689fbfd3c..ad61495de8 100644 --- a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java +++ b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java @@ -139,6 +139,10 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo } } + public boolean isReconfigurable() { + return configure != null && (getWidgetFeatures() & WIDGET_FEATURE_RECONFIGURABLE) != 0; + } + @Override public final ComponentName getComponent() { return provider;