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
19fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinskiimport static com.android.server.backup.BackupManagerService.DEBUG;
20fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinskiimport static com.android.server.backup.BackupManagerService.MORE_DEBUG;
21fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinskiimport static com.android.server.backup.BackupManagerService.TAG;
22dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov
23f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.app.backup.RestoreSet;
24f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.content.Intent;
25f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.Handler;
26f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.Looper;
27f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.Message;
28f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.RemoteException;
29f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.os.UserHandle;
30f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.util.EventLog;
31f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.util.Pair;
32f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.util.Slog;
3321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
34f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.internal.backup.IBackupTransport;
3592892163d58b580056d38f6ca2c93fb714b9e4b8Annie Mengimport com.android.internal.util.Preconditions;
36f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.EventLogTags;
3792892163d58b580056d38f6ca2c93fb714b9e4b8Annie Mengimport com.android.server.backup.BackupAgentTimeoutParameters;
38fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinskiimport com.android.server.backup.BackupManagerService;
39f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.BackupRestoreTask;
40c31a839fd3ecc91807d735884d09fcbaf62e9244Robert Berryimport com.android.server.backup.DataChangedJournal;
41af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufinoimport com.android.server.backup.transport.TransportClient;
42af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufinoimport com.android.server.backup.TransportManager;
43f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.fullbackup.PerformAdbBackupTask;
44f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.fullbackup.PerformFullTransportBackupTask;
45f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.AdbBackupParams;
46f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.AdbParams;
47f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.AdbRestoreParams;
48f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.BackupParams;
49f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.ClearParams;
50f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.ClearRetryParams;
51f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.RestoreGetSetsParams;
52f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.params.RestoreParams;
53f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.restore.PerformAdbRestoreTask;
54f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.restore.PerformUnifiedRestoreTask;
5521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
56f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport java.util.ArrayList;
57f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport java.util.Collections;
58f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
59f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov/**
60f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov * Asynchronous backup/restore handler thread.
61f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov */
62f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovpublic class BackupHandler extends Handler {
63f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
64c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_BACKUP = 1;
65c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_ADB_BACKUP = 2;
66c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_RESTORE = 3;
67c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_CLEAR = 4;
68c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_GET_RESTORE_SETS = 6;
69c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RESTORE_SESSION_TIMEOUT = 8;
70c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_FULL_CONFIRMATION_TIMEOUT = 9;
71c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_ADB_RESTORE = 10;
72c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RETRY_INIT = 11;
73c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RETRY_CLEAR = 12;
74c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_WIDGET_BROADCAST = 13;
75c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RUN_FULL_TRANSPORT_BACKUP = 14;
76c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_REQUEST_BACKUP = 15;
77c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_SCHEDULE_BACKUP_PACKAGE = 16;
78c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_BACKUP_OPERATION_TIMEOUT = 17;
79c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_RESTORE_OPERATION_TIMEOUT = 18;
80c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    // backup task state machine tick
81c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_BACKUP_RESTORE_STEP = 20;
82c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov    public static final int MSG_OP_COMPLETE = 21;
83c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov
84fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski    private final BackupManagerService backupManagerService;
8592892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng    private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
86f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
87fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski    public BackupHandler(BackupManagerService backupManagerService, Looper looper) {
88f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        super(looper);
89f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        this.backupManagerService = backupManagerService;
9092892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng        mAgentTimeoutParameters = Preconditions.checkNotNull(
9192892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                backupManagerService.getAgentTimeoutParameters(),
9292892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                "Timeout parameters cannot be null");
93f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    }
94f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
95f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    public void handleMessage(Message msg) {
96f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
97af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino        TransportManager transportManager = backupManagerService.getTransportManager();
98f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        switch (msg.what) {
99c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_BACKUP: {
100d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                backupManagerService.setLastBackupPass(System.currentTimeMillis());
10121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
102af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                String callerLogString = "BH/MSG_RUN_BACKUP";
103af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                TransportClient transportClient =
104af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                        transportManager.getCurrentTransportClient(callerLogString);
10521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                IBackupTransport transport =
106af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                        transportClient != null
107af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                ? transportClient.connect(callerLogString)
108af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                : null;
10921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (transport == null) {
110af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                    if (transportClient != null) {
111af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                        transportManager
112af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                .disposeOfTransportClient(transportClient, callerLogString);
113af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                    }
114dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                    Slog.v(TAG, "Backup requested but no transport available");
115d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    synchronized (backupManagerService.getQueueLock()) {
116d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setBackupRunning(false);
11721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
118d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    backupManagerService.getWakelock().release();
11921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    break;
120f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
12121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
12221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // snapshot the pending-backup set and work on that
12321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ArrayList<BackupRequest> queue = new ArrayList<>();
124c31a839fd3ecc91807d735884d09fcbaf62e9244Robert Berry                DataChangedJournal oldJournal = backupManagerService.getJournal();
125d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getQueueLock()) {
12621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // Do we have any work to do?  Construct the work queue
12721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // then release the synchronization lock to actually run
12821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // the backup.
129d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    if (backupManagerService.getPendingBackups().size() > 0) {
130d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        for (BackupRequest b : backupManagerService.getPendingBackups().values()) {
13121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            queue.add(b);
13221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
133dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        if (DEBUG) {
134dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                            Slog.v(TAG, "clearing pending backups");
13521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
136d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getPendingBackups().clear();
13721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
13821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Start a new backup-queue journal file too
139d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setJournal(null);
14021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
14121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
142f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
143f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
14421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // At this point, we have started a new journal file, and the old
14521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // file identity is being passed to the backup processing task.
14621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // When it completes successfully, that old journal file will be
14721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // deleted.  If we crash prior to that, the old journal is parsed
14821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // at next boot and the journaled requests fulfilled.
14921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                boolean staged = true;
15021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (queue.size() > 0) {
15121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // Spin up a backup state sequence and set it running
15221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    try {
15321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        String dirName = transport.transportDirName();
154af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                        OnTaskFinishedListener listener =
155af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                caller ->
156af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                        transportManager
157af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                                .disposeOfTransportClient(transportClient, caller);
15821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        PerformBackupTask pbt = new PerformBackupTask(
159af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                backupManagerService, transportClient, dirName, queue,
160af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                                oldJournal, null, null, listener, Collections.emptyList(), false,
16121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                false /* nonIncremental */);
162c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                        Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
16321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        sendMessage(pbtMessage);
16421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    } catch (Exception e) {
16521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // unable to ask the transport its dir name -- transient failure, since
16621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // the above check succeeded.  Try again next time.
167dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        Slog.e(TAG, "Transport became unavailable attempting backup"
168dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                                + " or error initializing backup task", e);
16921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        staged = false;
17021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
17121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } else {
172dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                    Slog.v(TAG, "Backup requested but nothing pending");
17321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    staged = false;
17421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
175f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
17621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                if (!staged) {
177af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                    transportManager.disposeOfTransportClient(transportClient, callerLogString);
17821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // if we didn't actually hand off the wakelock, rewind until next time
179d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    synchronized (backupManagerService.getQueueLock()) {
180d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setBackupRunning(false);
18121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
182d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    backupManagerService.getWakelock().release();
18321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
18421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
185f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
186f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
187c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_BACKUP_RESTORE_STEP: {
18821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                try {
18921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    BackupRestoreTask task = (BackupRestoreTask) msg.obj;
190dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                    if (MORE_DEBUG) {
191dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        Slog.v(TAG, "Got next step for " + task + ", executing");
19221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
19321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    task.execute();
19421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } catch (ClassCastException e) {
195998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                    Slog.e(TAG, "Invalid backup/restore task in flight, obj=" + msg.obj);
19621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
19721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
198f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
199f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
200c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_OP_COMPLETE: {
20121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                try {
20221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    Pair<BackupRestoreTask, Long> taskWithResult =
20321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            (Pair<BackupRestoreTask, Long>) msg.obj;
20421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    taskWithResult.first.operationComplete(taskWithResult.second);
20521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } catch (ClassCastException e) {
206dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                    Slog.e(TAG, "Invalid completion in flight, obj=" + msg.obj);
20721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
20821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
209f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
21021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
211c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_ADB_BACKUP: {
21221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // TODO: refactor full backup to be a looper-based state machine
21321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // similar to normal backup/restore.
21421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                AdbBackupParams params = (AdbBackupParams) msg.obj;
21521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformAdbBackupTask task = new PerformAdbBackupTask(backupManagerService,
21621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.fd,
21721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.observer, params.includeApks, params.includeObbs,
21821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.includeShared, params.doWidgets, params.curPassword,
21921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.encryptPassword, params.allApps, params.includeSystem,
22021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.doCompress, params.includeKeyValue, params.packages, params.latch);
22121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new Thread(task, "adb-backup")).start();
22221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
223f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
22421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
225c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_FULL_TRANSPORT_BACKUP: {
22621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformFullTransportBackupTask task = (PerformFullTransportBackupTask) msg.obj;
22721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new Thread(task, "transport-backup")).start();
22821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
229f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
23021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
231c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_RESTORE: {
23221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                RestoreParams params = (RestoreParams) msg.obj;
233dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);
23421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
235998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                PerformUnifiedRestoreTask task =
236998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                        new PerformUnifiedRestoreTask(
237998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                backupManagerService,
238998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.transportClient,
239998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.observer,
240998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.monitor,
241998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.token,
242998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.packageInfo,
243998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.pmToken,
244998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.isSystemRestore,
245998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.filterSet,
246998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                                params.listener);
24721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
248d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getPendingRestores()) {
249d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    if (backupManagerService.isRestoreInProgress()) {
250dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        if (DEBUG) {
251dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                            Slog.d(TAG, "Restore in progress, queueing.");
25221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
253d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getPendingRestores().add(task);
25421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // This task will be picked up and executed when the the currently running
25521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // restore task finishes.
25621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    } else {
257dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        if (DEBUG) {
258dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                            Slog.d(TAG, "Starting restore.");
25921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
260d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.setRestoreInProgress(true);
261c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                        Message restoreMsg = obtainMessage(MSG_BACKUP_RESTORE_STEP, task);
26221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        sendMessage(restoreMsg);
26321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
264f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
26521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
26621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            }
26721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
268c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_ADB_RESTORE: {
26921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // TODO: refactor full restore to be a looper-based state machine
27021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // similar to normal backup/restore.
27121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                AdbRestoreParams params = (AdbRestoreParams) msg.obj;
27221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformAdbRestoreTask task = new PerformAdbRestoreTask(backupManagerService,
27321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.fd,
27421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.curPassword, params.encryptPassword,
27521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        params.observer, params.latch);
27621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                (new Thread(task, "adb-restore")).start();
27721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
27821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            }
27921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
280c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_CLEAR: {
28121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ClearParams params = (ClearParams) msg.obj;
282f93a0918b6a04b9b13780532f5ddba1cd4a3942eBernardo Rufino                Runnable task =
283f93a0918b6a04b9b13780532f5ddba1cd4a3942eBernardo Rufino                        new PerformClearTask(
284f93a0918b6a04b9b13780532f5ddba1cd4a3942eBernardo Rufino                                backupManagerService,
285f93a0918b6a04b9b13780532f5ddba1cd4a3942eBernardo Rufino                                params.transportClient,
286f93a0918b6a04b9b13780532f5ddba1cd4a3942eBernardo Rufino                                params.packageInfo,
287f93a0918b6a04b9b13780532f5ddba1cd4a3942eBernardo Rufino                                params.listener);
288f93a0918b6a04b9b13780532f5ddba1cd4a3942eBernardo Rufino                task.run();
28921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
290f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
29121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
292c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RETRY_CLEAR: {
29321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // reenqueues if the transport remains unavailable
29421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ClearRetryParams params = (ClearRetryParams) msg.obj;
29521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                backupManagerService.clearBackupData(params.transportName, params.packageName);
29621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
297f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
29821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
299c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RUN_GET_RESTORE_SETS: {
30021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                // Like other async operations, this is entered with the wakelock held
30121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                RestoreSet[] sets = null;
30221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                RestoreGetSetsParams params = (RestoreGetSetsParams) msg.obj;
303998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                String callerLogString = "BH/MSG_RUN_GET_RESTORE_SETS";
304f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                try {
305998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                    IBackupTransport transport =
306998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                            params.transportClient.connectOrThrow(callerLogString);
307998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                    sets = transport.getAvailableRestoreSets();
30821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // cache the result in the active session
30921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    synchronized (params.session) {
31012b6bafcf443723c0479d255af373df201d1ae6fBernardo Rufino                        params.session.setRestoreSets(sets);
31121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
31221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    if (sets == null) {
31321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
31421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
315f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                } catch (Exception e) {
316dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                    Slog.e(TAG, "Error from transport getting set list: " + e.getMessage());
31721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                } finally {
31821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    if (params.observer != null) {
31921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        try {
32021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            params.observer.restoreSetsAvailable(sets);
32121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        } catch (RemoteException re) {
322dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                            Slog.e(TAG, "Unable to report listing to observer");
32321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        } catch (Exception e) {
324dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                            Slog.e(TAG, "Restore observer threw: " + e.getMessage());
32521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
32621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
32721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
32821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    // Done: reset the session timeout clock
329c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                    removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
33092892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                    sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
33192892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                            mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
33221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
333998fdaa63622a8769b50a01fff14d9cc2251632fBernardo Rufino                    params.listener.onFinished(callerLogString);
334f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                }
33521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
33621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov            }
337f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov
338c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_BACKUP_OPERATION_TIMEOUT:
339c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RESTORE_OPERATION_TIMEOUT: {
340dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                Slog.d(TAG, "Timeout message received for token=" + Integer.toHexString(msg.arg1));
34121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                backupManagerService.handleCancel(msg.arg1, false);
34221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
343f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
34421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
345c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_RESTORE_SESSION_TIMEOUT: {
34621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                synchronized (backupManagerService) {
347d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    if (backupManagerService.getActiveRestoreSession() != null) {
34821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Client app left the restore session dangling.  We know that it
34921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // can't be in the middle of an actual restore operation because
35021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // the timeout is suspended while a restore is in progress.  Clean
35121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // up now.
352dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        Slog.w(TAG, "Restore session timed out; aborting");
353d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getActiveRestoreSession().markTimedOut();
354d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        post(backupManagerService.getActiveRestoreSession().new EndRestoreRunnable(
355d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                                backupManagerService,
356d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                                backupManagerService.getActiveRestoreSession()));
35721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    }
35821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
35921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
360f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
36121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
362c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_FULL_CONFIRMATION_TIMEOUT: {
363d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                synchronized (backupManagerService.getAdbBackupRestoreConfirmations()) {
364d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                    AdbParams params = backupManagerService.getAdbBackupRestoreConfirmations().get(
36521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            msg.arg1);
36621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    if (params != null) {
367dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        Slog.i(TAG, "Full backup/restore timed out waiting for user confirmation");
36821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
36921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Release the waiter; timeout == completion
37021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        backupManagerService.signalAdbBackupRestoreCompletion(params);
37121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
37221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Remove the token from the set
373d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                        backupManagerService.getAdbBackupRestoreConfirmations().delete(msg.arg1);
37421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
37521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        // Report a timeout to the observer, if any
37621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        if (params.observer != null) {
37721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            try {
37821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                                params.observer.onTimeout();
37921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            } catch (RemoteException e) {
380f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov                            /* don't care if the app has gone away */
38121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                            }
38221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        }
38321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    } else {
384dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                        Slog.d(TAG, "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;
398dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                if (MORE_DEBUG) {
399dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                    Slog.d(TAG, "MSG_REQUEST_BACKUP observer=" + params.observer);
40021510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
40121510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                ArrayList<BackupRequest> kvQueue = new ArrayList<>();
40221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                for (String packageName : params.kvPackages) {
40321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                    kvQueue.add(new BackupRequest(packageName));
40421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
405d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                backupManagerService.setBackupRunning(true);
406d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov                backupManagerService.getWakelock().acquire();
40721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
40821510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                PerformBackupTask pbt = new PerformBackupTask(
40921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                        backupManagerService,
410af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                        params.transportClient, params.dirName,
411af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                        kvQueue, null, params.observer, params.monitor, params.listener,
412af547f4a15a7d6121306a5e973ae7f3709e5df3aBernardo Rufino                        params.fullPackages, true, params.nonIncrementalBackup);
413c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov                Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
41421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                sendMessage(pbtMessage);
41521510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
416f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
41721510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov
418c2a3d0fb3a25dd3f8171d24e1815da1f7f749e13Artem Iglikov            case MSG_SCHEDULE_BACKUP_PACKAGE: {
41921510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                String pkgName = (String) msg.obj;
420dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                if (MORE_DEBUG) {
421dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov                    Slog.d(TAG, "MSG_SCHEDULE_BACKUP_PACKAGE " + pkgName);
42221510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                }
42321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                backupManagerService.dataChangedImpl(pkgName);
42421510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov                break;
425f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov            }
426f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov        }
427f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov    }
428f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov}
429