OSDN Git Service

Showing widgets in a disabled state, when running in safe mode
authorSunny Goyal <sunnygoyal@google.com>
Wed, 8 Oct 2014 17:47:28 +0000 (10:47 -0700)
committerSunny Goyal <sunnygoyal@google.com>
Thu, 16 Oct 2014 18:20:41 +0000 (11:20 -0700)
Bug: 15172107

Change-Id: I7209836ca4ffacde7b7b232e230e9b9f1a0e54bb

res/values/strings.xml
src/com/android/launcher3/Launcher.java
src/com/android/launcher3/LauncherModel.java
src/com/android/launcher3/PendingAppWidgetHostView.java

index dd9b170..00f1b17 100644 (file)
@@ -44,6 +44,8 @@
     <string name="activity_not_available">App isn\'t available</string>
     <!-- SafeMode shortcut error string -->
     <string name="safemode_shortcut_error">Downloaded app disabled in Safe mode</string>
+    <!-- SafeMode widget error string -->
+    <string name="safemode_widget_error">Widgets disabled in Safe mode</string>
     <!--  Labels for the tabs in the customize drawer -->
     <string name="widgets_tab_label">Widgets</string>
 
index d5cb55b..444a4bc 100644 (file)
@@ -2538,6 +2538,11 @@ public class Launcher extends Activity
      * Event handler for the app widget view which has not fully restored.
      */
     public void onClickPendingWidget(final PendingAppWidgetHostView v) {
+        if (mIsSafeModeEnabled) {
+            Toast.makeText(this, R.string.safemode_widget_error, Toast.LENGTH_SHORT).show();
+            return;
+        }
+
         final LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) v.getTag();
         if (v.isReadyForClickSetup()) {
             int widgetId = info.appWidgetId;
@@ -2790,10 +2795,13 @@ public class Launcher extends Activity
      */
     protected void onClickAddWidgetButton(View view) {
         if (LOGD) Log.d(TAG, "onClickAddWidgetButton");
-        showAllApps(true, AppsCustomizePagedView.ContentType.Widgets, true);
-
-        if (mLauncherCallbacks != null) {
-            mLauncherCallbacks.onClickAddWidgetButton(view);
+        if (mIsSafeModeEnabled) {
+            Toast.makeText(this, R.string.safemode_widget_error, Toast.LENGTH_SHORT).show();
+        } else {
+            showAllApps(true, AppsCustomizePagedView.ContentType.Widgets, true);
+            if (mLauncherCallbacks != null) {
+                mLauncherCallbacks.onClickAddWidgetButton(view);
+            }
         }
     }
 
@@ -4591,8 +4599,9 @@ public class Launcher extends Activity
         final Workspace workspace = mWorkspace;
 
         AppWidgetProviderInfo appWidgetInfo;
-        if (((item.restoreStatus & LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) == 0) &&
-                ((item.restoreStatus & LauncherAppWidgetInfo.FLAG_ID_NOT_VALID) != 0)) {
+        if (!mIsSafeModeEnabled
+                && ((item.restoreStatus & LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) == 0)
+                && ((item.restoreStatus & LauncherAppWidgetInfo.FLAG_ID_NOT_VALID) != 0)) {
 
             appWidgetInfo = mModel.findAppWidgetProviderInfoWithComponent(this, item.providerName);
             if (appWidgetInfo == null) {
@@ -4642,7 +4651,7 @@ public class Launcher extends Activity
             LauncherModel.updateItemInDatabase(this, item);
         }
 
-        if (item.restoreStatus == LauncherAppWidgetInfo.RESTORE_COMPLETED) {
+        if (!mIsSafeModeEnabled && item.restoreStatus == LauncherAppWidgetInfo.RESTORE_COMPLETED) {
             final int appWidgetId = item.appWidgetId;
             appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
             if (DEBUG_WIDGETS) {
@@ -4652,7 +4661,8 @@ public class Launcher extends Activity
             item.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
         } else {
             appWidgetInfo = null;
-            PendingAppWidgetHostView view = new PendingAppWidgetHostView(this, item);
+            PendingAppWidgetHostView view = new PendingAppWidgetHostView(this, item,
+                    mIsSafeModeEnabled);
             view.updateIcon(mIconCache);
             item.hostView = view;
             item.hostView.updateAppWidget(null);
index f747423..f0899a8 100644 (file)
@@ -2278,7 +2278,7 @@ public class LauncherModel extends BroadcastReceiver
                                             // App restore has started. Update the flag
                                             appWidgetInfo.restoreStatus |=
                                                     LauncherAppWidgetInfo.FLAG_RESTORE_STARTED;
-                                        } else if (REMOVE_UNRESTORED_ICONS) {
+                                        } else if (REMOVE_UNRESTORED_ICONS && !isSafeMode) {
                                             Launcher.addDumpLog(TAG,
                                                     "Unrestored widget removed: " + component, true);
                                             itemsToRemove.add(id);
index d23a330..179c60a 100644 (file)
@@ -41,9 +41,9 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen
     private final LauncherAppWidgetInfo mInfo;
     private final int mStartState;
     private final Intent mIconLookupIntent;
+    private final boolean mDisabledForSafeMode;
 
     private Bitmap mIcon;
-    private PreloadIconDrawable mDrawable;
 
     private Drawable mCenterDrawable;
     private Drawable mTopCornerDrawable;
@@ -53,11 +53,13 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen
     private final TextPaint mPaint;
     private Layout mSetupTextLayout;
 
-    public PendingAppWidgetHostView(Context context, LauncherAppWidgetInfo info) {
+    public PendingAppWidgetHostView(Context context, LauncherAppWidgetInfo info,
+            boolean disabledForSafeMode) {
         super(context);
         mInfo = info;
         mStartState = info.restoreStatus;
         mIconLookupIntent = new Intent().setComponent(info.providerName);
+        mDisabledForSafeMode = disabledForSafeMode;
 
         mPaint = new TextPaint();
         mPaint.setColor(0xFFFFFFFF);
@@ -106,14 +108,21 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen
             return;
         }
         mIcon = icon;
-        if (mDrawable != null) {
-            mDrawable.setCallback(null);
-            mDrawable = null;
+        if (mCenterDrawable != null) {
+            mCenterDrawable.setCallback(null);
+            mCenterDrawable = null;
         }
         if (mIcon != null) {
-            // The view displays two modes, one with a setup icon and another with a preload icon
-            // in the center.
-            if (isReadyForClickSetup()) {
+            // The view displays three modes,
+            //   1) App icon in the center
+            //   2) Preload icon in the center
+            //   3) Setup icon in the center and app icon in the top right corner.
+            if (mDisabledForSafeMode) {
+                FastBitmapDrawable disabledIcon = Utilities.createIconDrawable(mIcon);
+                disabledIcon.setGhostModeEnabled(true);
+                mCenterDrawable = disabledIcon;
+                mTopCornerDrawable = null;
+            } else if (isReadyForClickSetup()) {
                 mCenterDrawable = getResources().getDrawable(R.drawable.ic_setting);
                 mTopCornerDrawable = new FastBitmapDrawable(mIcon);
             } else {
@@ -123,8 +132,9 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen
                 }
 
                 FastBitmapDrawable drawable = Utilities.createIconDrawable(mIcon);
-                mDrawable = new PreloadIconDrawable(drawable, sPreloaderTheme);
-                mDrawable.setCallback(this);
+                mCenterDrawable = new PreloadIconDrawable(drawable, sPreloaderTheme);
+                mCenterDrawable.setCallback(this);
+                mTopCornerDrawable = null;
                 applyState();
             }
             mDrawableSizeChanged = true;
@@ -133,12 +143,12 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen
 
     @Override
     protected boolean verifyDrawable(Drawable who) {
-        return (who == mDrawable) || super.verifyDrawable(who);
+        return (who == mCenterDrawable) || super.verifyDrawable(who);
     }
 
     public void applyState() {
-        if (mDrawable != null) {
-            mDrawable.setLevel(Math.max(mInfo.installProgress, 0));
+        if (mCenterDrawable != null) {
+            mCenterDrawable.setLevel(Math.max(mInfo.installProgress, 0));
         }
     }
 
@@ -158,23 +168,30 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen
 
     @Override
     protected void onDraw(Canvas canvas) {
-        if (mDrawable != null) {
+        if (mCenterDrawable == null) {
+            // Nothing to draw
+            return;
+        }
+
+        if (mTopCornerDrawable == null) {
             if (mDrawableSizeChanged) {
+                int outset = (mCenterDrawable instanceof PreloadIconDrawable) ?
+                        ((PreloadIconDrawable) mCenterDrawable).getOutset() : 0;
                 int maxSize = LauncherAppState.getInstance().getDynamicGrid()
-                        .getDeviceProfile().iconSizePx + 2 * mDrawable.getOutset();
+                        .getDeviceProfile().iconSizePx + 2 * outset;
                 int size = Math.min(maxSize, Math.min(
                         getWidth() - getPaddingLeft() - getPaddingRight(),
                         getHeight() - getPaddingTop() - getPaddingBottom()));
 
                 mRect.set(0, 0, size, size);
-                mRect.inset(mDrawable.getOutset(), mDrawable.getOutset());
+                mRect.inset(outset, outset);
                 mRect.offsetTo((getWidth() - mRect.width()) / 2, (getHeight() - mRect.height()) / 2);
-                mDrawable.setBounds(mRect);
+                mCenterDrawable.setBounds(mRect);
                 mDrawableSizeChanged = false;
             }
-
-            mDrawable.draw(canvas);
-        } else if ((mCenterDrawable != null) && (mTopCornerDrawable != null)) {
+            mCenterDrawable.draw(canvas);
+        } else  {
+            // Draw the top corner icon and "Setup" text is possible
             if (mDrawableSizeChanged) {
                 DeviceProfile grid = getDeviceProfile();
                 int iconSize = grid.iconSizePx;