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