BackupHandler.java revision c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13
1f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov/*
2f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * Copyright (C) 2017 The Android Open Source Project
3f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov *
4f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * Licensed under the Apache License, Version 2.0 (the "License");
5f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * you may not use this file except in compliance with the License.
6f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * You may obtain a copy of the License at
7f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov *
8f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov *      http://www.apache.org/licenses/LICENSE-2.0
9f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov *
10f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * Unless required by applicable law or agreed to in writing, software
11f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * distributed under the License is distributed on an "AS IS" BASIS,
12f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * See the License for the specific language governing permissions and
14f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * limitations under the License
15f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov */
16f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
17f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovpackage com.android.server.backup.internal;
18f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
19f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.app.AlarmManager;
20f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.app.backup.RestoreSet;
21f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.content.Intent;
22f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.Handler;
23f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.Looper;
24f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.Message;
25f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.RemoteException;
26f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.UserHandle;
27f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.util.EventLog;
28f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.util.Pair;
29f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.util.Slog;
3021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
31f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.internal.backup.IBackupTransport;
32f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.EventLogTags;
33f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.BackupRestoreTask;
34f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.RefactoredBackupManagerService;
35f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.fullbackup.PerformAdbBackupTask;
36f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.fullbackup.PerformFullTransportBackupTask;
37f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.AdbBackupParams;
38f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.AdbParams;
39f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.AdbRestoreParams;
40f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.BackupParams;
41f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.ClearParams;
42f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.ClearRetryParams;
43f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.RestoreGetSetsParams;
44f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.RestoreParams;
45f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.restore.PerformAdbRestoreTask;
46f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.restore.PerformUnifiedRestoreTask;
4721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
48f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport java.io.File;
49f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport java.util.ArrayList;
50f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport java.util.Collections;
51f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport java.util.HashSet;
52f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
53f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov/**
54f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * Asynchronous backup/restore handler thread.
55f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov */
56f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovpublic class BackupHandler extends Handler {
57f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
58c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_BACKUP = 1;
59c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_ADB_BACKUP = 2;
60c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_RESTORE = 3;
61c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_CLEAR = 4;
62c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_INITIALIZE = 5;
63c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_GET_RESTORE_SETS = 6;
64c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RESTORE_SESSION_TIMEOUT = 8;
65c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_FULL_CONFIRMATION_TIMEOUT = 9;
66c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_ADB_RESTORE = 10;
67c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RETRY_INIT = 11;
68c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RETRY_CLEAR = 12;
69c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_WIDGET_BROADCAST = 13;
70c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_FULL_TRANSPORT_BACKUP = 14;
71c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_REQUEST_BACKUP = 15;
72c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_SCHEDULE_BACKUP_PACKAGE = 16;
73c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_BACKUP_OPERATION_TIMEOUT = 17;
74c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RESTORE_OPERATION_TIMEOUT = 18;
75c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    // backup task state machine tick
76c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_BACKUP_RESTORE_STEP = 20;
77c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_OP_COMPLETE = 21;
78c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov
79f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    private RefactoredBackupManagerService backupManagerService;
80f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
81f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    public BackupHandler(
8221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            RefactoredBackupManagerService backupManagerService, Looper looper) {
83f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        super(looper);
84f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        this.backupManagerService = backupManagerService;
85f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    }
86f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
87f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    public void handleMessage(Message msg) {
88f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
89f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        switch (msg.what) {
90c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_BACKUP: {
91d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                backupManagerService.setLastBackupPass(System.currentTimeMillis());
9221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
9321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                IBackupTransport transport =
94d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getTransportManager().getCurrentTransportBinder();
9521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (transport == null) {
9621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Slog.v(RefactoredBackupManagerService.TAG,
9721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            "Backup requested but no transport available");
98d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    synchronized (backupManagerService.getQueueLock()) {
99d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setBackupRunning(false);
10021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
101d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    backupManagerService.getWakelock().release();
10221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    break;
103f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
10421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
10521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // snapshot the pending-backup set and work on that
10621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ArrayList<BackupRequest> queue = new ArrayList<>();
107d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                File oldJournal = backupManagerService.getJournal();
108d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getQueueLock()) {
10921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // Do we have any work to do?  Construct the work queue
11021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // then release the synchronization lock to actually run
11121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // the backup.
112d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    if (backupManagerService.getPendingBackups().size() > 0) {
113d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        for (BackupRequest b : backupManagerService.getPendingBackups().values()) {
11421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            queue.add(b);
11521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
11621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        if (RefactoredBackupManagerService.DEBUG) {
11721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            Slog.v(RefactoredBackupManagerService.TAG, "clearing pending backups");
11821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
119d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getPendingBackups().clear();
12021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
12121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Start a new backup-queue journal file too
122d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setJournal(null);
12321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
12421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
125f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
126f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
12721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // At this point, we have started a new journal file, and the old
12821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // file identity is being passed to the backup processing task.
12921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // When it completes successfully, that old journal file will be
13021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // deleted.  If we crash prior to that, the old journal is parsed
13121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // at next boot and the journaled requests fulfilled.
13221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                boolean staged = true;
13321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (queue.size() > 0) {
13421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // Spin up a backup state sequence and set it running
13521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    try {
13621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        String dirName = transport.transportDirName();
13721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        PerformBackupTask pbt = new PerformBackupTask(
13821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                backupManagerService, transport, dirName, queue,
13921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                oldJournal, null, null, Collections.<String>emptyList(), false,
14021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                false /* nonIncremental */);
141c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                        Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
14221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        sendMessage(pbtMessage);
14321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    } catch (Exception e) {
14421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // unable to ask the transport its dir name -- transient failure, since
14521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // the above check succeeded.  Try again next time.
14621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        Slog.e(RefactoredBackupManagerService.TAG,
14721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                "Transport became unavailable attempting backup"
14821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                        + " or error initializing backup task", e);
14921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        staged = false;
15021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
15121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } else {
15221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Slog.v(RefactoredBackupManagerService.TAG,
15321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            "Backup requested but nothing pending");
15421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    staged = false;
15521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
156f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
15721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (!staged) {
15821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // if we didn't actually hand off the wakelock, rewind until next time
159d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    synchronized (backupManagerService.getQueueLock()) {
160d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setBackupRunning(false);
16121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
162d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    backupManagerService.getWakelock().release();
16321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
16421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
165f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
166f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
167c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_BACKUP_RESTORE_STEP: {
16821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                try {
16921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    BackupRestoreTask task = (BackupRestoreTask) msg.obj;
17021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    if (RefactoredBackupManagerService.MORE_DEBUG) {
17121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        Slog.v(RefactoredBackupManagerService.TAG,
17221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                "Got next step for " + task + ", executing");
17321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
17421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    task.execute();
17521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } catch (ClassCastException e) {
17621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Slog.e(RefactoredBackupManagerService.TAG,
17721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            "Invalid backup task in flight, obj=" + msg.obj);
17821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
17921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
180f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
181f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
182c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_OP_COMPLETE: {
18321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                try {
18421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Pair<BackupRestoreTask, Long> taskWithResult =
18521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            (Pair<BackupRestoreTask, Long>) msg.obj;
18621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    taskWithResult.first.operationComplete(taskWithResult.second);
18721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } catch (ClassCastException e) {
18821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Slog.e(RefactoredBackupManagerService.TAG,
18921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            "Invalid completion in flight, obj=" + msg.obj);
19021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
19121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
192f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
19321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
194c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_ADB_BACKUP: {
19521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // TODO: refactor full backup to be a looper-based state machine
19621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // similar to normal backup/restore.
19721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                AdbBackupParams params = (AdbBackupParams) msg.obj;
19821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformAdbBackupTask task = new PerformAdbBackupTask(backupManagerService,
19921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.fd,
20021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.observer, params.includeApks, params.includeObbs,
20121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.includeShared, params.doWidgets, params.curPassword,
20221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.encryptPassword, params.allApps, params.includeSystem,
20321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.doCompress, params.includeKeyValue, params.packages, params.latch);
20421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new Thread(task, "adb-backup")).start();
20521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
206f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
20721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
208c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_FULL_TRANSPORT_BACKUP: {
20921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformFullTransportBackupTask task = (PerformFullTransportBackupTask) msg.obj;
21021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new Thread(task, "transport-backup")).start();
21121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
212f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
21321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
214c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_RESTORE: {
21521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                RestoreParams params = (RestoreParams) msg.obj;
21621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                Slog.d(RefactoredBackupManagerService.TAG,
21721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        "MSG_RUN_RESTORE observer=" + params.observer);
21821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
21921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformUnifiedRestoreTask task = new PerformUnifiedRestoreTask(backupManagerService,
22021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.transport,
22121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.observer, params.monitor, params.token, params.pkgInfo,
22221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.pmToken, params.isSystemRestore, params.filterSet);
22321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
224d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getPendingRestores()) {
225d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    if (backupManagerService.isRestoreInProgress()) {
22621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        if (RefactoredBackupManagerService.DEBUG) {
22721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            Slog.d(RefactoredBackupManagerService.TAG,
22821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                    "Restore in progress, queueing.");
22921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
230d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getPendingRestores().add(task);
23121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // This task will be picked up and executed when the the currently running
23221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // restore task finishes.
23321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    } else {
23421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        if (RefactoredBackupManagerService.DEBUG) {
23521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            Slog.d(RefactoredBackupManagerService.TAG, "Starting restore.");
23621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
237d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setRestoreInProgress(true);
238c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                        Message restoreMsg = obtainMessage(MSG_BACKUP_RESTORE_STEP, task);
23921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        sendMessage(restoreMsg);
24021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
241f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
24221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
24321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            }
24421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
245c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_ADB_RESTORE: {
24621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // TODO: refactor full restore to be a looper-based state machine
24721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // similar to normal backup/restore.
24821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                AdbRestoreParams params = (AdbRestoreParams) msg.obj;
24921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformAdbRestoreTask task = new PerformAdbRestoreTask(backupManagerService,
25021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.fd,
25121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.curPassword, params.encryptPassword,
25221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.observer, params.latch);
25321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new Thread(task, "adb-restore")).start();
25421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
25521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            }
25621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
257c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_CLEAR: {
25821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ClearParams params = (ClearParams) msg.obj;
25921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new PerformClearTask(backupManagerService, params.transport,
26021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.packageInfo)).run();
26121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
262f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
26321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
264c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RETRY_CLEAR: {
26521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // reenqueues if the transport remains unavailable
26621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ClearRetryParams params = (ClearRetryParams) msg.obj;
26721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                backupManagerService.clearBackupData(params.transportName, params.packageName);
26821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
269f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
270f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
271c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_INITIALIZE: {
27221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                HashSet<String> queue;
27321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
27421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // Snapshot the pending-init queue and work on that
275d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getQueueLock()) {
276d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    queue = new HashSet<>(backupManagerService.getPendingInits());
277d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    backupManagerService.getPendingInits().clear();
27821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
27921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
28021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new PerformInitializeTask(backupManagerService, queue)).run();
28121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
28221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            }
283f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
284c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RETRY_INIT: {
285d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getQueueLock()) {
28621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    backupManagerService.recordInitPendingLocked(msg.arg1 != 0, (String) msg.obj);
287d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    backupManagerService.getAlarmManager().set(AlarmManager.RTC_WAKEUP,
28821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            System.currentTimeMillis(),
289d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                            backupManagerService.getRunInitIntent());
29021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
29121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
292f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
29321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
294c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_GET_RESTORE_SETS: {
29521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // Like other async operations, this is entered with the wakelock held
29621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                RestoreSet[] sets = null;
29721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                RestoreGetSetsParams params = (RestoreGetSetsParams) msg.obj;
298f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                try {
29921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    sets = params.transport.getAvailableRestoreSets();
30021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // cache the result in the active session
30121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    synchronized (params.session) {
30221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.session.mRestoreSets = sets;
30321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
30421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    if (sets == null) {
30521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
30621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
307f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                } catch (Exception e) {
30821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Slog.e(RefactoredBackupManagerService.TAG,
30921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            "Error from transport getting set list: " + e.getMessage());
31021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } finally {
31121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    if (params.observer != null) {
31221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        try {
31321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            params.observer.restoreSetsAvailable(sets);
31421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        } catch (RemoteException re) {
31521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            Slog.e(RefactoredBackupManagerService.TAG,
31621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                    "Unable to report listing to observer");
31721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        } catch (Exception e) {
31821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            Slog.e(RefactoredBackupManagerService.TAG,
31921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                    "Restore observer threw: " + e.getMessage());
32021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
32121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
32221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
32321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // Done: reset the session timeout clock
324c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                    removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
32521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    sendEmptyMessageDelayed(
326c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                            MSG_RESTORE_SESSION_TIMEOUT,
32721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            RefactoredBackupManagerService.TIMEOUT_RESTORE_INTERVAL);
32821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
329d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    backupManagerService.getWakelock().release();
330f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
33121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
33221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            }
333f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
334c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_BACKUP_OPERATION_TIMEOUT:
335c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RESTORE_OPERATION_TIMEOUT: {
33621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                Slog.d(RefactoredBackupManagerService.TAG,
33721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        "Timeout message received for token=" + Integer.toHexString(msg.arg1));
33821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                backupManagerService.handleCancel(msg.arg1, false);
33921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
340f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
34121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
342c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RESTORE_SESSION_TIMEOUT: {
34321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                synchronized (backupManagerService) {
344d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    if (backupManagerService.getActiveRestoreSession() != null) {
34521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Client app left the restore session dangling.  We know that it
34621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // can't be in the middle of an actual restore operation because
34721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // the timeout is suspended while a restore is in progress.  Clean
34821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // up now.
34921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        Slog.w(RefactoredBackupManagerService.TAG,
35021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                "Restore session timed out; aborting");
351d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getActiveRestoreSession().markTimedOut();
352d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        post(backupManagerService.getActiveRestoreSession().new EndRestoreRunnable(
353d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                                backupManagerService,
354d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                                backupManagerService.getActiveRestoreSession()));
35521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
35621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
35721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
358f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
35921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
360c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_FULL_CONFIRMATION_TIMEOUT: {
361d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getAdbBackupRestoreConfirmations()) {
362d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    AdbParams params = backupManagerService.getAdbBackupRestoreConfirmations().get(
36321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            msg.arg1);
36421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    if (params != null) {
36521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        Slog.i(RefactoredBackupManagerService.TAG,
36621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                "Full backup/restore timed out waiting for user confirmation");
36721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
36821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Release the waiter; timeout == completion
36921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        backupManagerService.signalAdbBackupRestoreCompletion(params);
37021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
37121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Remove the token from the set
372d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getAdbBackupRestoreConfirmations().delete(msg.arg1);
37321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
37421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Report a timeout to the observer, if any
37521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        if (params.observer != null) {
37621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            try {
37721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                params.observer.onTimeout();
37821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            } catch (RemoteException e) {
379f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                            /* don't care if the app has gone away */
38021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            }
38121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
38221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    } else {
38321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        Slog.d(RefactoredBackupManagerService.TAG,
38421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                "couldn't find params for token " + msg.arg1);
38521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
386f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
38721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
388f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
38921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
390c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_WIDGET_BROADCAST: {
39121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                final Intent intent = (Intent) msg.obj;
392d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                backupManagerService.getContext().sendBroadcastAsUser(intent, UserHandle.SYSTEM);
39321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
394f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
39521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
396c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_REQUEST_BACKUP: {
39721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                BackupParams params = (BackupParams) msg.obj;
39821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (RefactoredBackupManagerService.MORE_DEBUG) {
39921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Slog.d(RefactoredBackupManagerService.TAG,
40021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            "MSG_REQUEST_BACKUP observer=" + params.observer);
40121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
40221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ArrayList<BackupRequest> kvQueue = new ArrayList<>();
40321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                for (String packageName : params.kvPackages) {
40421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    kvQueue.add(new BackupRequest(packageName));
40521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
406d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                backupManagerService.setBackupRunning(true);
407d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                backupManagerService.getWakelock().acquire();
40821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
40921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformBackupTask pbt = new PerformBackupTask(
41021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        backupManagerService,
41121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.transport, params.dirName,
41221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        kvQueue, null, params.observer, params.monitor, params.fullPackages, true,
41321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.nonIncrementalBackup);
414c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
41521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                sendMessage(pbtMessage);
41621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
417f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
41821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
419c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_SCHEDULE_BACKUP_PACKAGE: {
42021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                String pkgName = (String) msg.obj;
42121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (RefactoredBackupManagerService.MORE_DEBUG) {
42221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Slog.d(RefactoredBackupManagerService.TAG,
42321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            "MSG_SCHEDULE_BACKUP_PACKAGE " + pkgName);
42421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
42521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                backupManagerService.dataChangedImpl(pkgName);
42621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
427f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
428f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        }
429f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    }
430f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov}
431