• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.launcher3.provider;
18 
19 import android.content.ContentValues;
20 import android.content.Context;
21 import android.database.Cursor;
22 import android.database.sqlite.SQLiteDatabase;
23 import android.graphics.Point;
24 
25 import com.android.launcher3.InvariantDeviceProfile;
26 import com.android.launcher3.LauncherSettings.Favorites;
27 import com.android.launcher3.Utilities;
28 import com.android.launcher3.Workspace;
29 import com.android.launcher3.model.GridSizeMigrationTask;
30 import com.android.launcher3.util.LongArrayMap;
31 
32 import java.util.ArrayList;
33 
34 /**
35  * An extension of {@link GridSizeMigrationTask} which migrates only one screen and
36  * deletes all carry-forward items.
37  */
38 public class LossyScreenMigrationTask extends GridSizeMigrationTask {
39 
40     private final SQLiteDatabase mDb;
41 
42     private final LongArrayMap<DbEntry> mOriginalItems;
43     private final LongArrayMap<DbEntry> mUpdates;
44 
LossyScreenMigrationTask( Context context, InvariantDeviceProfile idp, SQLiteDatabase db)45     protected LossyScreenMigrationTask(
46             Context context, InvariantDeviceProfile idp, SQLiteDatabase db) {
47         // Decrease the rows count by 1
48         super(context, idp, getValidPackages(context),
49                 new Point(idp.numColumns, idp.numRows + 1),
50                 new Point(idp.numColumns, idp.numRows));
51 
52         mDb = db;
53         mOriginalItems = new LongArrayMap<>();
54         mUpdates = new LongArrayMap<>();
55     }
56 
57     @Override
queryWorkspace(String[] columns, String where)58     protected Cursor queryWorkspace(String[] columns, String where) {
59         return mDb.query(Favorites.TABLE_NAME, columns, where, null, null, null, null);
60     }
61 
62     @Override
update(DbEntry item)63     protected void update(DbEntry item) {
64         mUpdates.put(item.id, item.copy());
65     }
66 
67     @Override
loadWorkspaceEntries(long screen)68     protected ArrayList<DbEntry> loadWorkspaceEntries(long screen) {
69         ArrayList<DbEntry> result = super.loadWorkspaceEntries(screen);
70         for (DbEntry entry : result) {
71             mOriginalItems.put(entry.id, entry.copy());
72 
73             // Shift all items by 1 in y direction and mark them for update.
74             entry.cellY++;
75             mUpdates.put(entry.id, entry.copy());
76         }
77 
78         return result;
79     }
80 
migrateScreen0()81     public void migrateScreen0() {
82         migrateScreen(Workspace.FIRST_SCREEN_ID);
83 
84         ContentValues tempValues = new ContentValues();
85         for (DbEntry update : mUpdates) {
86             DbEntry org = mOriginalItems.get(update.id);
87 
88             if (org.cellX != update.cellX || org.cellY != update.cellY
89                     || org.spanX != update.spanX || org.spanY != update.spanY) {
90                 tempValues.clear();
91                 update.addToContentValues(tempValues);
92                 mDb.update(Favorites.TABLE_NAME, tempValues, "_id = ?",
93                         new String[] {Long.toString(update.id)});
94             }
95         }
96 
97         // Delete any carry over items as we are only migration a single screen.
98         for (DbEntry entry : mCarryOver) {
99             mEntryToRemove.add(entry.id);
100         }
101 
102         if (!mEntryToRemove.isEmpty()) {
103             mDb.delete(Favorites.TABLE_NAME,
104                     Utilities.createDbSelectionQuery(Favorites._ID, mEntryToRemove), null);
105         }
106     }
107 }
108