Add support for having more hotseat icons in the DB than we show
Split InvariantDeviceProfile#numHotseatIcons into two variables: numDatabaseHotseatIcons and numShownHotseatIcons. These are generally the same, but different DisplayOptions within the same GridOption can choose to show different numbers of hotseat icons while sharing the same database. numDatabaseHotseatIcons is used for all reading/writing/migrating purposes, while numShownHotseatIcons determines how many Hotseat icons to show in the UI. Test: Existing tests pass, added two new migration tests Bug: 184789479 Bug: 171917176 Change-Id: I54583504f61a47a4444b6a637ebb7e3ab31528b7
This commit is contained in:
@@ -89,7 +89,7 @@ public class HotseatEduController {
|
|||||||
ArrayList<WorkspaceItemInfo> putIntoFolder = new ArrayList<>();
|
ArrayList<WorkspaceItemInfo> putIntoFolder = new ArrayList<>();
|
||||||
|
|
||||||
//separate folders and items that can get in folders
|
//separate folders and items that can get in folders
|
||||||
for (int i = 0; i < mLauncher.getDeviceProfile().inv.numHotseatIcons; i++) {
|
for (int i = 0; i < mLauncher.getDeviceProfile().numShownHotseatIcons; i++) {
|
||||||
View view = mHotseat.getChildAt(i, 0);
|
View view = mHotseat.getChildAt(i, 0);
|
||||||
if (view == null) continue;
|
if (view == null) continue;
|
||||||
ItemInfo info = (ItemInfo) view.getTag();
|
ItemInfo info = (ItemInfo) view.getTag();
|
||||||
@@ -188,7 +188,7 @@ public class HotseatEduController {
|
|||||||
.getInt(LauncherSettings.Settings.EXTRA_VALUE);
|
.getInt(LauncherSettings.Settings.EXTRA_VALUE);
|
||||||
mNewScreens = IntArray.wrap(pageId);
|
mNewScreens = IntArray.wrap(pageId);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < mLauncher.getDeviceProfile().inv.numHotseatIcons; i++) {
|
for (int i = 0; i < mLauncher.getDeviceProfile().numShownHotseatIcons; i++) {
|
||||||
View child = mHotseat.getChildAt(i, 0);
|
View child = mHotseat.getChildAt(i, 0);
|
||||||
if (child == null || child.getTag() == null) continue;
|
if (child == null || child.getTag() == null) continue;
|
||||||
ItemInfo tag = (ItemInfo) child.getTag();
|
ItemInfo tag = (ItemInfo) child.getTag();
|
||||||
@@ -224,7 +224,7 @@ public class HotseatEduController {
|
|||||||
|
|
||||||
void showDimissTip() {
|
void showDimissTip() {
|
||||||
if (mHotseat.getShortcutsAndWidgets().getChildCount()
|
if (mHotseat.getShortcutsAndWidgets().getChildCount()
|
||||||
< mLauncher.getDeviceProfile().inv.numHotseatIcons) {
|
< mLauncher.getDeviceProfile().numShownHotseatIcons) {
|
||||||
Snackbar.show(mLauncher, R.string.hotseat_tip_gaps_filled,
|
Snackbar.show(mLauncher, R.string.hotseat_tip_gaps_filled,
|
||||||
R.string.hotseat_prediction_settings, null,
|
R.string.hotseat_prediction_settings, null,
|
||||||
() -> mLauncher.startActivity(getSettingsIntent()));
|
() -> mLauncher.startActivity(getSettingsIntent()));
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public class HotseatEduDialog extends AbstractSlideInView implements Insettable
|
|||||||
Rect padding = grid.getHotseatLayoutPadding();
|
Rect padding = grid.getHotseatLayoutPadding();
|
||||||
|
|
||||||
mSampleHotseat.getLayoutParams().height = grid.cellHeightPx;
|
mSampleHotseat.getLayoutParams().height = grid.cellHeightPx;
|
||||||
mSampleHotseat.setGridSize(grid.inv.numHotseatIcons, 1);
|
mSampleHotseat.setGridSize(grid.numShownHotseatIcons, 1);
|
||||||
mSampleHotseat.setPadding(padding.left, 0, padding.right, 0);
|
mSampleHotseat.setPadding(padding.left, 0, padding.right, 0);
|
||||||
|
|
||||||
Button turnOnBtn = findViewById(R.id.turn_predictions_on);
|
Button turnOnBtn = findViewById(R.id.turn_predictions_on);
|
||||||
@@ -178,7 +178,7 @@ public class HotseatEduDialog extends AbstractSlideInView implements Insettable
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void populatePreview(List<WorkspaceItemInfo> predictions) {
|
private void populatePreview(List<WorkspaceItemInfo> predictions) {
|
||||||
for (int i = 0; i < mLauncher.getDeviceProfile().inv.numHotseatIcons; i++) {
|
for (int i = 0; i < mLauncher.getDeviceProfile().numShownHotseatIcons; i++) {
|
||||||
WorkspaceItemInfo info = predictions.get(i);
|
WorkspaceItemInfo info = predictions.get(i);
|
||||||
PredictedAppIcon icon = PredictedAppIcon.createIcon(mSampleHotseat, info);
|
PredictedAppIcon icon = PredictedAppIcon.createIcon(mSampleHotseat, info);
|
||||||
icon.setEnabled(false);
|
icon.setEnabled(false);
|
||||||
@@ -194,7 +194,7 @@ public class HotseatEduDialog extends AbstractSlideInView implements Insettable
|
|||||||
*/
|
*/
|
||||||
public void show(List<WorkspaceItemInfo> predictions) {
|
public void show(List<WorkspaceItemInfo> predictions) {
|
||||||
if (getParent() != null
|
if (getParent() != null
|
||||||
|| predictions.size() < mLauncher.getDeviceProfile().inv.numHotseatIcons
|
|| predictions.size() < mLauncher.getDeviceProfile().numShownHotseatIcons
|
||||||
|| mHotseatEduController == null) {
|
|| mHotseatEduController == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,10 +33,10 @@ import android.view.ViewGroup;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.android.launcher3.DeviceProfile;
|
||||||
import com.android.launcher3.DragSource;
|
import com.android.launcher3.DragSource;
|
||||||
import com.android.launcher3.DropTarget;
|
import com.android.launcher3.DropTarget;
|
||||||
import com.android.launcher3.Hotseat;
|
import com.android.launcher3.Hotseat;
|
||||||
import com.android.launcher3.InvariantDeviceProfile;
|
|
||||||
import com.android.launcher3.LauncherSettings;
|
import com.android.launcher3.LauncherSettings;
|
||||||
import com.android.launcher3.R;
|
import com.android.launcher3.R;
|
||||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||||
@@ -68,7 +68,7 @@ import java.util.stream.Collectors;
|
|||||||
* pinning of predicted apps and manages replacement of predicted apps with user drag.
|
* pinning of predicted apps and manages replacement of predicted apps with user drag.
|
||||||
*/
|
*/
|
||||||
public class HotseatPredictionController implements DragController.DragListener,
|
public class HotseatPredictionController implements DragController.DragListener,
|
||||||
SystemShortcut.Factory<QuickstepLauncher>, InvariantDeviceProfile.OnIDPChangeListener,
|
SystemShortcut.Factory<QuickstepLauncher>, DeviceProfile.OnDeviceProfileChangeListener,
|
||||||
DragSource, ViewGroup.OnHierarchyChangeListener {
|
DragSource, ViewGroup.OnHierarchyChangeListener {
|
||||||
|
|
||||||
private static final int FLAG_UPDATE_PAUSED = 1 << 0;
|
private static final int FLAG_UPDATE_PAUSED = 1 << 0;
|
||||||
@@ -115,10 +115,10 @@ public class HotseatPredictionController implements DragController.DragListener,
|
|||||||
public HotseatPredictionController(QuickstepLauncher launcher) {
|
public HotseatPredictionController(QuickstepLauncher launcher) {
|
||||||
mLauncher = launcher;
|
mLauncher = launcher;
|
||||||
mHotseat = launcher.getHotseat();
|
mHotseat = launcher.getHotseat();
|
||||||
mHotSeatItemsCount = mLauncher.getDeviceProfile().inv.numHotseatIcons;
|
mHotSeatItemsCount = mLauncher.getDeviceProfile().numShownHotseatIcons;
|
||||||
mLauncher.getDragController().addDragListener(this);
|
mLauncher.getDragController().addDragListener(this);
|
||||||
|
|
||||||
launcher.getDeviceProfile().inv.addOnChangeListener(this);
|
launcher.addOnDeviceProfileChangeListener(this);
|
||||||
mHotseat.getShortcutsAndWidgets().setOnHierarchyChangeListener(this);
|
mHotseat.getShortcutsAndWidgets().setOnHierarchyChangeListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +281,7 @@ public class HotseatPredictionController implements DragController.DragListener,
|
|||||||
* Unregisters callbacks and frees resources
|
* Unregisters callbacks and frees resources
|
||||||
*/
|
*/
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
mLauncher.getDeviceProfile().inv.removeOnChangeListener(this);
|
mLauncher.removeOnDeviceProfileChangeListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -446,8 +446,8 @@ public class HotseatPredictionController implements DragController.DragListener,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onIdpChanged(int changeFlags, InvariantDeviceProfile profile) {
|
public void onDeviceProfileChanged(DeviceProfile profile) {
|
||||||
this.mHotSeatItemsCount = profile.numHotseatIcons;
|
this.mHotSeatItemsCount = profile.numShownHotseatIcons;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class HotseatRestoreHelper {
|
|||||||
.getBinder(LauncherSettings.Settings.EXTRA_VALUE)) {
|
.getBinder(LauncherSettings.Settings.EXTRA_VALUE)) {
|
||||||
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
||||||
GridBackupTable backupTable = new GridBackupTable(context,
|
GridBackupTable backupTable = new GridBackupTable(context,
|
||||||
transaction.getDb(), idp.numHotseatIcons, idp.numColumns,
|
transaction.getDb(), idp.numDatabaseHotseatIcons, idp.numColumns,
|
||||||
idp.numRows);
|
idp.numRows);
|
||||||
backupTable.createCustomBackupTable(HYBRID_HOTSEAT_BACKUP_TABLE);
|
backupTable.createCustomBackupTable(HYBRID_HOTSEAT_BACKUP_TABLE);
|
||||||
transaction.commit();
|
transaction.commit();
|
||||||
@@ -69,7 +69,7 @@ public class HotseatRestoreHelper {
|
|||||||
}
|
}
|
||||||
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
||||||
GridBackupTable backupTable = new GridBackupTable(context,
|
GridBackupTable backupTable = new GridBackupTable(context,
|
||||||
transaction.getDb(), idp.numHotseatIcons, idp.numColumns,
|
transaction.getDb(), idp.numDatabaseHotseatIcons, idp.numColumns,
|
||||||
idp.numRows);
|
idp.numRows);
|
||||||
backupTable.restoreFromCustomBackupTable(HYBRID_HOTSEAT_BACKUP_TABLE, true);
|
backupTable.restoreFromCustomBackupTable(HYBRID_HOTSEAT_BACKUP_TABLE, true);
|
||||||
transaction.commit();
|
transaction.commit();
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ public class QuickstepModelDelegate extends ModelDelegate implements OnIDPChange
|
|||||||
mDataModel.extraItems.put(CONTAINER_PREDICTION, mAllAppsState.items);
|
mDataModel.extraItems.put(CONTAINER_PREDICTION, mAllAppsState.items);
|
||||||
|
|
||||||
WorkspaceItemFactory hotseatFactory =
|
WorkspaceItemFactory hotseatFactory =
|
||||||
new WorkspaceItemFactory(mApp, ums, pinnedShortcuts, mIDP.numHotseatIcons);
|
new WorkspaceItemFactory(mApp, ums, pinnedShortcuts, mIDP.numDatabaseHotseatIcons);
|
||||||
mHotseatState.items.setItems(
|
mHotseatState.items.setItems(
|
||||||
mHotseatState.storage.read(mApp.getContext(), hotseatFactory, ums.allUsers::get));
|
mHotseatState.storage.read(mApp.getContext(), hotseatFactory, ums.allUsers::get));
|
||||||
mDataModel.extraItems.put(CONTAINER_HOTSEAT_PREDICTION, mHotseatState.items);
|
mDataModel.extraItems.put(CONTAINER_HOTSEAT_PREDICTION, mHotseatState.items);
|
||||||
@@ -211,7 +211,7 @@ public class QuickstepModelDelegate extends ModelDelegate implements OnIDPChange
|
|||||||
registerPredictor(mHotseatState, apm.createAppPredictionSession(
|
registerPredictor(mHotseatState, apm.createAppPredictionSession(
|
||||||
new AppPredictionContext.Builder(context)
|
new AppPredictionContext.Builder(context)
|
||||||
.setUiSurface("hotseat")
|
.setUiSurface("hotseat")
|
||||||
.setPredictedTargetCount(mIDP.numHotseatIcons)
|
.setPredictedTargetCount(mIDP.numDatabaseHotseatIcons)
|
||||||
.setExtras(convertDataModelToAppTargetBundle(context, mDataModel))
|
.setExtras(convertDataModelToAppTargetBundle(context, mDataModel))
|
||||||
.build()));
|
.build()));
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ public class TaskbarHotseatController {
|
|||||||
mLauncher = launcher;
|
mLauncher = launcher;
|
||||||
mHotseat = mLauncher.getHotseat();
|
mHotseat = mLauncher.getHotseat();
|
||||||
mTaskbarCallbacks = taskbarCallbacks;
|
mTaskbarCallbacks = taskbarCallbacks;
|
||||||
mNumHotseatIcons = mLauncher.getDeviceProfile().inv.numHotseatIcons;
|
mNumHotseatIcons = mLauncher.getDeviceProfile().numShownHotseatIcons;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void init() {
|
protected void init() {
|
||||||
|
|||||||
@@ -175,6 +175,9 @@
|
|||||||
|
|
||||||
<!-- numAllAppsColumns defaults to GridDisplayOption.numColumns, if not specified -->
|
<!-- numAllAppsColumns defaults to GridDisplayOption.numColumns, if not specified -->
|
||||||
<attr name="numAllAppsColumns" format="integer" />
|
<attr name="numAllAppsColumns" format="integer" />
|
||||||
|
|
||||||
|
<!-- numShownHotseatIcons defaults to GridDisplayOption.numHotseatIcons, if not specified -->
|
||||||
|
<attr name="numShownHotseatIcons" format="integer" />
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<declare-styleable name="CellLayout">
|
<declare-styleable name="CellLayout">
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ public class BackupRestoreTest {
|
|||||||
{ APP_ICON, SHORTCUT, SHORTCUT, NO__ICON},
|
{ APP_ICON, SHORTCUT, SHORTCUT, NO__ICON},
|
||||||
}}, 2, OLD_WORK_PROFILE_ID);
|
}}, 2, OLD_WORK_PROFILE_ID);
|
||||||
// simulates the creation of backup upon restore
|
// simulates the creation of backup upon restore
|
||||||
new GridBackupTable(RuntimeEnvironment.application, mDb, mIdp.numHotseatIcons,
|
new GridBackupTable(RuntimeEnvironment.application, mDb, mIdp.numDatabaseHotseatIcons,
|
||||||
mIdp.numColumns, mIdp.numRows).doBackup(
|
mIdp.numColumns, mIdp.numRows).doBackup(
|
||||||
MY_OLD_PROFILE_ID, GridBackupTable.OPTION_REQUIRES_SANITIZATION);
|
MY_OLD_PROFILE_ID, GridBackupTable.OPTION_REQUIRES_SANITIZATION);
|
||||||
// reset favorites table
|
// reset favorites table
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ public class GridSizeMigrationTaskTest {
|
|||||||
mModelHelper.addItem(APP_ICON, 4, HOTSEAT, 0, 0),
|
mModelHelper.addItem(APP_ICON, 4, HOTSEAT, 0, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
mIdp.numHotseatIcons = 3;
|
mIdp.numDatabaseHotseatIcons = 3;
|
||||||
new GridSizeMigrationTask(mContext, mDb, mValidPackages, false, 5, 3)
|
new GridSizeMigrationTask(mContext, mDb, mValidPackages, false, 5, 3)
|
||||||
.migrateHotseat();
|
.migrateHotseat();
|
||||||
// First item is dropped as it has the least weight.
|
// First item is dropped as it has the least weight.
|
||||||
@@ -81,7 +81,7 @@ public class GridSizeMigrationTaskTest {
|
|||||||
mModelHelper.addItem(10, 4, HOTSEAT, 0, 0),
|
mModelHelper.addItem(10, 4, HOTSEAT, 0, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
mIdp.numHotseatIcons = 3;
|
mIdp.numDatabaseHotseatIcons = 3;
|
||||||
new GridSizeMigrationTask(mContext, mDb, mValidPackages, false, 5, 3)
|
new GridSizeMigrationTask(mContext, mDb, mValidPackages, false, 5, 3)
|
||||||
.migrateHotseat();
|
.migrateHotseat();
|
||||||
// First item is dropped as it has the least weight.
|
// First item is dropped as it has the least weight.
|
||||||
|
|||||||
+100
-4
@@ -120,7 +120,7 @@ public class GridSizeMigrationTaskV2Test {
|
|||||||
};
|
};
|
||||||
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 2, 2, testPackage7);
|
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 2, 2, testPackage7);
|
||||||
|
|
||||||
mIdp.numHotseatIcons = 4;
|
mIdp.numDatabaseHotseatIcons = 4;
|
||||||
mIdp.numColumns = 4;
|
mIdp.numColumns = 4;
|
||||||
mIdp.numRows = 4;
|
mIdp.numRows = 4;
|
||||||
GridSizeMigrationTaskV2.DbReader srcReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
GridSizeMigrationTaskV2.DbReader srcReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||||
@@ -128,16 +128,16 @@ public class GridSizeMigrationTaskV2Test {
|
|||||||
srcHotseatItems.length);
|
srcHotseatItems.length);
|
||||||
GridSizeMigrationTaskV2.DbReader destReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
GridSizeMigrationTaskV2.DbReader destReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||||
LauncherSettings.Favorites.TABLE_NAME, mContext, mValidPackages,
|
LauncherSettings.Favorites.TABLE_NAME, mContext, mValidPackages,
|
||||||
mIdp.numHotseatIcons);
|
mIdp.numDatabaseHotseatIcons);
|
||||||
GridSizeMigrationTaskV2 task = new GridSizeMigrationTaskV2(mContext, mDb, srcReader,
|
GridSizeMigrationTaskV2 task = new GridSizeMigrationTaskV2(mContext, mDb, srcReader,
|
||||||
destReader, mIdp.numHotseatIcons, new Point(mIdp.numColumns, mIdp.numRows));
|
destReader, mIdp.numDatabaseHotseatIcons, new Point(mIdp.numColumns, mIdp.numRows));
|
||||||
task.migrate();
|
task.migrate();
|
||||||
|
|
||||||
// Check hotseat items
|
// Check hotseat items
|
||||||
Cursor c = mContext.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI,
|
Cursor c = mContext.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI,
|
||||||
new String[]{LauncherSettings.Favorites.SCREEN, LauncherSettings.Favorites.INTENT},
|
new String[]{LauncherSettings.Favorites.SCREEN, LauncherSettings.Favorites.INTENT},
|
||||||
"container=" + CONTAINER_HOTSEAT, null, null, null);
|
"container=" + CONTAINER_HOTSEAT, null, null, null);
|
||||||
assertEquals(c.getCount(), mIdp.numHotseatIcons);
|
assertEquals(c.getCount(), mIdp.numDatabaseHotseatIcons);
|
||||||
int screenIndex = c.getColumnIndex(LauncherSettings.Favorites.SCREEN);
|
int screenIndex = c.getColumnIndex(LauncherSettings.Favorites.SCREEN);
|
||||||
int intentIndex = c.getColumnIndex(LauncherSettings.Favorites.INTENT);
|
int intentIndex = c.getColumnIndex(LauncherSettings.Favorites.INTENT);
|
||||||
c.moveToNext();
|
c.moveToNext();
|
||||||
@@ -186,5 +186,101 @@ public class GridSizeMigrationTaskV2Test {
|
|||||||
assertTrue(c.getString(intentIndex).contains(testPackage8));
|
assertTrue(c.getString(intentIndex).contains(testPackage8));
|
||||||
assertEquals(c.getInt(cellXIndex), 0);
|
assertEquals(c.getInt(cellXIndex), 0);
|
||||||
assertEquals(c.getInt(cellYIndex), 2);
|
assertEquals(c.getInt(cellYIndex), 2);
|
||||||
|
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void migrateToLargerHotseat() {
|
||||||
|
int[] srcHotseatItems = {
|
||||||
|
mModelHelper.addItem(APP_ICON, 0, HOTSEAT, 0, 0, testPackage1, 1, TMP_CONTENT_URI),
|
||||||
|
mModelHelper.addItem(SHORTCUT, 1, HOTSEAT, 0, 0, testPackage2, 2, TMP_CONTENT_URI),
|
||||||
|
mModelHelper.addItem(APP_ICON, 2, HOTSEAT, 0, 0, testPackage3, 3, TMP_CONTENT_URI),
|
||||||
|
mModelHelper.addItem(SHORTCUT, 3, HOTSEAT, 0, 0, testPackage4, 4, TMP_CONTENT_URI),
|
||||||
|
};
|
||||||
|
|
||||||
|
int numSrcDatabaseHotseatIcons = srcHotseatItems.length;
|
||||||
|
mIdp.numDatabaseHotseatIcons = 6;
|
||||||
|
mIdp.numColumns = 4;
|
||||||
|
mIdp.numRows = 4;
|
||||||
|
GridSizeMigrationTaskV2.DbReader srcReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||||
|
LauncherSettings.Favorites.TMP_TABLE, mContext, mValidPackages,
|
||||||
|
numSrcDatabaseHotseatIcons);
|
||||||
|
GridSizeMigrationTaskV2.DbReader destReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||||
|
LauncherSettings.Favorites.TABLE_NAME, mContext, mValidPackages,
|
||||||
|
mIdp.numDatabaseHotseatIcons);
|
||||||
|
GridSizeMigrationTaskV2 task = new GridSizeMigrationTaskV2(mContext, mDb, srcReader,
|
||||||
|
destReader, mIdp.numDatabaseHotseatIcons, new Point(mIdp.numColumns, mIdp.numRows));
|
||||||
|
task.migrate();
|
||||||
|
|
||||||
|
// Check hotseat items
|
||||||
|
Cursor c = mContext.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI,
|
||||||
|
new String[]{LauncherSettings.Favorites.SCREEN, LauncherSettings.Favorites.INTENT},
|
||||||
|
"container=" + CONTAINER_HOTSEAT, null, null, null);
|
||||||
|
assertEquals(c.getCount(), numSrcDatabaseHotseatIcons);
|
||||||
|
int screenIndex = c.getColumnIndex(LauncherSettings.Favorites.SCREEN);
|
||||||
|
int intentIndex = c.getColumnIndex(LauncherSettings.Favorites.INTENT);
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 0);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage1));
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 1);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage2));
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 2);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage3));
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 3);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage4));
|
||||||
|
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void migrateFromLargerHotseat() {
|
||||||
|
int[] srcHotseatItems = {
|
||||||
|
mModelHelper.addItem(APP_ICON, 0, HOTSEAT, 0, 0, testPackage1, 1, TMP_CONTENT_URI),
|
||||||
|
-1,
|
||||||
|
mModelHelper.addItem(SHORTCUT, 2, HOTSEAT, 0, 0, testPackage2, 2, TMP_CONTENT_URI),
|
||||||
|
mModelHelper.addItem(APP_ICON, 3, HOTSEAT, 0, 0, testPackage3, 3, TMP_CONTENT_URI),
|
||||||
|
mModelHelper.addItem(SHORTCUT, 4, HOTSEAT, 0, 0, testPackage4, 4, TMP_CONTENT_URI),
|
||||||
|
mModelHelper.addItem(APP_ICON, 5, HOTSEAT, 0, 0, testPackage5, 5, TMP_CONTENT_URI),
|
||||||
|
};
|
||||||
|
|
||||||
|
int numSrcDatabaseHotseatIcons = srcHotseatItems.length;
|
||||||
|
mIdp.numDatabaseHotseatIcons = 4;
|
||||||
|
mIdp.numColumns = 4;
|
||||||
|
mIdp.numRows = 4;
|
||||||
|
GridSizeMigrationTaskV2.DbReader srcReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||||
|
LauncherSettings.Favorites.TMP_TABLE, mContext, mValidPackages,
|
||||||
|
numSrcDatabaseHotseatIcons);
|
||||||
|
GridSizeMigrationTaskV2.DbReader destReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||||
|
LauncherSettings.Favorites.TABLE_NAME, mContext, mValidPackages,
|
||||||
|
mIdp.numDatabaseHotseatIcons);
|
||||||
|
GridSizeMigrationTaskV2 task = new GridSizeMigrationTaskV2(mContext, mDb, srcReader,
|
||||||
|
destReader, mIdp.numDatabaseHotseatIcons, new Point(mIdp.numColumns, mIdp.numRows));
|
||||||
|
task.migrate();
|
||||||
|
|
||||||
|
// Check hotseat items
|
||||||
|
Cursor c = mContext.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI,
|
||||||
|
new String[]{LauncherSettings.Favorites.SCREEN, LauncherSettings.Favorites.INTENT},
|
||||||
|
"container=" + CONTAINER_HOTSEAT, null, null, null);
|
||||||
|
assertEquals(c.getCount(), mIdp.numDatabaseHotseatIcons);
|
||||||
|
int screenIndex = c.getColumnIndex(LauncherSettings.Favorites.SCREEN);
|
||||||
|
int intentIndex = c.getColumnIndex(LauncherSettings.Favorites.INTENT);
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 0);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage1));
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 1);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage2));
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 2);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage3));
|
||||||
|
c.moveToNext();
|
||||||
|
assertEquals(c.getInt(screenIndex), 3);
|
||||||
|
assertTrue(c.getString(intentIndex).contains(testPackage4));
|
||||||
|
|
||||||
|
c.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ public class LoaderCursorTest {
|
|||||||
public void checkItemPlacement_outsideBounds() {
|
public void checkItemPlacement_outsideBounds() {
|
||||||
mIDP.numRows = 4;
|
mIDP.numRows = 4;
|
||||||
mIDP.numColumns = 4;
|
mIDP.numColumns = 4;
|
||||||
mIDP.numHotseatIcons = 3;
|
mIDP.numDatabaseHotseatIcons = 3;
|
||||||
|
|
||||||
// Item outside screen bounds are not placed
|
// Item outside screen bounds are not placed
|
||||||
assertFalse(mLoaderCursor.checkItemPlacement(
|
assertFalse(mLoaderCursor.checkItemPlacement(
|
||||||
@@ -171,7 +171,7 @@ public class LoaderCursorTest {
|
|||||||
public void checkItemPlacement_overlappingItems() {
|
public void checkItemPlacement_overlappingItems() {
|
||||||
mIDP.numRows = 4;
|
mIDP.numRows = 4;
|
||||||
mIDP.numColumns = 4;
|
mIDP.numColumns = 4;
|
||||||
mIDP.numHotseatIcons = 3;
|
mIDP.numDatabaseHotseatIcons = 3;
|
||||||
|
|
||||||
// Overlapping mItems are not placed
|
// Overlapping mItems are not placed
|
||||||
assertTrue(mLoaderCursor.checkItemPlacement(
|
assertTrue(mLoaderCursor.checkItemPlacement(
|
||||||
@@ -197,7 +197,7 @@ public class LoaderCursorTest {
|
|||||||
public void checkItemPlacement_hotseat() {
|
public void checkItemPlacement_hotseat() {
|
||||||
mIDP.numRows = 4;
|
mIDP.numRows = 4;
|
||||||
mIDP.numColumns = 4;
|
mIDP.numColumns = 4;
|
||||||
mIDP.numHotseatIcons = 3;
|
mIDP.numDatabaseHotseatIcons = 3;
|
||||||
|
|
||||||
// Hotseat mItems are only placed based on screenId
|
// Hotseat mItems are only placed based on screenId
|
||||||
assertTrue(mLoaderCursor.checkItemPlacement(
|
assertTrue(mLoaderCursor.checkItemPlacement(
|
||||||
|
|||||||
@@ -355,7 +355,7 @@ public class LauncherModelHelper {
|
|||||||
throws Exception {
|
throws Exception {
|
||||||
Context context = RuntimeEnvironment.application;
|
Context context = RuntimeEnvironment.application;
|
||||||
InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(context);
|
InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(context);
|
||||||
idp.numRows = idp.numColumns = idp.numHotseatIcons = DEFAULT_GRID_SIZE;
|
idp.numRows = idp.numColumns = idp.numDatabaseHotseatIcons = DEFAULT_GRID_SIZE;
|
||||||
idp.iconBitmapSize = DEFAULT_BITMAP_SIZE;
|
idp.iconBitmapSize = DEFAULT_BITMAP_SIZE;
|
||||||
|
|
||||||
Settings.Secure.putString(context.getContentResolver(),
|
Settings.Secure.putString(context.getContentResolver(),
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class AutoInstallsLayout {
|
|||||||
|
|
||||||
// Try with grid size and hotseat count
|
// Try with grid size and hotseat count
|
||||||
String layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES_WITH_HOSTEAT,
|
String layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES_WITH_HOSTEAT,
|
||||||
grid.numColumns, grid.numRows, grid.numHotseatIcons);
|
grid.numColumns, grid.numRows, grid.numDatabaseHotseatIcons);
|
||||||
int layoutId = targetRes.getIdentifier(layoutName, "xml", pkg);
|
int layoutId = targetRes.getIdentifier(layoutName, "xml", pkg);
|
||||||
|
|
||||||
// Try with only grid size
|
// Try with only grid size
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ public class DeviceProfile {
|
|||||||
public int folderChildDrawablePaddingPx;
|
public int folderChildDrawablePaddingPx;
|
||||||
|
|
||||||
// Hotseat
|
// Hotseat
|
||||||
|
public final int numShownHotseatIcons;
|
||||||
public int hotseatCellHeightPx;
|
public int hotseatCellHeightPx;
|
||||||
// In portrait: size = height, in landscape: size = width
|
// In portrait: size = height, in landscape: size = width
|
||||||
public int hotseatBarSizePx;
|
public int hotseatBarSizePx;
|
||||||
@@ -293,6 +294,7 @@ public class DeviceProfile {
|
|||||||
|
|
||||||
workspaceCellPaddingXPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_padding_x);
|
workspaceCellPaddingXPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_padding_x);
|
||||||
|
|
||||||
|
numShownHotseatIcons = inv.numShownHotseatIcons;
|
||||||
hotseatBarTopPaddingPx =
|
hotseatBarTopPaddingPx =
|
||||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding);
|
res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding);
|
||||||
hotseatBarBottomPaddingPx = (isTallDevice ? 0
|
hotseatBarBottomPaddingPx = (isTallDevice ? 0
|
||||||
@@ -735,7 +737,7 @@ public class DeviceProfile {
|
|||||||
// for this, we pad the left and right of the hotseat with half of the difference of a
|
// for this, we pad the left and right of the hotseat with half of the difference of a
|
||||||
// workspace cell vs a hotseat cell.
|
// workspace cell vs a hotseat cell.
|
||||||
float workspaceCellWidth = (float) widthPx / inv.numColumns;
|
float workspaceCellWidth = (float) widthPx / inv.numColumns;
|
||||||
float hotseatCellWidth = (float) widthPx / inv.numHotseatIcons;
|
float hotseatCellWidth = (float) widthPx / inv.numShownHotseatIcons;
|
||||||
int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);
|
int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);
|
||||||
mHotseatPadding.set(
|
mHotseatPadding.set(
|
||||||
hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx
|
hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx
|
||||||
|
|||||||
@@ -92,9 +92,9 @@ public class Hotseat extends CellLayout implements Insettable {
|
|||||||
mHasVerticalHotseat = hasVerticalHotseat;
|
mHasVerticalHotseat = hasVerticalHotseat;
|
||||||
InvariantDeviceProfile idp = mActivity.getDeviceProfile().inv;
|
InvariantDeviceProfile idp = mActivity.getDeviceProfile().inv;
|
||||||
if (hasVerticalHotseat) {
|
if (hasVerticalHotseat) {
|
||||||
setGridSize(1, idp.numHotseatIcons);
|
setGridSize(1, idp.numShownHotseatIcons);
|
||||||
} else {
|
} else {
|
||||||
setGridSize(idp.numHotseatIcons, 1);
|
setGridSize(idp.numShownHotseatIcons, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,14 @@ public class InvariantDeviceProfile {
|
|||||||
/**
|
/**
|
||||||
* Number of icons inside the hotseat area.
|
* Number of icons inside the hotseat area.
|
||||||
*/
|
*/
|
||||||
public int numHotseatIcons;
|
protected int numShownHotseatIcons;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of icons inside the hotseat area that is stored in the database. This is greater than
|
||||||
|
* or equal to numnShownHotseatIcons, allowing for a seamless transition between two hotseat
|
||||||
|
* sizes that share the same DB.
|
||||||
|
*/
|
||||||
|
public int numDatabaseHotseatIcons;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of columns in the all apps list.
|
* Number of columns in the all apps list.
|
||||||
@@ -165,7 +172,8 @@ public class InvariantDeviceProfile {
|
|||||||
iconBitmapSize = p.iconBitmapSize;
|
iconBitmapSize = p.iconBitmapSize;
|
||||||
iconTextSize = p.iconTextSize;
|
iconTextSize = p.iconTextSize;
|
||||||
landscapeIconTextSize = p.landscapeIconTextSize;
|
landscapeIconTextSize = p.landscapeIconTextSize;
|
||||||
numHotseatIcons = p.numHotseatIcons;
|
numShownHotseatIcons = p.numShownHotseatIcons;
|
||||||
|
numDatabaseHotseatIcons = p.numDatabaseHotseatIcons;
|
||||||
numAllAppsColumns = p.numAllAppsColumns;
|
numAllAppsColumns = p.numAllAppsColumns;
|
||||||
isScalable = p.isScalable;
|
isScalable = p.isScalable;
|
||||||
devicePaddingId = p.devicePaddingId;
|
devicePaddingId = p.devicePaddingId;
|
||||||
@@ -190,7 +198,7 @@ public class InvariantDeviceProfile {
|
|||||||
Utilities.getPrefs(context).edit().putString(KEY_IDP_GRID_NAME, newGridName).apply();
|
Utilities.getPrefs(context).edit().putString(KEY_IDP_GRID_NAME, newGridName).apply();
|
||||||
}
|
}
|
||||||
Utilities.getPrefs(context).edit()
|
Utilities.getPrefs(context).edit()
|
||||||
.putInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, numHotseatIcons)
|
.putInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, numDatabaseHotseatIcons)
|
||||||
.putString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, getPointString(numColumns, numRows))
|
.putString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, getPointString(numColumns, numRows))
|
||||||
.apply();
|
.apply();
|
||||||
|
|
||||||
@@ -229,6 +237,7 @@ public class InvariantDeviceProfile {
|
|||||||
.add(myDisplayOption);
|
.add(myDisplayOption);
|
||||||
result.iconSize = defaultDisplayOption.iconSize;
|
result.iconSize = defaultDisplayOption.iconSize;
|
||||||
result.landscapeIconSize = defaultDisplayOption.landscapeIconSize;
|
result.landscapeIconSize = defaultDisplayOption.landscapeIconSize;
|
||||||
|
result.numShownHotseatIcons = myDisplayOption.numShownHotseatIcons;
|
||||||
if (defaultDisplayOption.allAppsIconSize < myDisplayOption.allAppsIconSize) {
|
if (defaultDisplayOption.allAppsIconSize < myDisplayOption.allAppsIconSize) {
|
||||||
result.allAppsIconSize = defaultDisplayOption.allAppsIconSize;
|
result.allAppsIconSize = defaultDisplayOption.allAppsIconSize;
|
||||||
result.numAllAppsColumns = defaultDisplayOption.numAllAppsColumns;
|
result.numAllAppsColumns = defaultDisplayOption.numAllAppsColumns;
|
||||||
@@ -279,7 +288,7 @@ public class InvariantDeviceProfile {
|
|||||||
GridOption closestProfile = displayOption.grid;
|
GridOption closestProfile = displayOption.grid;
|
||||||
numRows = closestProfile.numRows;
|
numRows = closestProfile.numRows;
|
||||||
numColumns = closestProfile.numColumns;
|
numColumns = closestProfile.numColumns;
|
||||||
numHotseatIcons = closestProfile.numHotseatIcons;
|
numDatabaseHotseatIcons = closestProfile.numDatabaseHotseatIcons;
|
||||||
dbFile = closestProfile.dbFile;
|
dbFile = closestProfile.dbFile;
|
||||||
defaultLayoutId = closestProfile.defaultLayoutId;
|
defaultLayoutId = closestProfile.defaultLayoutId;
|
||||||
demoModeLayoutId = closestProfile.demoModeLayoutId;
|
demoModeLayoutId = closestProfile.demoModeLayoutId;
|
||||||
@@ -301,6 +310,7 @@ public class InvariantDeviceProfile {
|
|||||||
minCellHeight = displayOption.minCellHeight;
|
minCellHeight = displayOption.minCellHeight;
|
||||||
minCellWidth = displayOption.minCellWidth;
|
minCellWidth = displayOption.minCellWidth;
|
||||||
borderSpacing = displayOption.borderSpacing;
|
borderSpacing = displayOption.borderSpacing;
|
||||||
|
numShownHotseatIcons = Math.round(displayOption.numShownHotseatIcons);
|
||||||
numAllAppsColumns = Math.round(displayOption.numAllAppsColumns);
|
numAllAppsColumns = Math.round(displayOption.numAllAppsColumns);
|
||||||
|
|
||||||
if (Utilities.isGridOptionsEnabled(context)) {
|
if (Utilities.isGridOptionsEnabled(context)) {
|
||||||
@@ -391,7 +401,7 @@ public class InvariantDeviceProfile {
|
|||||||
numColumns != oldProfile.numColumns ||
|
numColumns != oldProfile.numColumns ||
|
||||||
numFolderColumns != oldProfile.numFolderColumns ||
|
numFolderColumns != oldProfile.numFolderColumns ||
|
||||||
numFolderRows != oldProfile.numFolderRows ||
|
numFolderRows != oldProfile.numFolderRows ||
|
||||||
numHotseatIcons != oldProfile.numHotseatIcons) {
|
numDatabaseHotseatIcons != oldProfile.numDatabaseHotseatIcons) {
|
||||||
changeFlags |= CHANGE_FLAG_GRID;
|
changeFlags |= CHANGE_FLAG_GRID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -619,7 +629,7 @@ public class InvariantDeviceProfile {
|
|||||||
private final int numFolderRows;
|
private final int numFolderRows;
|
||||||
private final int numFolderColumns;
|
private final int numFolderColumns;
|
||||||
|
|
||||||
private final int numHotseatIcons;
|
private final int numDatabaseHotseatIcons;
|
||||||
|
|
||||||
private final String dbFile;
|
private final String dbFile;
|
||||||
|
|
||||||
@@ -645,7 +655,7 @@ public class InvariantDeviceProfile {
|
|||||||
R.styleable.GridDisplayOption_defaultLayoutId, 0);
|
R.styleable.GridDisplayOption_defaultLayoutId, 0);
|
||||||
demoModeLayoutId = a.getResourceId(
|
demoModeLayoutId = a.getResourceId(
|
||||||
R.styleable.GridDisplayOption_demoModeLayoutId, defaultLayoutId);
|
R.styleable.GridDisplayOption_demoModeLayoutId, defaultLayoutId);
|
||||||
numHotseatIcons = a.getInt(
|
numDatabaseHotseatIcons = a.getInt(
|
||||||
R.styleable.GridDisplayOption_numHotseatIcons, numColumns);
|
R.styleable.GridDisplayOption_numHotseatIcons, numColumns);
|
||||||
numFolderRows = a.getInt(
|
numFolderRows = a.getInt(
|
||||||
R.styleable.GridDisplayOption_numFolderRows, numRows);
|
R.styleable.GridDisplayOption_numFolderRows, numRows);
|
||||||
@@ -673,6 +683,7 @@ public class InvariantDeviceProfile {
|
|||||||
private final float minHeightDps;
|
private final float minHeightDps;
|
||||||
private final boolean canBeDefault;
|
private final boolean canBeDefault;
|
||||||
|
|
||||||
|
private float numShownHotseatIcons;
|
||||||
private float numAllAppsColumns;
|
private float numAllAppsColumns;
|
||||||
private float minCellHeight;
|
private float minCellHeight;
|
||||||
private float minCellWidth;
|
private float minCellWidth;
|
||||||
@@ -695,6 +706,8 @@ public class InvariantDeviceProfile {
|
|||||||
minHeightDps = a.getFloat(R.styleable.ProfileDisplayOption_minHeightDps, 0);
|
minHeightDps = a.getFloat(R.styleable.ProfileDisplayOption_minHeightDps, 0);
|
||||||
canBeDefault = a.getBoolean(
|
canBeDefault = a.getBoolean(
|
||||||
R.styleable.ProfileDisplayOption_canBeDefault, false);
|
R.styleable.ProfileDisplayOption_canBeDefault, false);
|
||||||
|
numShownHotseatIcons = a.getInt(R.styleable.ProfileDisplayOption_numShownHotseatIcons,
|
||||||
|
grid.numDatabaseHotseatIcons);
|
||||||
numAllAppsColumns = a.getInt(R.styleable.ProfileDisplayOption_numAllAppsColumns,
|
numAllAppsColumns = a.getInt(R.styleable.ProfileDisplayOption_numAllAppsColumns,
|
||||||
grid.numColumns);
|
grid.numColumns);
|
||||||
|
|
||||||
@@ -725,6 +738,7 @@ public class InvariantDeviceProfile {
|
|||||||
minWidthDps = 0;
|
minWidthDps = 0;
|
||||||
minHeightDps = 0;
|
minHeightDps = 0;
|
||||||
canBeDefault = false;
|
canBeDefault = false;
|
||||||
|
numShownHotseatIcons = 0;
|
||||||
numAllAppsColumns = 0;
|
numAllAppsColumns = 0;
|
||||||
minCellHeight = 0;
|
minCellHeight = 0;
|
||||||
minCellWidth = 0;
|
minCellWidth = 0;
|
||||||
@@ -732,6 +746,7 @@ public class InvariantDeviceProfile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private DisplayOption multiply(float w) {
|
private DisplayOption multiply(float w) {
|
||||||
|
numShownHotseatIcons *= w;
|
||||||
numAllAppsColumns *= w;
|
numAllAppsColumns *= w;
|
||||||
iconSize *= w;
|
iconSize *= w;
|
||||||
landscapeIconSize *= w;
|
landscapeIconSize *= w;
|
||||||
@@ -746,6 +761,7 @@ public class InvariantDeviceProfile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private DisplayOption add(DisplayOption p) {
|
private DisplayOption add(DisplayOption p) {
|
||||||
|
numShownHotseatIcons += p.numShownHotseatIcons;
|
||||||
numAllAppsColumns += p.numAllAppsColumns;
|
numAllAppsColumns += p.numAllAppsColumns;
|
||||||
iconSize += p.iconSize;
|
iconSize += p.iconSize;
|
||||||
landscapeIconSize += p.landscapeIconSize;
|
landscapeIconSize += p.landscapeIconSize;
|
||||||
|
|||||||
@@ -618,7 +618,7 @@ public class LauncherProvider extends ContentProvider {
|
|||||||
.appendQueryParameter("version", "1")
|
.appendQueryParameter("version", "1")
|
||||||
.appendQueryParameter("gridWidth", Integer.toString(grid.numColumns))
|
.appendQueryParameter("gridWidth", Integer.toString(grid.numColumns))
|
||||||
.appendQueryParameter("gridHeight", Integer.toString(grid.numRows))
|
.appendQueryParameter("gridHeight", Integer.toString(grid.numRows))
|
||||||
.appendQueryParameter("hotseatSize", Integer.toString(grid.numHotseatIcons))
|
.appendQueryParameter("hotseatSize", Integer.toString(grid.numDatabaseHotseatIcons))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ public class AppsSearchContainerLayout extends ExtendedEditText
|
|||||||
- mAppsView.getActiveRecyclerView().getPaddingRight();
|
- mAppsView.getActiveRecyclerView().getPaddingRight();
|
||||||
|
|
||||||
int cellWidth = DeviceProfile.calculateCellWidth(rowWidth, dp.cellLayoutBorderSpacingPx,
|
int cellWidth = DeviceProfile.calculateCellWidth(rowWidth, dp.cellLayoutBorderSpacingPx,
|
||||||
dp.inv.numHotseatIcons);
|
dp.numShownHotseatIcons);
|
||||||
int iconVisibleSize = Math.round(ICON_VISIBLE_AREA_FACTOR * dp.iconSizePx);
|
int iconVisibleSize = Math.round(ICON_VISIBLE_AREA_FACTOR * dp.iconSizePx);
|
||||||
int iconPadding = cellWidth - iconVisibleSize;
|
int iconPadding = cellWidth - iconVisibleSize;
|
||||||
|
|
||||||
|
|||||||
@@ -467,7 +467,7 @@ public class LauncherPreviewRenderer extends ContextThemeWrapper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
IntArray ranks = getMissingHotseatRanks(currentWorkspaceItems,
|
IntArray ranks = getMissingHotseatRanks(currentWorkspaceItems,
|
||||||
mIdp.numHotseatIcons);
|
mDp.numShownHotseatIcons);
|
||||||
List<ItemInfo> predictions = workspaceResult.mHotseatPredictions == null
|
List<ItemInfo> predictions = workspaceResult.mHotseatPredictions == null
|
||||||
? Collections.emptyList() : workspaceResult.mHotseatPredictions.items;
|
? Collections.emptyList() : workspaceResult.mHotseatPredictions.items;
|
||||||
int count = Math.min(ranks.size(), predictions.size());
|
int count = Math.min(ranks.size(), predictions.size());
|
||||||
@@ -484,7 +484,7 @@ public class LauncherPreviewRenderer extends ContextThemeWrapper
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Add hotseat icons
|
// Add hotseat icons
|
||||||
for (int i = 0; i < mIdp.numHotseatIcons; i++) {
|
for (int i = 0; i < mDp.numShownHotseatIcons; i++) {
|
||||||
WorkspaceItemInfo info = new WorkspaceItemInfo(mWorkspaceItemInfo);
|
WorkspaceItemInfo info = new WorkspaceItemInfo(mWorkspaceItemInfo);
|
||||||
info.container = Favorites.CONTAINER_HOTSEAT;
|
info.container = Favorites.CONTAINER_HOTSEAT;
|
||||||
info.screenId = i;
|
info.screenId = i;
|
||||||
|
|||||||
@@ -893,7 +893,7 @@ public class GridSizeMigrationTask {
|
|||||||
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
|
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
|
||||||
|
|
||||||
return !gridSizeString.equals(prefs.getString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, ""))
|
return !gridSizeString.equals(prefs.getString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, ""))
|
||||||
|| idp.numHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, -1);
|
|| idp.numDatabaseHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** See {@link #migrateGridIfNeeded(Context, InvariantDeviceProfile)} */
|
/** See {@link #migrateGridIfNeeded(Context, InvariantDeviceProfile)} */
|
||||||
@@ -928,7 +928,7 @@ public class GridSizeMigrationTask {
|
|||||||
.getBinder(Settings.EXTRA_VALUE)) {
|
.getBinder(Settings.EXTRA_VALUE)) {
|
||||||
|
|
||||||
int srcHotseatCount = prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT,
|
int srcHotseatCount = prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT,
|
||||||
idp.numHotseatIcons);
|
idp.numDatabaseHotseatIcons);
|
||||||
Point sourceSize = parsePoint(prefs.getString(
|
Point sourceSize = parsePoint(prefs.getString(
|
||||||
KEY_MIGRATION_SRC_WORKSPACE_SIZE, gridSizeString));
|
KEY_MIGRATION_SRC_WORKSPACE_SIZE, gridSizeString));
|
||||||
|
|
||||||
@@ -948,10 +948,10 @@ public class GridSizeMigrationTask {
|
|||||||
|
|
||||||
HashSet<String> validPackages = getValidPackages(context);
|
HashSet<String> validPackages = getValidPackages(context);
|
||||||
// Hotseat.
|
// Hotseat.
|
||||||
if (srcHotseatCount != idp.numHotseatIcons
|
if (srcHotseatCount != idp.numDatabaseHotseatIcons
|
||||||
&& new GridSizeMigrationTask(context, transaction.getDb(), validPackages,
|
&& new GridSizeMigrationTask(context, transaction.getDb(), validPackages,
|
||||||
migrateForPreview, srcHotseatCount,
|
migrateForPreview, srcHotseatCount,
|
||||||
idp.numHotseatIcons).migrateHotseat()) {
|
idp.numDatabaseHotseatIcons).migrateHotseat()) {
|
||||||
dbChanged = true;
|
dbChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -991,7 +991,7 @@ public class GridSizeMigrationTask {
|
|||||||
// Save current configuration, so that the migration does not run again.
|
// Save current configuration, so that the migration does not run again.
|
||||||
prefs.edit()
|
prefs.edit()
|
||||||
.putString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, gridSizeString)
|
.putString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, gridSizeString)
|
||||||
.putInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, idp.numHotseatIcons)
|
.putInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, idp.numDatabaseHotseatIcons)
|
||||||
.apply();
|
.apply();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class GridSizeMigrationTaskV2 {
|
|||||||
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
|
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
|
||||||
|
|
||||||
return !gridSizeString.equals(prefs.getString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, ""))
|
return !gridSizeString.equals(prefs.getString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, ""))
|
||||||
|| idp.numHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, -1);
|
|| idp.numDatabaseHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** See {@link #migrateGridIfNeeded(Context, InvariantDeviceProfile)} */
|
/** See {@link #migrateGridIfNeeded(Context, InvariantDeviceProfile)} */
|
||||||
@@ -148,7 +148,8 @@ public class GridSizeMigrationTaskV2 {
|
|||||||
SharedPreferences prefs = Utilities.getPrefs(context);
|
SharedPreferences prefs = Utilities.getPrefs(context);
|
||||||
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
|
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
|
||||||
HashSet<String> validPackages = getValidPackages(context);
|
HashSet<String> validPackages = getValidPackages(context);
|
||||||
int srcHotseatCount = prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, idp.numHotseatIcons);
|
int srcHotseatCount = prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT,
|
||||||
|
idp.numDatabaseHotseatIcons);
|
||||||
|
|
||||||
if (migrateForPreview) {
|
if (migrateForPreview) {
|
||||||
if (!LauncherSettings.Settings.call(
|
if (!LauncherSettings.Settings.call(
|
||||||
@@ -177,11 +178,11 @@ public class GridSizeMigrationTaskV2 {
|
|||||||
DbReader destReader = new DbReader(t.getDb(),
|
DbReader destReader = new DbReader(t.getDb(),
|
||||||
migrateForPreview ? LauncherSettings.Favorites.PREVIEW_TABLE_NAME
|
migrateForPreview ? LauncherSettings.Favorites.PREVIEW_TABLE_NAME
|
||||||
: LauncherSettings.Favorites.TABLE_NAME,
|
: LauncherSettings.Favorites.TABLE_NAME,
|
||||||
context, validPackages, idp.numHotseatIcons);
|
context, validPackages, idp.numDatabaseHotseatIcons);
|
||||||
|
|
||||||
Point targetSize = new Point(idp.numColumns, idp.numRows);
|
Point targetSize = new Point(idp.numColumns, idp.numRows);
|
||||||
GridSizeMigrationTaskV2 task = new GridSizeMigrationTaskV2(context, t.getDb(),
|
GridSizeMigrationTaskV2 task = new GridSizeMigrationTaskV2(context, t.getDb(),
|
||||||
srcReader, destReader, idp.numHotseatIcons, targetSize);
|
srcReader, destReader, idp.numDatabaseHotseatIcons, targetSize);
|
||||||
task.migrate();
|
task.migrate();
|
||||||
|
|
||||||
if (!migrateForPreview) {
|
if (!migrateForPreview) {
|
||||||
@@ -202,7 +203,7 @@ public class GridSizeMigrationTaskV2 {
|
|||||||
// Save current configuration, so that the migration does not run again.
|
// Save current configuration, so that the migration does not run again.
|
||||||
prefs.edit()
|
prefs.edit()
|
||||||
.putString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, gridSizeString)
|
.putString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, gridSizeString)
|
||||||
.putInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, idp.numHotseatIcons)
|
.putInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, idp.numDatabaseHotseatIcons)
|
||||||
.apply();
|
.apply();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -410,10 +410,10 @@ public class LoaderCursor extends CursorWrapper {
|
|||||||
final GridOccupancy hotseatOccupancy =
|
final GridOccupancy hotseatOccupancy =
|
||||||
occupied.get(LauncherSettings.Favorites.CONTAINER_HOTSEAT);
|
occupied.get(LauncherSettings.Favorites.CONTAINER_HOTSEAT);
|
||||||
|
|
||||||
if (item.screenId >= mIDP.numHotseatIcons) {
|
if (item.screenId >= mIDP.numDatabaseHotseatIcons) {
|
||||||
Log.e(TAG, "Error loading shortcut " + item
|
Log.e(TAG, "Error loading shortcut " + item
|
||||||
+ " into hotseat position " + item.screenId
|
+ " into hotseat position " + item.screenId
|
||||||
+ ", position out of bounds: (0 to " + (mIDP.numHotseatIcons - 1)
|
+ ", position out of bounds: (0 to " + (mIDP.numDatabaseHotseatIcons - 1)
|
||||||
+ ")");
|
+ ")");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -429,7 +429,7 @@ public class LoaderCursor extends CursorWrapper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
final GridOccupancy occupancy = new GridOccupancy(mIDP.numHotseatIcons, 1);
|
final GridOccupancy occupancy = new GridOccupancy(mIDP.numDatabaseHotseatIcons, 1);
|
||||||
occupancy.cells[item.screenId][0] = true;
|
occupancy.cells[item.screenId][0] = true;
|
||||||
occupied.put(LauncherSettings.Favorites.CONTAINER_HOTSEAT, occupancy);
|
occupied.put(LauncherSettings.Favorites.CONTAINER_HOTSEAT, occupancy);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ public class ModelWriter {
|
|||||||
// in the hotseat
|
// in the hotseat
|
||||||
if (container == Favorites.CONTAINER_HOTSEAT) {
|
if (container == Favorites.CONTAINER_HOTSEAT) {
|
||||||
item.screenId = mHasVerticalHotseat
|
item.screenId = mHasVerticalHotseat
|
||||||
? LauncherAppState.getIDP(mContext).numHotseatIcons - cellY - 1 : cellX;
|
? LauncherAppState.getIDP(mContext).numDatabaseHotseatIcons - cellY - 1 : cellX;
|
||||||
} else {
|
} else {
|
||||||
item.screenId = screenId;
|
item.screenId = screenId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -284,8 +284,9 @@ public class ImportDataTask {
|
|||||||
insertOperations.clear();
|
insertOperations.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
IntSparseArrayMap<Object> hotseatItems = GridSizeMigrationTask.removeBrokenHotseatItems(mContext);
|
IntSparseArrayMap<Object> hotseatItems = GridSizeMigrationTask
|
||||||
int myHotseatCount = LauncherAppState.getIDP(mContext).numHotseatIcons;
|
.removeBrokenHotseatItems(mContext);
|
||||||
|
int myHotseatCount = LauncherAppState.getIDP(mContext).numDatabaseHotseatIcons;
|
||||||
if (hotseatItems.size() < myHotseatCount) {
|
if (hotseatItems.size() < myHotseatCount) {
|
||||||
// Insufficient hotseat items. Add a few more.
|
// Insufficient hotseat items. Add a few more.
|
||||||
HotseatParserCallback parserCallback = new HotseatParserCallback(
|
HotseatParserCallback parserCallback = new HotseatParserCallback(
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ public class RestoreDbTask {
|
|||||||
*/
|
*/
|
||||||
private void backupWorkspace(Context context, SQLiteDatabase db) throws Exception {
|
private void backupWorkspace(Context context, SQLiteDatabase db) throws Exception {
|
||||||
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
||||||
new GridBackupTable(context, db, idp.numHotseatIcons, idp.numColumns, idp.numRows)
|
new GridBackupTable(context, db, idp.numDatabaseHotseatIcons, idp.numColumns, idp.numRows)
|
||||||
.doBackup(getDefaultProfileId(db), GridBackupTable.OPTION_REQUIRES_SANITIZATION);
|
.doBackup(getDefaultProfileId(db), GridBackupTable.OPTION_REQUIRES_SANITIZATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ public class RestoreDbTask {
|
|||||||
@NonNull DatabaseHelper helper, @NonNull BackupManager backupManager)
|
@NonNull DatabaseHelper helper, @NonNull BackupManager backupManager)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
final InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
final InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
||||||
GridBackupTable backupTable = new GridBackupTable(context, db, idp.numHotseatIcons,
|
GridBackupTable backupTable = new GridBackupTable(context, db, idp.numDatabaseHotseatIcons,
|
||||||
idp.numColumns, idp.numRows);
|
idp.numColumns, idp.numRows);
|
||||||
if (backupTable.restoreFromRawBackupIfAvailable(getDefaultProfileId(db))) {
|
if (backupTable.restoreFromRawBackupIfAvailable(getDefaultProfileId(db))) {
|
||||||
int itemsDeleted = sanitizeDB(helper, db, backupManager);
|
int itemsDeleted = sanitizeDB(helper, db, backupManager);
|
||||||
|
|||||||
Reference in New Issue
Block a user