summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/launcher3/LauncherAppState.java1
-rw-r--r--src/com/android/launcher3/LauncherBackupHelper.java61
-rw-r--r--src/com/android/launcher3/LauncherModel.java63
-rw-r--r--src/com/android/launcher3/PagedView.java7
-rw-r--r--src/com/android/launcher3/widget/WidgetsRecyclerView.java8
5 files changed, 77 insertions, 63 deletions
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index 81d595aaf..76ad8c164 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -21,7 +21,6 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.res.Configuration;
import android.content.res.Resources;
import android.util.Log;
diff --git a/src/com/android/launcher3/LauncherBackupHelper.java b/src/com/android/launcher3/LauncherBackupHelper.java
index b40ace3fb..dc0bccc3c 100644
--- a/src/com/android/launcher3/LauncherBackupHelper.java
+++ b/src/com/android/launcher3/LauncherBackupHelper.java
@@ -146,7 +146,6 @@ public class LauncherBackupHelper implements BackupHelper {
private long mLastBackupRestoreTime;
private boolean mBackupDataWasUpdated;
- private LauncherAppState mLauncherAppState;
private IconCache mIconCache;
private DeviceProfieData mDeviceProfileData;
@@ -205,7 +204,11 @@ public class LauncherBackupHelper implements BackupHelper {
return;
}
- lazyInitAppState(true /* noCreate */);
+ if (mDeviceProfileData == null) {
+ LauncherAppState app = LauncherAppState.getInstance();
+ mDeviceProfileData = initDeviceProfileData(app.getInvariantDeviceProfile());
+ mIconCache = app.getIconCache();
+ }
Log.v(TAG, "lastBackupTime = " + in.t);
mKeys.clear();
@@ -240,7 +243,7 @@ public class LauncherBackupHelper implements BackupHelper {
// Check if any metadata has changed
mBackupDataWasUpdated = (in.profile == null)
|| !Arrays.equals(DeviceProfieData.toByteArray(in.profile),
- DeviceProfieData.toByteArray(getDeviceProfieData()))
+ DeviceProfieData.toByteArray(mDeviceProfileData))
|| (in.backupVersion != BACKUP_VERSION)
|| (in.appVersion != getAppVersion());
}
@@ -268,8 +271,7 @@ public class LauncherBackupHelper implements BackupHelper {
* to this device.
*/
private boolean isBackupCompatible(Journal oldState) {
- DeviceProfieData currentProfile = getDeviceProfieData();
-
+ DeviceProfieData currentProfile = mDeviceProfileData;
DeviceProfieData oldProfile = oldState.profile;
if (oldProfile == null || oldProfile.desktopCols == 0) {
@@ -302,7 +304,14 @@ public class LauncherBackupHelper implements BackupHelper {
if (!restoreSuccessful) {
return;
}
- lazyInitAppState(false /* noCreate */);
+
+ if (mDeviceProfileData == null) {
+ // This call does not happen on a looper thread. So LauncherAppState
+ // can't be created . Instead initialize required dependencies directly.
+ InvariantDeviceProfile profile = new InvariantDeviceProfile(mContext);
+ mDeviceProfileData = initDeviceProfileData(profile);
+ mIconCache = new IconCache(mContext, profile);
+ }
int dataSize = data.size();
if (mBuffer.length < dataSize) {
@@ -379,7 +388,7 @@ public class LauncherBackupHelper implements BackupHelper {
journal.key = mKeys.toArray(new BackupProtos.Key[mKeys.size()]);
journal.appVersion = getAppVersion();
journal.backupVersion = BACKUP_VERSION;
- journal.profile = getDeviceProfieData();
+ journal.profile = mDeviceProfileData;
return journal;
}
@@ -392,31 +401,6 @@ public class LauncherBackupHelper implements BackupHelper {
}
}
- /**
- * @return the current device profile information.
- */
- private DeviceProfieData getDeviceProfieData() {
- return mDeviceProfileData;
- }
-
- private void lazyInitAppState(boolean noCreate) {
- if (mLauncherAppState != null) {
- return;
- }
-
- if (noCreate) {
- mLauncherAppState = LauncherAppState.getInstanceNoCreate();
- } else {
- LauncherAppState.setApplicationContext(mContext);
- mLauncherAppState = LauncherAppState.getInstance();
- }
-
- mIconCache = mLauncherAppState.getIconCache();
- InvariantDeviceProfile profile = mLauncherAppState.getInvariantDeviceProfile();
-
- mDeviceProfileData = initDeviceProfileData(profile);
- }
-
private DeviceProfieData initDeviceProfileData(InvariantDeviceProfile profile) {
DeviceProfieData data = new DeviceProfieData();
data.desktopRows = profile.numRows;
@@ -631,7 +615,6 @@ public class LauncherBackupHelper implements BackupHelper {
private void backupWidgets(BackupDataOutput data) throws IOException {
// persist static widget info that hasn't been persisted yet
final ContentResolver cr = mContext.getContentResolver();
- final WidgetPreviewLoader previewLoader = mLauncherAppState.getWidgetCache();
final int dpi = mContext.getResources().getDisplayMetrics().densityDpi;
int backupWidgetCount = 0;
@@ -644,7 +627,6 @@ public class LauncherBackupHelper implements BackupHelper {
while(cursor.moveToNext()) {
final long id = cursor.getLong(ID_INDEX);
final String providerName = cursor.getString(APPWIDGET_PROVIDER_INDEX);
- final int spanX = cursor.getInt(SPANX_INDEX);
final ComponentName provider = ComponentName.unflattenFromString(providerName);
Key key = null;
String backupKey = null;
@@ -664,9 +646,7 @@ public class LauncherBackupHelper implements BackupHelper {
if (backupWidgetCount < MAX_WIDGETS_PER_PASS) {
if (DEBUG) Log.d(TAG, "saving widget " + backupKey);
UserHandleCompat user = UserHandleCompat.myUserHandle();
- writeRowToBackup(key,
- packWidget(dpi, previewLoader, mIconCache, provider, user),
- data);
+ writeRowToBackup(key, packWidget(dpi, provider, user), data);
mKeys.add(key);
backupWidgetCount ++;
} else {
@@ -895,7 +875,7 @@ public class LauncherBackupHelper implements BackupHelper {
UserManagerCompat.getInstance(mContext).getSerialNumberForUser(myUserHandle);
values.put(LauncherSettings.Favorites.PROFILE_ID, userSerialNumber);
- DeviceProfieData currentProfile = getDeviceProfieData();
+ DeviceProfieData currentProfile = mDeviceProfileData;
if (favorite.itemType == Favorites.ITEM_TYPE_APPWIDGET) {
if (!TextUtils.isEmpty(favorite.appWidgetProvider)) {
@@ -972,8 +952,7 @@ public class LauncherBackupHelper implements BackupHelper {
}
/** Serialize a widget for persistence, including a checksum wrapper. */
- private Widget packWidget(int dpi, WidgetPreviewLoader previewLoader, IconCache iconCache,
- ComponentName provider, UserHandleCompat user) {
+ private Widget packWidget(int dpi, ComponentName provider, UserHandleCompat user) {
final LauncherAppWidgetProviderInfo info =
LauncherModel.getProviderInfo(mContext, provider, user);
Widget widget = new Widget();
@@ -982,7 +961,7 @@ public class LauncherBackupHelper implements BackupHelper {
widget.configure = info.configure != null;
if (info.icon != 0) {
widget.icon = new Resource();
- Drawable fullResIcon = iconCache.getFullResIcon(provider.getPackageName(), info.icon);
+ Drawable fullResIcon = mIconCache.getFullResIcon(provider.getPackageName(), info.icon);
Bitmap icon = Utilities.createIconBitmap(fullResIcon, mContext);
widget.icon.data = Utilities.flattenBitmap(icon);
widget.icon.dpi = dpi;
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 10b8648de..a132e919a 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -45,6 +45,7 @@ import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.TransactionTooLargeException;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;
@@ -3284,27 +3285,51 @@ public class LauncherModel extends BroadcastReceiver
public static List<LauncherAppWidgetProviderInfo> getWidgetProviders(Context context,
boolean refresh) {
- synchronized (sBgLock) {
- if (sBgWidgetProviders == null || refresh) {
- sBgWidgetProviders = new HashMap<>();
- AppWidgetManagerCompat wm = AppWidgetManagerCompat.getInstance(context);
- LauncherAppWidgetProviderInfo info;
-
- List<AppWidgetProviderInfo> widgets = wm.getAllProviders();
- for (AppWidgetProviderInfo pInfo : widgets) {
- info = LauncherAppWidgetProviderInfo.fromProviderInfo(context, pInfo);
- UserHandleCompat user = wm.getUser(info);
- sBgWidgetProviders.put(new ComponentKey(info.provider, user), info);
- }
-
- Collection<CustomAppWidget> customWidgets = Launcher.getCustomAppWidgets().values();
- for (CustomAppWidget widget : customWidgets) {
- info = new LauncherAppWidgetProviderInfo(context, widget);
- UserHandleCompat user = wm.getUser(info);
- sBgWidgetProviders.put(new ComponentKey(info.provider, user), info);
+ ArrayList<LauncherAppWidgetProviderInfo> results =
+ new ArrayList<LauncherAppWidgetProviderInfo>();
+ try {
+ synchronized (sBgLock) {
+ if (sBgWidgetProviders == null || refresh) {
+ HashMap<ComponentKey, LauncherAppWidgetProviderInfo> tmpWidgetProviders
+ = new HashMap<>();
+ AppWidgetManagerCompat wm = AppWidgetManagerCompat.getInstance(context);
+ LauncherAppWidgetProviderInfo info;
+
+ List<AppWidgetProviderInfo> widgets = wm.getAllProviders();
+ for (AppWidgetProviderInfo pInfo : widgets) {
+ info = LauncherAppWidgetProviderInfo.fromProviderInfo(context, pInfo);
+ UserHandleCompat user = wm.getUser(info);
+ tmpWidgetProviders.put(new ComponentKey(info.provider, user), info);
+ }
+
+ Collection<CustomAppWidget> customWidgets = Launcher.getCustomAppWidgets().values();
+ for (CustomAppWidget widget : customWidgets) {
+ info = new LauncherAppWidgetProviderInfo(context, widget);
+ UserHandleCompat user = wm.getUser(info);
+ tmpWidgetProviders.put(new ComponentKey(info.provider, user), info);
+ }
+ // Replace the global list at the very end, so that if there is an exception,
+ // previously loaded provider list is used.
+ sBgWidgetProviders = tmpWidgetProviders;
+ }
+ results.addAll(sBgWidgetProviders.values());
+ return results;
+ }
+ } catch (Exception e) {
+ if (e.getCause() instanceof TransactionTooLargeException) {
+ // the returned value may be incomplete and will not be refreshed until the next
+ // time Launcher starts.
+ // TODO: after figuring out a repro step, introduce a dirty bit to check when
+ // onResume is called to refresh the widget provider list.
+ synchronized (sBgLock) {
+ if (sBgWidgetProviders != null) {
+ results.addAll(sBgWidgetProviders.values());
+ }
+ return results;
}
+ } else {
+ throw e;
}
- return new ArrayList<LauncherAppWidgetProviderInfo>(sBgWidgetProviders.values());
}
}
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index 18832c680..4a85b448f 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -567,6 +567,13 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
public void scrollTo(int x, int y) {
// In free scroll mode, we clamp the scrollX
if (mFreeScroll) {
+ // If the scroller is trying to move to a location beyond the maximum allowed
+ // in the free scroll mode, we make sure to end the scroll operation.
+ if (!mScroller.isFinished() &&
+ (x > mFreeScrollMaxScrollX || x < mFreeScrollMinScrollX)) {
+ forceFinishScroller();
+ }
+
x = Math.min(x, mFreeScrollMaxScrollX);
x = Math.max(x, mFreeScrollMinScrollX);
}
diff --git a/src/com/android/launcher3/widget/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/WidgetsRecyclerView.java
index 4aa332380..9d265f87e 100644
--- a/src/com/android/launcher3/widget/WidgetsRecyclerView.java
+++ b/src/com/android/launcher3/widget/WidgetsRecyclerView.java
@@ -25,7 +25,6 @@ import android.view.View;
import com.android.launcher3.BaseRecyclerView;
import com.android.launcher3.Utilities;
-import com.android.launcher3.compat.AlphabeticIndexCompat;
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.PackageItemInfo;
@@ -37,7 +36,6 @@ public class WidgetsRecyclerView extends BaseRecyclerView {
private static final String TAG = "WidgetsRecyclerView";
private WidgetsModel mWidgets;
private Rect mBackgroundPadding = new Rect();
- private PackageItemInfo mLastPackageItemInfo;
public WidgetsRecyclerView(Context context) {
this(context, null);
@@ -48,9 +46,15 @@ public class WidgetsRecyclerView extends BaseRecyclerView {
}
public WidgetsRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
+ // API 21 and below only support 3 parameter ctor.
super(context, attrs, defStyleAttr);
}
+ public WidgetsRecyclerView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ this(context, attrs, defStyleAttr);
+ }
+
@Override
protected void onFinishInflate() {
super.onFinishInflate();