Merge "Removing logic for workspace migration from Launcher2" into ub-launcher3-calgary

This commit is contained in:
Sunny Goyal
2016-05-25 19:26:18 +00:00
committed by Android (Google) Code Review
10 changed files with 28 additions and 684 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

-11
View File
@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<gradient
android:endColor="#00ffeb3a"
android:gradientRadius="50%p"
android:startColor="#80ffeb3a"
android:type="radial" />
</shape>
-106
View File
@@ -1,106 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2011 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto"
android:id="@+id/migration_cling"
android:layout_width="match_parent"
android:layout_height="match_parent"
launcher:layout_ignoreInsets="true"
android:background="#FF009688"
android:baselineAligned="false"
android:gravity="center_vertical" >
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" >
<ImageView
android:layout_width="@dimen/cling_migration_bg_size"
android:layout_height="@dimen/cling_migration_bg_size"
android:layout_gravity="center"
android:background="@drawable/bg_migration_cling" />
<ImageView
android:layout_width="@dimen/cling_migration_logo_width"
android:layout_height="@dimen/cling_migration_logo_height"
android:layout_gravity="center"
android:src="@drawable/ic_migration" />
</FrameLayout>
<LinearLayout
android:layout_width="@dimen/cling_migration_content_width"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/cling_migration_content_margin"
android:layout_marginRight="@dimen/cling_migration_content_margin"
android:orientation="vertical"
android:paddingLeft="24dp"
android:paddingRight="24dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/first_run_cling_title"
android:textColor="#E1000000"
android:textSize="34sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:text="@string/migration_cling_title"
android:textColor="#E1000000"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="24dp"
android:text="@string/migration_cling_description"
android:textColor="#99000000"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/cling_dismiss_migration_copy_apps"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="sans-serif-medium"
android:text="@string/migration_cling_copy_apps"
android:textColor="#FFFFFFFF"
android:textSize="14sp" />
<Button
android:id="@+id/cling_dismiss_migration_use_default"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="sans-serif-medium"
android:text="@string/migration_cling_use_default"
android:textColor="#deFFFFFF"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
-109
View File
@@ -1,109 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2011 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.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto"
android:id="@+id/migration_cling"
android:layout_width="match_parent"
android:layout_height="match_parent"
launcher:layout_ignoreInsets="true"
android:background="#FF009688" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" >
<ImageView
android:layout_width="@dimen/cling_migration_bg_size"
android:layout_height="@dimen/cling_migration_bg_size"
android:layout_below="@+id/ic_cling_migration"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/cling_migration_bg_shift"
android:src="@drawable/bg_migration_cling" />
<ImageView
android:id="@+id/ic_cling_migration"
android:layout_width="@dimen/cling_migration_logo_width"
android:layout_height="@dimen/cling_migration_logo_height"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="@drawable/ic_migration" />
<LinearLayout
android:layout_width="@dimen/cling_migration_content_width"
android:layout_height="wrap_content"
android:layout_below="@+id/ic_cling_migration"
android:layout_marginStart="@dimen/cling_migration_content_margin"
android:layout_marginLeft="@dimen/cling_migration_content_margin"
android:orientation="vertical"
android:paddingLeft="24dp"
android:paddingRight="24dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/first_run_cling_title"
android:textColor="#E1000000"
android:textSize="34sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:text="@string/migration_cling_title"
android:textColor="#E1000000"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="24dp"
android:text="@string/migration_cling_description"
android:textColor="#99000000"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/cling_dismiss_migration_copy_apps"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="sans-serif-medium"
android:text="@string/migration_cling_copy_apps"
android:textColor="#FFFFFFFF"
android:textSize="14sp" />
<Button
android:id="@+id/cling_dismiss_migration_use_default"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="sans-serif-medium"
android:text="@string/migration_cling_use_default"
android:textColor="#deFFFFFF"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</FrameLayout>
-3
View File
@@ -21,9 +21,6 @@
<!-- General -->
<skip />
<!-- URI used to import old favorites. [DO NOT TRANSLATE] -->
<string name="old_launcher_provider_uri" translatable="false">content://com.android.launcher2.settings/favorites?notify=true</string>
<!-- Application name -->
<string name="app_name">Launcher3</string>
<!-- Default folder name -->
+1 -58
View File
@@ -152,8 +152,6 @@ public class Launcher extends Activity
static final boolean DEBUG_RESUME_TIME = false;
static final boolean DEBUG_LOGGING = false;
static final boolean ENABLE_DEBUG_INTENTS = false; // allow DebugIntents to run
private static final int REQUEST_CREATE_SHORTCUT = 1;
private static final int REQUEST_CREATE_APPWIDGET = 5;
private static final int REQUEST_PICK_APPWIDGET = 9;
@@ -201,9 +199,6 @@ public class Launcher extends Activity
private static final String QSB_WIDGET_ID = "qsb_widget_id";
private static final String QSB_WIDGET_PROVIDER = "qsb_widget_provider";
public static final String USER_HAS_MIGRATED = "launcher.user_migrated_from_old_data";
private static final String MIGRATE_AUTHORITY = "com.android.launcher2.settings";
/** The different states that Launcher can be in. */
enum State { NONE, WORKSPACE, WORKSPACE_SPRING_LOADED, APPS, APPS_SPRING_LOADED,
WIDGETS, WIDGETS_SPRING_LOADED }
@@ -1621,15 +1616,6 @@ public class Launcher extends Activity
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
mUserPresent = true;
updateAutoAdvanceState();
} else if (ENABLE_DEBUG_INTENTS && DebugIntents.DELETE_DATABASE.equals(action)) {
mModel.resetLoadedState(false, true);
mModel.startLoader(PagedView.INVALID_RESTORE_PAGE,
LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE);
} else if (ENABLE_DEBUG_INTENTS && DebugIntents.MIGRATE_DATABASE.equals(action)) {
mModel.resetLoadedState(false, true);
mModel.startLoader(PagedView.INVALID_RESTORE_PAGE,
LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE
| LauncherModel.LOADER_FLAG_MIGRATE_SHORTCUTS);
}
}
};
@@ -1642,11 +1628,6 @@ public class Launcher extends Activity
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
// For handling managed profiles
if (ENABLE_DEBUG_INTENTS) {
filter.addAction(DebugIntents.DELETE_DATABASE);
filter.addAction(DebugIntents.MIGRATE_DATABASE);
}
registerReceiver(mReceiver, filter);
FirstFrameAnimatorHelper.initializeDrawListener(getWindow().getDecorView());
mAttached = true;
@@ -4516,43 +4497,10 @@ public class Launcher extends Activity
LauncherClings launcherClings = new LauncherClings(this);
if (launcherClings.shouldShowFirstRunOrMigrationClings()) {
mClings = launcherClings;
if (canMigrateFromOldLauncherDb()) {
launcherClings.showMigrationCling();
} else {
launcherClings.showLongPressCling(true);
}
launcherClings.showLongPressCling(true);
}
}
private boolean canMigrateFromOldLauncherDb() {
// Return true if launcher was not preinstalled and and old content provider exists.
return ((getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 0) &&
providerExists(MIGRATE_AUTHORITY) &&
providerExists(Uri.parse(getString(R.string.old_launcher_provider_uri)).getAuthority());
}
private boolean providerExists(String authority) {
return getPackageManager().resolveContentProvider(authority, 0) != null;
}
void showWorkspaceSearchAndHotseat() {
if (mWorkspace != null) mWorkspace.setAlpha(1f);
if (mHotseat != null) mHotseat.setAlpha(1f);
if (mPageIndicator != null) mPageIndicator.setAlpha(1f);
if (mSearchDropTargetBar != null) mSearchDropTargetBar.animateToState(
SearchDropTargetBar.State.SEARCH_BAR, 0);
}
void hideWorkspaceSearchAndHotseat() {
if (mWorkspace != null) mWorkspace.setAlpha(0f);
if (mHotseat != null) mHotseat.setAlpha(0f);
if (mPageIndicator != null) mPageIndicator.setAlpha(0f);
if (mSearchDropTargetBar != null) mSearchDropTargetBar.animateToState(
SearchDropTargetBar.State.INVISIBLE, 0);
}
// TODO: These method should be a part of LauncherSearchCallback
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ItemInfo createAppDragInfo(Intent appLaunchIntent) {
@@ -4706,8 +4654,3 @@ public class Launcher extends Activity
}
}
}
interface DebugIntents {
static final String DELETE_DATABASE = "com.android.launcher3.action.DELETE_DATABASE";
static final String MIGRATE_DATABASE = "com.android.launcher3.action.MIGRATE_DATABASE";
}
+19 -92
View File
@@ -21,10 +21,7 @@ import android.animation.PropertyValuesHolder;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.UserManager;
@@ -42,7 +39,6 @@ import android.view.accessibility.AccessibilityManager;
import com.android.launcher3.util.Thunk;
class LauncherClings implements OnClickListener, OnKeyListener {
private static final String MIGRATION_CLING_DISMISSED_KEY = "cling_gel.migration.dismissed";
private static final String WORKSPACE_CLING_DISMISSED_KEY = "cling_gel.workspace.dismissed";
private static final String TAG_CROP_TOP_AND_SIDES = "crop_bg_top_and_sides";
@@ -62,24 +58,7 @@ class LauncherClings implements OnClickListener, OnKeyListener {
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.cling_dismiss_migration_use_default) {
// Disable the migration cling
dismissMigrationCling();
} else if (id == R.id.cling_dismiss_migration_copy_apps) {
// Copy the shortcuts from the old database
LauncherModel model = mLauncher.getModel();
model.resetLoadedState(false, true);
model.startLoader(PagedView.INVALID_RESTORE_PAGE,
LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE
| LauncherModel.LOADER_FLAG_MIGRATE_SHORTCUTS);
// Set the flag to skip the folder cling
SharedPreferences.Editor editor = Utilities.getPrefs(mLauncher).edit();
editor.putBoolean(Launcher.USER_HAS_MIGRATED, true);
editor.apply();
// Disable the migration cling
dismissMigrationCling();
} else if (id == R.id.cling_dismiss_longpress_info) {
if (v.getId() == R.id.cling_dismiss_longpress_info) {
dismissLongPressCling();
}
}
@@ -98,40 +77,6 @@ class LauncherClings implements OnClickListener, OnKeyListener {
return false;
}
/**
* Shows the migration cling.
*
* This flow is mutually exclusive with showFirstRunCling, and only runs if this Launcher
* package was not preinstalled and there exists a db to migrate from.
*/
public void showMigrationCling() {
mLauncher.onLauncherClingShown();
mIsVisible = true;
mLauncher.hideWorkspaceSearchAndHotseat();
ViewGroup root = (ViewGroup) mLauncher.findViewById(R.id.launcher);
View inflated = mInflater.inflate(R.layout.migration_cling, root);
inflated.findViewById(R.id.cling_dismiss_migration_copy_apps).setOnClickListener(this);
inflated.findViewById(R.id.cling_dismiss_migration_use_default).setOnClickListener(this);
}
private void dismissMigrationCling() {
mLauncher.showWorkspaceSearchAndHotseat();
Runnable dismissCb = new Runnable() {
public void run() {
Runnable cb = new Runnable() {
public void run() {
// Show the longpress cling next
showLongPressCling(false);
}
};
dismissCling(mLauncher.findViewById(R.id.migration_cling), cb,
MIGRATION_CLING_DISMISSED_KEY, DISMISS_CLING_DURATION);
}
};
mLauncher.getWorkspace().post(dismissCb);
}
public void showLongPressCling(boolean showWelcome) {
mIsVisible = true;
ViewGroup root = (ViewGroup) mLauncher.findViewById(R.id.launcher);
@@ -197,44 +142,28 @@ class LauncherClings implements OnClickListener, OnKeyListener {
@Thunk void dismissLongPressCling() {
Runnable dismissCb = new Runnable() {
public void run() {
Runnable cb = new Runnable() {
public void run() {
mLauncher.onLauncherClingDismissed();
}
};
dismissCling(mLauncher.findViewById(R.id.longpress_cling), cb,
WORKSPACE_CLING_DISMISSED_KEY, DISMISS_CLING_DURATION);
final View cling = mLauncher.findViewById(R.id.longpress_cling);
// To catch cases where siblings of top-level views are made invisible, just check whether
// the cling is directly set to GONE before dismissing it.
if (cling != null && cling.getVisibility() != View.GONE) {
final Runnable cleanUpClingCb = new Runnable() {
public void run() {
cling.setVisibility(View.GONE);
mLauncher.getSharedPrefs().edit()
.putBoolean(WORKSPACE_CLING_DISMISSED_KEY, true)
.apply();
mIsVisible = false;
mLauncher.onLauncherClingDismissed();
}
};
cling.animate().alpha(0).setDuration(DISMISS_CLING_DURATION)
.withEndAction(cleanUpClingCb);
}
}
};
mLauncher.getWorkspace().post(dismissCb);
}
/** Hides the specified Cling */
@Thunk void dismissCling(final View cling, final Runnable postAnimationCb,
final String flag, int duration) {
// To catch cases where siblings of top-level views are made invisible, just check whether
// the cling is directly set to GONE before dismissing it.
if (cling != null && cling.getVisibility() != View.GONE) {
final Runnable cleanUpClingCb = new Runnable() {
public void run() {
cling.setVisibility(View.GONE);
mLauncher.getSharedPrefs().edit()
.putBoolean(flag, true)
.apply();
mIsVisible = false;
if (postAnimationCb != null) {
postAnimationCb.run();
}
}
};
if (duration <= 0) {
cleanUpClingCb.run();
} else {
cling.animate().alpha(0).setDuration(duration).withEndAction(cleanUpClingCb);
}
}
}
public boolean isVisible() {
return mIsVisible;
}
@@ -269,10 +198,8 @@ class LauncherClings implements OnClickListener, OnKeyListener {
}
public boolean shouldShowFirstRunOrMigrationClings() {
SharedPreferences sharedPrefs = mLauncher.getSharedPrefs();
return areClingsEnabled() &&
!sharedPrefs.getBoolean(WORKSPACE_CLING_DISMISSED_KEY, false) &&
!sharedPrefs.getBoolean(MIGRATION_CLING_DISMISSED_KEY, false);
!mLauncher.getSharedPrefs().getBoolean(WORKSPACE_CLING_DISMISSED_KEY, false);
}
public static void markFirstRunClingDismissed(Context ctx) {
+8 -25
View File
@@ -97,10 +97,6 @@ public class LauncherModel extends BroadcastReceiver
static final String TAG = "Launcher.Model";
public static final int LOADER_FLAG_NONE = 0;
public static final int LOADER_FLAG_CLEAR_WORKSPACE = 1 << 0;
public static final int LOADER_FLAG_MIGRATE_SHORTCUTS = 1 << 1;
private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons
private static final long INVALID_SCREEN_ID = -1L;
@@ -1221,10 +1217,6 @@ public class LauncherModel extends BroadcastReceiver
}
public void startLoader(int synchronousBindPage) {
startLoader(synchronousBindPage, LOADER_FLAG_NONE);
}
public void startLoader(int synchronousBindPage, int loadFlags) {
// Enable queue before starting loader. It will get disabled in Launcher#finishBindingItems
InstallShortcutReceiver.enableInstallQueue();
synchronized (mLock) {
@@ -1240,7 +1232,7 @@ public class LauncherModel extends BroadcastReceiver
// If there is already one running, tell it to stop.
stopLoaderLocked();
mLoaderTask = new LoaderTask(mApp.getContext(), loadFlags, synchronousBindPage);
mLoaderTask = new LoaderTask(mApp.getContext(), synchronousBindPage);
if (synchronousBindPage != PagedView.INVALID_RESTORE_PAGE
&& mAllAppsLoaded && mWorkspaceLoaded && !mIsLoaderTaskRunning) {
mLoaderTask.runBindSynchronousPage(synchronousBindPage);
@@ -1299,11 +1291,9 @@ public class LauncherModel extends BroadcastReceiver
@Thunk boolean mIsLoadingAndBindingWorkspace;
private boolean mStopped;
@Thunk boolean mLoadAndBindStepFinished;
private int mFlags;
LoaderTask(Context context, int flags, int pageToBindFirst) {
LoaderTask(Context context, int pageToBindFirst) {
mContext = context;
mFlags = flags;
mPageToBindFirst = pageToBindFirst;
}
@@ -1599,29 +1589,22 @@ public class LauncherModel extends BroadcastReceiver
int countX = profile.numColumns;
int countY = profile.numRows;
boolean clearDb = false;
if (GridSizeMigrationTask.ENABLED &&
!GridSizeMigrationTask.migrateGridIfNeeded(mContext)) {
// Migration failed. Clear workspace.
mFlags = mFlags | LOADER_FLAG_CLEAR_WORKSPACE;
clearDb = true;
}
if ((mFlags & LOADER_FLAG_CLEAR_WORKSPACE) != 0) {
if (clearDb) {
Log.d(TAG, "loadWorkspace: resetting launcher database");
LauncherSettings.Settings.call(contentResolver,
LauncherSettings.Settings.METHOD_DELETE_DB);
}
if ((mFlags & LOADER_FLAG_MIGRATE_SHORTCUTS) != 0) {
// append the user's Launcher2 shortcuts
Log.d(TAG, "loadWorkspace: migrating from launcher2");
LauncherSettings.Settings.call(contentResolver,
LauncherSettings.Settings.METHOD_MIGRATE_LAUNCHER2_SHORTCUTS);
} else {
// Make sure the default workspace is loaded
Log.d(TAG, "loadWorkspace: loading default favorites");
LauncherSettings.Settings.call(contentResolver,
LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES);
}
Log.d(TAG, "loadWorkspace: loading default favorites");
LauncherSettings.Settings.call(contentResolver,
LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES);
synchronized (sBgLock) {
clearSBgDataStructures();
@@ -363,13 +363,6 @@ public class LauncherProvider extends ContentProvider {
loadDefaultFavoritesIfNecessary();
return null;
}
case LauncherSettings.Settings.METHOD_MIGRATE_LAUNCHER2_SHORTCUTS: {
mOpenHelper.migrateLauncher2Shortcuts(mOpenHelper.getWritableDatabase(),
Uri.parse(getContext().getString(R.string.old_launcher_provider_uri)));
Utilities.getPrefs(getContext()).edit().putBoolean(EMPTY_DATABASE_CREATED, false)
.commit();
return null;
}
case LauncherSettings.Settings.METHOD_UPDATE_FOLDER_ITEMS_RANK: {
mOpenHelper.updateFolderItemsRank(mOpenHelper.getWritableDatabase(), false);
return null;
@@ -1033,278 +1026,6 @@ public class LauncherProvider extends ContentProvider {
return count;
}
@Thunk void migrateLauncher2Shortcuts(SQLiteDatabase db, Uri uri) {
final ContentResolver resolver = mContext.getContentResolver();
Cursor c = null;
int count = 0;
int curScreen = 0;
try {
c = resolver.query(uri, null, null, null, "title ASC");
} catch (Exception e) {
// Ignore
}
// We already have a favorites database in the old provider
if (c != null) {
try {
if (c.getCount() > 0) {
final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID);
final int intentIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.INTENT);
final int titleIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE);
final int iconIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON);
final int iconPackageIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_PACKAGE);
final int iconResourceIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_RESOURCE);
final int containerIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.CONTAINER);
final int itemTypeIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE);
final int screenIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.SCREEN);
final int cellXIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLX);
final int cellYIndex
= c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLY);
final int profileIndex
= c.getColumnIndex(LauncherSettings.Favorites.PROFILE_ID);
int i = 0;
int curX = 0;
int curY = 0;
final LauncherAppState app = LauncherAppState.getInstance();
final InvariantDeviceProfile profile = app.getInvariantDeviceProfile();
final int width = (int) profile.numColumns;
final int height = (int) profile.numRows;
final int hotseatWidth = (int) profile.numHotseatIcons;
final HashSet<String> seenIntents = new HashSet<String>(c.getCount());
final ArrayList<ContentValues> shortcuts = new ArrayList<ContentValues>();
final ArrayList<ContentValues> folders = new ArrayList<ContentValues>();
final SparseArray<ContentValues> hotseat = new SparseArray<ContentValues>();
while (c.moveToNext()) {
final int itemType = c.getInt(itemTypeIndex);
if (itemType != Favorites.ITEM_TYPE_APPLICATION
&& itemType != Favorites.ITEM_TYPE_SHORTCUT
&& itemType != Favorites.ITEM_TYPE_FOLDER) {
continue;
}
final int cellX = c.getInt(cellXIndex);
final int cellY = c.getInt(cellYIndex);
final int screen = c.getInt(screenIndex);
int container = c.getInt(containerIndex);
final String intentStr = c.getString(intentIndex);
UserManagerCompat userManager = UserManagerCompat.getInstance(mContext);
UserHandleCompat userHandle;
final long userSerialNumber;
if (profileIndex != -1 && !c.isNull(profileIndex)) {
userSerialNumber = c.getInt(profileIndex);
userHandle = userManager.getUserForSerialNumber(userSerialNumber);
} else {
// Default to the serial number of this user, for older
// shortcuts.
userHandle = UserHandleCompat.myUserHandle();
userSerialNumber = userManager.getSerialNumberForUser(userHandle);
}
if (userHandle == null) {
Log.d(TAG, "skipping deleted user");
continue;
}
if (itemType != Favorites.ITEM_TYPE_FOLDER) {
final Intent intent;
final ComponentName cn;
try {
intent = Intent.parseUri(intentStr, 0);
} catch (URISyntaxException e) {
// bogus intent?
Log.d(TAG, "skipping invalid intent uri");
continue;
}
cn = intent.getComponent();
if (TextUtils.isEmpty(intentStr)) {
// no intent? no icon
Log.d(TAG, "skipping empty intent");
continue;
} else if (cn != null &&
!LauncherModel.isValidPackageActivity(mContext, cn,
userHandle)) {
// component no longer exists.
Log.d(TAG, "skipping item whose component no longer exists.");
continue;
} else if (container ==
LauncherSettings.Favorites.CONTAINER_DESKTOP) {
// Dedupe icons directly on the workspace
// Canonicalize
// the Play Store sets the package parameter, but Launcher
// does not, so we clear that out to keep them the same.
// Also ignore intent flags for the purposes of deduping.
intent.setPackage(null);
int flags = intent.getFlags();
intent.setFlags(0);
final String key = intent.toUri(0);
intent.setFlags(flags);
if (seenIntents.contains(key)) {
Log.d(TAG, "skipping duplicate");
continue;
} else {
seenIntents.add(key);
}
}
}
ContentValues values = new ContentValues(c.getColumnCount());
values.put(LauncherSettings.Favorites._ID, c.getInt(idIndex));
values.put(LauncherSettings.Favorites.INTENT, intentStr);
values.put(LauncherSettings.Favorites.TITLE, c.getString(titleIndex));
values.put(LauncherSettings.Favorites.ICON, c.getBlob(iconIndex));
values.put(LauncherSettings.Favorites.ICON_PACKAGE,
c.getString(iconPackageIndex));
values.put(LauncherSettings.Favorites.ICON_RESOURCE,
c.getString(iconResourceIndex));
values.put(LauncherSettings.Favorites.ITEM_TYPE, itemType);
values.put(LauncherSettings.Favorites.APPWIDGET_ID, -1);
values.put(LauncherSettings.Favorites.PROFILE_ID, userSerialNumber);
if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
hotseat.put(screen, values);
}
if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) {
// In a folder or in the hotseat, preserve position
values.put(LauncherSettings.Favorites.SCREEN, screen);
values.put(LauncherSettings.Favorites.CELLX, cellX);
values.put(LauncherSettings.Favorites.CELLY, cellY);
} else {
// For items contained directly on one of the workspace screen,
// we'll determine their location (screen, x, y) in a second pass.
}
values.put(LauncherSettings.Favorites.CONTAINER, container);
if (itemType != Favorites.ITEM_TYPE_FOLDER) {
shortcuts.add(values);
} else {
folders.add(values);
}
}
// Now that we have all the hotseat icons, let's go through them left-right
// and assign valid locations for them in the new hotseat
final int N = hotseat.size();
for (int idx=0; idx<N; idx++) {
int hotseatX = hotseat.keyAt(idx);
ContentValues values = hotseat.valueAt(idx);
if (hotseatX == profile.hotseatAllAppsRank) {
// let's drop this in the next available hole in the hotseat
while (++hotseatX < hotseatWidth) {
if (hotseat.get(hotseatX) == null) {
// found a spot! move it here
values.put(LauncherSettings.Favorites.SCREEN,
hotseatX);
break;
}
}
}
if (hotseatX >= hotseatWidth) {
// no room for you in the hotseat? it's off to the desktop with you
values.put(LauncherSettings.Favorites.CONTAINER,
Favorites.CONTAINER_DESKTOP);
}
}
final ArrayList<ContentValues> allItems = new ArrayList<ContentValues>();
// Folders first
allItems.addAll(folders);
// Then shortcuts
allItems.addAll(shortcuts);
// Layout all the folders
for (ContentValues values: allItems) {
if (values.getAsInteger(LauncherSettings.Favorites.CONTAINER) !=
LauncherSettings.Favorites.CONTAINER_DESKTOP) {
// Hotseat items and folder items have already had their
// location information set. Nothing to be done here.
continue;
}
values.put(LauncherSettings.Favorites.SCREEN, curScreen);
values.put(LauncherSettings.Favorites.CELLX, curX);
values.put(LauncherSettings.Favorites.CELLY, curY);
curX = (curX + 1) % width;
if (curX == 0) {
curY = (curY + 1);
}
// Leave the last row of icons blank on every screen
if (curY == height - 1) {
curScreen = (int) generateNewScreenId();
curY = 0;
}
}
if (allItems.size() > 0) {
db.beginTransaction();
try {
for (ContentValues row: allItems) {
if (row == null) continue;
if (dbInsertAndCheck(this, db, Favorites.TABLE_NAME, null, row)
< 0) {
return;
} else {
count++;
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
db.beginTransaction();
try {
for (i=0; i<=curScreen; i++) {
final ContentValues values = new ContentValues();
values.put(LauncherSettings.WorkspaceScreens._ID, i);
values.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i);
if (dbInsertAndCheck(this, db, WorkspaceScreens.TABLE_NAME, null, values)
< 0) {
return;
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
updateFolderItemsRank(db, false);
}
} finally {
c.close();
}
}
Log.d(TAG, "migrated " + count + " icons from Launcher2 into "
+ (curScreen+1) + " screens");
// Update max IDs; very important since we just grabbed IDs from another database
mMaxItemId = initializeMaxItemId(db);
mMaxScreenId = initializeMaxScreenId(db);
if (LOGD) Log.d(TAG, "mMaxItemId: " + mMaxItemId + " mMaxScreenId: " + mMaxScreenId);
}
}
/**
@@ -291,7 +291,6 @@ public class LauncherSettings {
public static final String METHOD_DELETE_DB = "delete_db";
public static final String METHOD_LOAD_DEFAULT_FAVORITES = "load_default_favorites";
public static final String METHOD_MIGRATE_LAUNCHER2_SHORTCUTS = "migrate_l2_shortcuts";
public static final String METHOD_SET_EXTRACTED_COLORS_AND_WALLPAPER_ID =
"set_extracted_colors_and_wallpaper_id_setting";