summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/LauncherBackupAgentHelper.java
blob: c2ab20a6292db1f5f5d8d3c8d554253eaec1aae2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * Copyright (C) 2013 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.
 */

package com.android.launcher3;

import android.app.backup.BackupAgentHelper;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.ParcelFileDescriptor;
import android.util.Log;

import com.android.launcher3.model.GridSizeMigrationTask;

import java.io.IOException;

public class LauncherBackupAgentHelper extends BackupAgentHelper {

    private static final String TAG = "LauncherBAHelper";

    private static final String KEY_LAST_NOTIFIED_TIME = "backup_manager_last_notified";

    private static final String LAUNCHER_DATA_PREFIX = "L";

    static final boolean VERBOSE = false;
    static final boolean DEBUG = false;

    /**
     * Notify the backup manager that out database is dirty.
     *
     * <P>This does not force an immediate backup.
     *
     * @param context application context
     */
    public static void dataChanged(Context context) {
        dataChanged(context, 0);
    }

    /**
     * Notify the backup manager that out database is dirty.
     *
     * <P>This does not force an immediate backup.
     *
     * @param context application context
     * @param throttleMs duration in ms for which two consecutive calls to backup manager should
     *                   not be made.
     */
    public static void dataChanged(Context context, long throttleMs) {
        SharedPreferences prefs = Utilities.getPrefs(context);
        long now = System.currentTimeMillis();
        long lastTime = prefs.getLong(KEY_LAST_NOTIFIED_TIME, 0);

        // User can manually change the system time, which could lead to now < lastTime.
        // Re-backup in that case, as the backup will have a wrong lastModifiedTime.
        if (now < lastTime || now >= (lastTime + throttleMs)) {
            BackupManager.dataChanged(context.getPackageName());
            prefs.edit().putLong(KEY_LAST_NOTIFIED_TIME, now).apply();
        }
    }

    private LauncherBackupHelper mHelper;

    @Override
    public void onCreate() {
        super.onCreate();
        mHelper = new LauncherBackupHelper(this);
        addHelper(LAUNCHER_DATA_PREFIX, mHelper);
    }

    @Override
    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
            throws IOException {
        if (!Utilities.ATLEAST_LOLLIPOP) {
            // No restore for old devices.
            Log.i(TAG, "You shall not pass!!!");
            Log.d(TAG, "Restore is only supported on devices running Lollipop and above.");
            return;
        }

        // Clear dB before restore
        LauncherSettings.Settings.call(getContentResolver(),
                LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB);

        boolean hasData;
        try {
            super.onRestore(data, appVersionCode, newState);
            // If no favorite was migrated, clear the data and start fresh.
            final Cursor c = getContentResolver().query(
                    LauncherSettings.Favorites.CONTENT_URI, null, null, null, null);
            hasData = c.moveToNext();
            c.close();
        } catch (Exception e) {
            // If the restore fails, we should do a fresh start.
            Log.e(TAG, "Restore failed", e);
            hasData = false;
        }

        if (hasData && mHelper.restoreSuccessful) {
            LauncherSettings.Settings.call(getContentResolver(),
                    LauncherSettings.Settings.METHOD_CLEAR_EMPTY_DB_FLAG);
            LauncherClings.markFirstRunClingDismissed(this);

            // Rank was added in v4.
            if (mHelper.restoredBackupVersion <= 3) {
                LauncherSettings.Settings.call(getContentResolver(),
                        LauncherSettings.Settings.METHOD_UPDATE_FOLDER_ITEMS_RANK);
            }

            if (GridSizeMigrationTask.ENABLED && mHelper.shouldAttemptWorkspaceMigration()) {
                GridSizeMigrationTask.markForMigration(getApplicationContext(),
                        mHelper.widgetSizes, mHelper.migrationCompatibleProfileData);
            }

            LauncherSettings.Settings.call(getContentResolver(),
                    LauncherSettings.Settings.METHOD_CONVERT_SHORTCUTS_TO_ACTIVITIES);
        } else {
            if (VERBOSE) Log.v(TAG, "Nothing was restored, clearing DB");
            LauncherSettings.Settings.call(getContentResolver(),
                    LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB);
        }
    }
}