Removing ENABLE_CACHED_WIDGET since we now have always listenign widget
> Also using PendingWidgetView for deferred widget view
Bug: 270395008
Flag: LEGACY ENABLE_CACHED_WIDGET enabled
Test: Exising widgets tests pass.
Verified UI by forcefully rendering deferred widget
Change-Id: Id34f89d778f9f993c1b7ad13f66e57fda9843417
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 11dc6e2..e0e35a4 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1715,11 +1715,7 @@
mModel.removeCallbacks(this);
mRotationHelper.destroy();
- try {
- mAppWidgetHolder.stopListening();
- } catch (NullPointerException ex) {
- Log.w(TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex);
- }
+ mAppWidgetHolder.stopListening();
mAppWidgetHolder.destroy();
TextKeyListener.getInstance().release();
@@ -2478,7 +2474,7 @@
*/
private LauncherAppWidgetInfo completeRestoreAppWidget(int appWidgetId, int finalRestoreFlag) {
LauncherAppWidgetHostView view = mWorkspace.getWidgetForAppWidgetId(appWidgetId);
- if ((view == null) || !(view instanceof PendingAppWidgetHostView)) {
+ if (!(view instanceof PendingAppWidgetHostView)) {
Log.e(TAG, "Widget update called, when the widget no longer exists.");
return null;
}
@@ -2489,8 +2485,9 @@
info.pendingItemInfo = null;
}
- if (((PendingAppWidgetHostView) view).isReinflateIfNeeded()) {
- view.reInflate();
+ PendingAppWidgetHostView pv = (PendingAppWidgetHostView) view;
+ if (pv.isReinflateIfNeeded()) {
+ pv.reInflate();
}
getModelWriter().updateItemInDatabase(info);
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index 9a19526..5ae2d71 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -36,11 +36,7 @@
import android.content.pm.LauncherApps;
import android.os.UserHandle;
import android.util.Log;
-import android.util.SparseArray;
-import android.widget.RemoteViews;
-import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.launcher3.graphics.IconShape;
@@ -77,12 +73,6 @@
private final InvariantDeviceProfile mInvariantDeviceProfile;
private final RunnableList mOnTerminateCallback = new RunnableList();
- // WORKAROUND: b/269335387 remove this after widget background listener is enabled
- /* Array of RemoteViews cached by Launcher process */
- @GuardedBy("itself")
- @NonNull
- public final SparseArray<RemoteViews> mCachedRemoteViews = new SparseArray<>();
-
public static LauncherAppState getInstance(final Context context) {
return INSTANCE.get(context);
}
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index f9d282c..8d54abf 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -387,10 +387,6 @@
"ENABLE_NEW_MIGRATION_LOGIC", ENABLED,
"Enable the new grid migration logic, keeping pages when src < dest");
- public static final BooleanFlag ENABLE_CACHED_WIDGET = getDebugFlag(270395008,
- "ENABLE_CACHED_WIDGET", ENABLED,
- "Show previously cached widgets as opposed to deferred widget where available");
-
// TODO(Block 25): Clean up flags
public static final BooleanFlag ENABLE_NEW_GESTURE_NAV_TUTORIAL = getDebugFlag(270396257,
"ENABLE_NEW_GESTURE_NAV_TUTORIAL", ENABLED,
diff --git a/src/com/android/launcher3/widget/DeferredAppWidgetHostView.java b/src/com/android/launcher3/widget/DeferredAppWidgetHostView.java
deleted file mode 100644
index f42142e..0000000
--- a/src/com/android/launcher3/widget/DeferredAppWidgetHostView.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3.widget;
-
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.text.Layout;
-import android.text.StaticLayout;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.RemoteViews;
-
-import com.android.launcher3.R;
-
-/**
- * A widget host views created while the host has not bind to the system service.
- */
-public class DeferredAppWidgetHostView extends LauncherAppWidgetHostView {
-
- private final TextPaint mPaint;
- private Layout mSetupTextLayout;
-
- public DeferredAppWidgetHostView(Context context) {
- super(context);
- setWillNotDraw(false);
-
- mPaint = new TextPaint();
- mPaint.setColor(Color.WHITE);
- mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,
- mLauncher.getDeviceProfile().iconTextSizePx,
- getResources().getDisplayMetrics()));
- setBackgroundResource(R.drawable.bg_deferred_app_widget);
- }
-
- @Override
- public void updateAppWidget(RemoteViews remoteViews) {
- // Not allowed
- }
-
- @Override
- public void addView(View child) {
- // Not allowed
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- AppWidgetProviderInfo info = getAppWidgetInfo();
- if (info == null || TextUtils.isEmpty(info.label)) {
- return;
- }
-
- // Use double padding so that there is extra space between background and text if possible.
- int availableWidth = getMeasuredWidth() - 2 * (getPaddingLeft() + getPaddingRight());
- if (availableWidth <= 0) {
- availableWidth = getMeasuredWidth() - (getPaddingLeft() + getPaddingRight());
- }
- if (mSetupTextLayout != null && mSetupTextLayout.getText().equals(info.label)
- && mSetupTextLayout.getWidth() == availableWidth) {
- return;
- }
- mSetupTextLayout = new StaticLayout(info.label, mPaint, availableWidth,
- Layout.Alignment.ALIGN_CENTER, 1, 0, true);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- if (mSetupTextLayout != null) {
- canvas.translate((getWidth() - mSetupTextLayout.getWidth()) / 2,
- (getHeight() - mSetupTextLayout.getHeight()) / 2);
- mSetupTextLayout.draw(canvas);
- }
- }
-}
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
index 9c21ea2..739e204 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
@@ -89,7 +89,7 @@
@NonNull
public LauncherAppWidgetHostView onCreateView(Context context, int appWidgetId,
AppWidgetProviderInfo appWidget) {
- return mHolder.onCreateView(context, appWidgetId, appWidget);
+ return mHolder.onCreateView(context, appWidgetId);
}
/**
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
index 12b47e6..e0de269 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
@@ -45,7 +45,6 @@
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
@@ -96,8 +95,6 @@
private boolean mTrackingWidgetUpdate = false;
- private boolean mIsWidgetCachingDisabled = false;
-
public LauncherAppWidgetHostView(Context context) {
super(context);
mLauncher = Launcher.getLauncher(context);
@@ -144,10 +141,6 @@
}
}
- public void setIsWidgetCachingDisabled(boolean isWidgetCachingDisabled) {
- mIsWidgetCachingDisabled = isWidgetCachingDisabled;
- }
-
@Override
@TargetApi(Build.VERSION_CODES.Q)
public void updateAppWidget(RemoteViews remoteViews) {
@@ -157,19 +150,11 @@
TRACE_METHOD_NAME + getAppWidgetInfo().provider, getAppWidgetId());
mTrackingWidgetUpdate = false;
}
- if (FeatureFlags.ENABLE_CACHED_WIDGET.get()
- && !mIsWidgetCachingDisabled) {
+ if (isDeferringUpdates()) {
mLastRemoteViews = remoteViews;
- if (isDeferringUpdates()) {
- return;
- }
- } else {
- if (isDeferringUpdates()) {
- mLastRemoteViews = remoteViews;
- return;
- }
- mLastRemoteViews = null;
+ return;
}
+ mLastRemoteViews = null;
super.updateAppWidget(remoteViews);
@@ -438,22 +423,6 @@
scheduleNextAdvance();
}
- public void reInflate() {
- if (!isAttachedToWindow()) {
- return;
- }
- LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag();
- if (info == null) {
- // This occurs when LauncherAppWidgetHostView is used to render a preview layout.
- return;
- }
- // Remove and rebind the current widget (which was inflated in the wrong
- // orientation), but don't delete it from the database
- mLauncher.removeItem(this, info, false /* deleteFromDb */,
- "widget removed because of configuration change");
- mLauncher.bindAppWidget(info);
- }
-
@Override
protected boolean shouldAllowDirectClick() {
if (getTag() instanceof ItemInfo) {
diff --git a/src/com/android/launcher3/widget/LauncherWidgetHolder.java b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
index 6acc83d..fbd48cf 100644
--- a/src/com/android/launcher3/widget/LauncherWidgetHolder.java
+++ b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
@@ -28,7 +28,6 @@
import android.content.Intent;
import android.os.Bundle;
import android.util.SparseArray;
-import android.widget.RemoteViews;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -36,10 +35,8 @@
import com.android.launcher3.BaseActivity;
import com.android.launcher3.BaseDraggingActivity;
-import com.android.launcher3.LauncherAppState;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.testing.TestLogging;
@@ -70,11 +67,9 @@
private final AppWidgetHost mWidgetHost;
@NonNull
- private final SparseArray<LauncherAppWidgetHostView> mViews = new SparseArray<>();
+ protected final SparseArray<LauncherAppWidgetHostView> mViews = new SparseArray<>();
@NonNull
private final SparseArray<PendingAppWidgetHostView> mPendingViews = new SparseArray<>();
- @NonNull
- private final SparseArray<LauncherAppWidgetHostView> mDeferredViews = new SparseArray<>();
protected int mFlags = FLAG_STATE_IS_NORMAL;
@@ -121,25 +116,12 @@
* Update any views which have been deferred because the host was not listening.
*/
protected void updateDeferredView() {
+ // Update any views which have been deferred because the host was not listening.
// We go in reverse order and inflate any deferred or cached widget
for (int i = mViews.size() - 1; i >= 0; i--) {
LauncherAppWidgetHostView view = mViews.valueAt(i);
- if (view instanceof DeferredAppWidgetHostView) {
- view.reInflate();
- }
- if (FeatureFlags.ENABLE_CACHED_WIDGET.get()) {
- final int appWidgetId = mViews.keyAt(i);
- if (view == mDeferredViews.get(appWidgetId)) {
- // If the widget view was deferred, we'll need to call super.createView here
- // to make the binder call to system process to fetch cumulative updates to this
- // widget, as well as setting up this view for future updates.
- mWidgetHost.createView(view.mLauncher, appWidgetId,
- view.getAppWidgetInfo());
- // At this point #onCreateView should have been called, which in turn returned
- // the deferred view. There's no reason to keep the reference anymore, so we
- // removed it here.
- mDeferredViews.remove(appWidgetId);
- }
+ if (view instanceof PendingAppWidgetHostView pv) {
+ pv.reInflate();
}
}
}
@@ -173,12 +155,6 @@
public void deleteAppWidgetId(int appWidgetId) {
mWidgetHost.deleteAppWidgetId(appWidgetId);
mViews.remove(appWidgetId);
- if (FeatureFlags.ENABLE_CACHED_WIDGET.get()) {
- final LauncherAppState state = LauncherAppState.getInstance(mContext);
- synchronized (state.mCachedRemoteViews) {
- state.mCachedRemoteViews.delete(appWidgetId);
- }
- }
}
/**
@@ -319,17 +295,6 @@
if (WidgetsModel.GO_DISABLE_WIDGETS) {
return;
}
- if (FeatureFlags.ENABLE_CACHED_WIDGET.get()) {
- // Cache the content from the widgets when Launcher stops listening to widget updates
- final LauncherAppState state = LauncherAppState.getInstance(mContext);
- synchronized (state.mCachedRemoteViews) {
- for (int i = 0; i < mViews.size(); i++) {
- final int appWidgetId = mViews.keyAt(i);
- final LauncherAppWidgetHostView view = mViews.get(appWidgetId);
- state.mCachedRemoteViews.put(appWidgetId, view.mLastRemoteViews);
- }
- }
- }
mWidgetHost.stopListening();
setListeningFlag(false);
}
@@ -360,6 +325,7 @@
@NonNull
public AppWidgetHostView createView(@NonNull Context context, int appWidgetId,
@NonNull LauncherAppWidgetProviderInfo appWidget) {
+
if (appWidget.isCustomWidget()) {
LauncherAppWidgetHostView lahv = new LauncherAppWidgetHostView(context);
lahv.setAppWidget(0, appWidget);
@@ -369,24 +335,8 @@
// Since the launcher hasn't started listening to widget updates, we can't simply call
// super.createView here because the later will make a binder call to retrieve
// RemoteViews from system process.
- // TODO: have launcher always listens to widget updates in background so that this
- // check can be removed altogether.
- if (FeatureFlags.ENABLE_CACHED_WIDGET.get()) {
- final RemoteViews cachedRemoteViews = getCachedRemoteViews(appWidgetId);
- if (cachedRemoteViews != null) {
- // We've found RemoteViews from cache for this widget, so we will instantiate a
- // widget host view and populate it with the cached RemoteViews.
- final LauncherAppWidgetHostView view = new LauncherAppWidgetHostView(context);
- view.setAppWidget(appWidgetId, appWidget);
- view.updateAppWidget(cachedRemoteViews);
- mDeferredViews.put(appWidgetId, view);
- mViews.put(appWidgetId, view);
- return view;
- }
- }
- // If cache misses or not enabled, a placeholder for the widget will be returned.
- DeferredAppWidgetHostView view = new DeferredAppWidgetHostView(context);
- view.setAppWidget(appWidgetId, appWidget);
+ LauncherAppWidgetHostView view =
+ new PendingAppWidgetHostView(context, appWidgetId, appWidget);
mViews.put(appWidgetId, view);
return view;
} else {
@@ -402,7 +352,7 @@
// will update.
LauncherAppWidgetHostView view = mViews.get(appWidgetId);
if (view == null) {
- view = onCreateView(mContext, appWidgetId, appWidget);
+ view = onCreateView(mContext, appWidgetId);
}
view.setAppWidget(appWidgetId, appWidget);
view.switchToErrorView();
@@ -423,23 +373,17 @@
/**
* Called to return a proper view when creating a view
- * @param context The context for which the widget view is created
+ *
+ * @param context The context for which the widget view is created
* @param appWidgetId The ID of the added widget
- * @param appWidget The provider info of the added widget
* @return A view for the specified app widget
*/
@NonNull
- public LauncherAppWidgetHostView onCreateView(Context context, int appWidgetId,
- AppWidgetProviderInfo appWidget) {
+ public LauncherAppWidgetHostView onCreateView(Context context, int appWidgetId) {
final LauncherAppWidgetHostView view;
if (getPendingView(appWidgetId) != null) {
view = getPendingView(appWidgetId);
removePendingView(appWidgetId);
- } else if (mDeferredViews.get(appWidgetId) != null) {
- // In case the widget view is deferred, we will simply return the deferred view as
- // opposed to instantiate a new instance of LauncherAppWidgetHostView since launcher
- // already added the former to the workspace.
- view = mDeferredViews.get(appWidgetId);
} else {
view = new LauncherAppWidgetHostView(context);
}
@@ -453,10 +397,6 @@
public void clearViews() {
LauncherAppWidgetHost tempHost = (LauncherAppWidgetHost) mWidgetHost;
tempHost.clearViews();
- if (FeatureFlags.ENABLE_CACHED_WIDGET.get()) {
- // Clear previously cached content from existing widgets
- mDeferredViews.clear();
- }
mViews.clear();
}
@@ -496,14 +436,6 @@
return (flags & FLAGS_SHOULD_LISTEN) == FLAGS_SHOULD_LISTEN;
}
- @Nullable
- private RemoteViews getCachedRemoteViews(int appWidgetId) {
- final LauncherAppState state = LauncherAppState.getInstance(mContext);
- synchronized (state.mCachedRemoteViews) {
- return state.mCachedRemoteViews.get(appWidgetId);
- }
- }
-
/**
* Returns the new LauncherWidgetHolder instance
*/
diff --git a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
index 1c88c4a..2bd4c7e 100644
--- a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
@@ -24,11 +24,13 @@
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
+import android.text.TextUtils;
import android.util.SizeF;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
@@ -46,7 +48,6 @@
import com.android.launcher3.model.data.ItemInfoWithIcon;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.model.data.PackageItemInfo;
-import com.android.launcher3.touch.ItemClickHandler;
import com.android.launcher3.util.Themes;
import java.util.List;
@@ -56,11 +57,20 @@
private static final float SETUP_ICON_SIZE_FACTOR = 2f / 5;
private static final float MIN_SATUNATION = 0.7f;
+ private static final int FLAG_DRAW_SETTINGS = 1;
+ private static final int FLAG_DRAW_ICON = 2;
+ private static final int FLAG_DRAW_LABEL = 4;
+
+ private static final int DEFERRED_ALPHA = 0x77;
+
private final Rect mRect = new Rect();
private OnClickListener mClickListener;
private final LauncherAppWidgetInfo mInfo;
private final int mStartState;
private final boolean mDisabledForSafeMode;
+ private final CharSequence mLabel;
+
+ private int mDragFlags;
private Drawable mCenterDrawable;
private Drawable mSettingIconDrawable;
@@ -72,18 +82,8 @@
public PendingAppWidgetHostView(Context context, LauncherAppWidgetInfo info,
IconCache cache, boolean disabledForSafeMode) {
- super(new ContextThemeWrapper(context, R.style.WidgetContainerTheme));
-
- mInfo = info;
- mStartState = info.restoreStatus;
- mDisabledForSafeMode = disabledForSafeMode;
-
- mPaint = new TextPaint();
- mPaint.setColor(Themes.getAttrColor(getContext(), android.R.attr.textColorPrimary));
- mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,
- mLauncher.getDeviceProfile().iconTextSizePx, getResources().getDisplayMetrics()));
- setBackgroundResource(R.drawable.pending_widget_bg);
- setWillNotDraw(false);
+ this(context, info, disabledForSafeMode,
+ context.getResources().getText(R.string.gadget_complete_setup_text));
super.updateAppWidget(null);
setOnClickListener(mLauncher.getItemOnClickListener());
@@ -97,15 +97,62 @@
}
}
+ public PendingAppWidgetHostView(
+ Context context, int appWidgetId, LauncherAppWidgetProviderInfo appWidget) {
+ this(context, new LauncherAppWidgetInfo(appWidgetId, appWidget.provider), false,
+ appWidget.label);
+ getBackground().mutate().setAlpha(DEFERRED_ALPHA);
+
+ mCenterDrawable = new ColorDrawable(Color.TRANSPARENT);
+ mDragFlags = FLAG_DRAW_LABEL;
+ mDrawableSizeChanged = true;
+ }
+
+ private PendingAppWidgetHostView(Context context, LauncherAppWidgetInfo info,
+ boolean disabledForSafeMode, CharSequence label) {
+ super(new ContextThemeWrapper(context, R.style.WidgetContainerTheme));
+
+ mInfo = info;
+ mStartState = info.restoreStatus;
+ mDisabledForSafeMode = disabledForSafeMode;
+ mLabel = label;
+
+ mPaint = new TextPaint();
+ mPaint.setColor(Themes.getAttrColor(getContext(), android.R.attr.textColorPrimary));
+ mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,
+ mLauncher.getDeviceProfile().iconTextSizePx, getResources().getDisplayMetrics()));
+
+ setWillNotDraw(false);
+ setBackgroundResource(R.drawable.pending_widget_bg);
+ }
+
@Override
public void updateAppWidget(RemoteViews remoteViews) {
WidgetManagerHelper widgetManagerHelper = new WidgetManagerHelper(getContext());
if (widgetManagerHelper.isAppWidgetRestored(mInfo.appWidgetId)) {
- super.updateAppWidget(remoteViews);
reInflate();
}
}
+ /**
+ * Forces the Launcher to reinflate the widget view
+ */
+ public void reInflate() {
+ if (!isAttachedToWindow()) {
+ return;
+ }
+ LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag();
+ if (info == null) {
+ // This occurs when LauncherAppWidgetHostView is used to render a preview layout.
+ return;
+ }
+ // Remove and rebind the current widget (which was inflated in the wrong
+ // orientation), but don't delete it from the database
+ mLauncher.removeItem(this, info, false /* deleteFromDb */,
+ "widget removed because of configuration change");
+ mLauncher.bindAppWidget(info);
+ }
+
@Override
public void updateAppWidgetSize(Bundle newOptions, int minWidth, int minHeight, int maxWidth,
int maxHeight) {
@@ -147,7 +194,10 @@
mCenterDrawable.setCallback(null);
mCenterDrawable = null;
}
+ mDragFlags = 0;
if (info.bitmap.icon != null) {
+ mDragFlags = FLAG_DRAW_ICON;
+
Drawable widgetCategoryIcon = getWidgetCategoryIcon();
// The view displays three modes,
// 1) App icon in the center
@@ -169,6 +219,8 @@
: widgetCategoryIcon;
mSettingIconDrawable = getResources().getDrawable(R.drawable.ic_setting).mutate();
updateSettingColor(info.bitmap.color);
+
+ mDragFlags |= FLAG_DRAW_SETTINGS | FLAG_DRAW_LABEL;
} else {
mCenterDrawable = widgetCategoryIcon == null
? newPendingIcon(getContext(), info)
@@ -239,68 +291,63 @@
int availableWidth = getWidth() - paddingLeft - paddingRight - 2 * minPadding;
int availableHeight = getHeight() - paddingTop - paddingBottom - 2 * minPadding;
- if (mSettingIconDrawable == null) {
- int maxSize = grid.iconSizePx;
- int size = Math.min(maxSize, Math.min(availableWidth, availableHeight));
+ float iconSize = ((mDragFlags & FLAG_DRAW_ICON) == 0) ? 0
+ : Math.max(0, Math.min(availableWidth, availableHeight));
+ // Use twice the setting size factor, as the setting is drawn at a corner and the
+ // icon is drawn in the center.
+ float settingIconScaleFactor = ((mDragFlags & FLAG_DRAW_SETTINGS) == 0) ? 0
+ : 1 + SETUP_ICON_SIZE_FACTOR * 2;
- mRect.set(0, 0, size, size);
- mRect.offsetTo((getWidth() - mRect.width()) / 2, (getHeight() - mRect.height()) / 2);
- mCenterDrawable.setBounds(mRect);
- } else {
- float iconSize = Math.max(0, Math.min(availableWidth, availableHeight));
+ int maxSize = Math.max(availableWidth, availableHeight);
+ if (iconSize * settingIconScaleFactor > maxSize) {
+ // There is an overlap
+ iconSize = maxSize / settingIconScaleFactor;
+ }
- // Use twice the setting size factor, as the setting is drawn at a corner and the
- // icon is drawn in the center.
- float settingIconScaleFactor = 1 + SETUP_ICON_SIZE_FACTOR * 2;
- int maxSize = Math.max(availableWidth, availableHeight);
- if (iconSize * settingIconScaleFactor > maxSize) {
- // There is an overlap
- iconSize = maxSize / settingIconScaleFactor;
+ int actualIconSize = (int) Math.min(iconSize, grid.iconSizePx);
+
+ // Icon top when we do not draw the text
+ int iconTop = (getHeight() - actualIconSize) / 2;
+ mSetupTextLayout = null;
+
+ if (availableWidth > 0 && !TextUtils.isEmpty(mLabel)
+ && ((mDragFlags & FLAG_DRAW_LABEL) != 0)) {
+ // Recreate the setup text.
+ mSetupTextLayout = new StaticLayout(
+ mLabel, mPaint, availableWidth, Layout.Alignment.ALIGN_CENTER, 1, 0, true);
+ int textHeight = mSetupTextLayout.getHeight();
+
+ // Extra icon size due to the setting icon
+ float minHeightWithText = textHeight + actualIconSize * settingIconScaleFactor
+ + grid.iconDrawablePaddingPx;
+
+ if (minHeightWithText < availableHeight) {
+ // We can draw the text as well
+ iconTop = (getHeight() - textHeight
+ - grid.iconDrawablePaddingPx - actualIconSize) / 2;
+
+ } else {
+ // We can't draw the text. Let the iconTop be same as before.
+ mSetupTextLayout = null;
}
+ }
- int actualIconSize = (int) Math.min(iconSize, grid.iconSizePx);
+ mRect.set(0, 0, actualIconSize, actualIconSize);
+ mRect.offset((getWidth() - actualIconSize) / 2, iconTop);
+ mCenterDrawable.setBounds(mRect);
- // Icon top when we do not draw the text
- int iconTop = (getHeight() - actualIconSize) / 2;
- mSetupTextLayout = null;
-
- if (availableWidth > 0) {
- // Recreate the setup text.
- mSetupTextLayout = new StaticLayout(
- getResources().getText(R.string.gadget_complete_setup_text), mPaint,
- availableWidth, Layout.Alignment.ALIGN_CENTER, 1, 0, true);
- int textHeight = mSetupTextLayout.getHeight();
-
- // Extra icon size due to the setting icon
- float minHeightWithText = textHeight + actualIconSize * settingIconScaleFactor
- + grid.iconDrawablePaddingPx;
-
- if (minHeightWithText < availableHeight) {
- // We can draw the text as well
- iconTop = (getHeight() - textHeight -
- grid.iconDrawablePaddingPx - actualIconSize) / 2;
-
- } else {
- // We can't draw the text. Let the iconTop be same as before.
- mSetupTextLayout = null;
- }
- }
-
- mRect.set(0, 0, actualIconSize, actualIconSize);
- mRect.offset((getWidth() - actualIconSize) / 2, iconTop);
- mCenterDrawable.setBounds(mRect);
-
+ if (mSettingIconDrawable != null) {
mRect.left = paddingLeft + minPadding;
mRect.right = mRect.left + (int) (SETUP_ICON_SIZE_FACTOR * actualIconSize);
mRect.top = paddingTop + minPadding;
mRect.bottom = mRect.top + (int) (SETUP_ICON_SIZE_FACTOR * actualIconSize);
mSettingIconDrawable.setBounds(mRect);
+ }
- if (mSetupTextLayout != null) {
- // Set up position for dragging the text
- mRect.left = paddingLeft + minPadding;
- mRect.top = mCenterDrawable.getBounds().bottom + grid.iconDrawablePaddingPx;
- }
+ if (mSetupTextLayout != null) {
+ // Set up position for dragging the text
+ mRect.left = paddingLeft + minPadding;
+ mRect.top = mCenterDrawable.getBounds().bottom + grid.iconDrawablePaddingPx;
}
}