From 06dff35763bc46884b6464a9bf4406d32cdcaea4 Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Fri, 1 Jun 2012 17:17:08 -0700 Subject: Fixing issue where widgets could be inflated in wrong orientation (issue 6584646) Change-Id: I24ea7f59345e8f62daf36c13cb43e1ab0180e805 --- src/com/android/launcher2/Launcher.java | 25 ++++++++++++++++++++++ .../launcher2/LauncherAppWidgetHostView.java | 22 +++++++++++++++++++ src/com/android/launcher2/LauncherModel.java | 4 ++++ 3 files changed, 51 insertions(+) diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index b2f27b960..3354d49bd 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -682,6 +682,31 @@ public final class Launcher extends Activity // Resets the previous all apps icon press state mAppsCustomizeContent.resetDrawableState(); } + // It is possible that widgets can receive updates while launcher is not in the foreground. + // Consequently, the widgets will be inflated in the orientation of the foreground activity + // (framework issue). On resuming, we ensure that any widgets are inflated for the current + // orientation. + reinflateWidgetsIfNecessary(); + } + + void reinflateWidgetsIfNecessary() { + for (LauncherAppWidgetInfo info: LauncherModel.getWidgets()) { + LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) info.hostView; + if (lahv != null && lahv.orientationChangedSincedInflation()) { + AppWidgetProviderInfo pInfo = lahv.getAppWidgetInfo(); + + // Remove the current widget which is inflated with the wrong orientation + getWorkspace().getParentCellLayoutForView(lahv).removeView(lahv); + // Re-inflate the widget using the correct orientation + AppWidgetHostView widget = mAppWidgetHost.createView(this, info.appWidgetId, pInfo); + + // Add the new widget back + widget.setTag(info); + info.hostView = widget; + getWorkspace().addInScreen(widget, info.container, info.screen, + info.cellX, info.cellY, info.spanX, info.spanY); + } + } } @Override diff --git a/src/com/android/launcher2/LauncherAppWidgetHostView.java b/src/com/android/launcher2/LauncherAppWidgetHostView.java index e34196ee6..9970c7675 100644 --- a/src/com/android/launcher2/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher2/LauncherAppWidgetHostView.java @@ -18,10 +18,14 @@ package com.android.launcher2; import android.appwidget.AppWidgetHostView; import android.content.Context; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Parcel; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.widget.RemoteViews; import com.android.launcher.R; @@ -31,9 +35,12 @@ import com.android.launcher.R; public class LauncherAppWidgetHostView extends AppWidgetHostView { private CheckLongPressHelper mLongPressHelper; private LayoutInflater mInflater; + private Context mContext; + private int mPreviousOrientation; public LauncherAppWidgetHostView(Context context) { super(context); + mContext = context; mLongPressHelper = new CheckLongPressHelper(this); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @@ -43,6 +50,21 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView { return mInflater.inflate(R.layout.appwidget_error, this, false); } + @Override + public void updateAppWidget(RemoteViews remoteViews) { + // Store the orientation in which the widget was inflated + mPreviousOrientation = mContext.getResources().getConfiguration().orientation; + super.updateAppWidget(remoteViews); + } + + public boolean orientationChangedSincedInflation() { + int orientation = mContext.getResources().getConfiguration().orientation; + if (mPreviousOrientation != orientation) { + return true; + } + return false; + } + public boolean onInterceptTouchEvent(MotionEvent ev) { // Consume any touch events for ourselves after longpress is triggered if (mLongPressHelper.hasPerformedLongPress()) { diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java index fc1a26d4b..1b17ef952 100644 --- a/src/com/android/launcher2/LauncherModel.java +++ b/src/com/android/launcher2/LauncherModel.java @@ -377,6 +377,10 @@ public class LauncherModel extends BroadcastReceiver { return items; } + static ArrayList getWidgets() { + return sAppWidgets; + } + /** * Find a folder in the db, creating the FolderInfo if necessary, and adding it to folderList. */ -- cgit v1.2.3