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