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 19dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikovimport static com.android.server.backup.RefactoredBackupManagerService.TAG; 20dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov 21f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.content.pm.PackageInfo; 22f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport android.util.Slog; 2321510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov 24f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.internal.backup.IBackupTransport; 25f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport com.android.server.backup.RefactoredBackupManagerService; 2621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov 27f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovimport java.io.File; 28f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov 29f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikovpublic class PerformClearTask implements Runnable { 30f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov 31f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov private RefactoredBackupManagerService backupManagerService; 32f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov IBackupTransport mTransport; 33f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov PackageInfo mPackage; 34f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov 35f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov PerformClearTask(RefactoredBackupManagerService backupManagerService, 3621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov IBackupTransport transport, PackageInfo packageInfo) { 37f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov this.backupManagerService = backupManagerService; 38f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov mTransport = transport; 39f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov mPackage = packageInfo; 40f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov } 41f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov 42f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov public void run() { 43f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov try { 44f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov // Clear the on-device backup state to ensure a full backup next time 45d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov File stateDir = new File(backupManagerService.getBaseStateDir(), 4621510f0b7571f0689dc48c4f8fdbafea883cbdd0Artem Iglikov mTransport.transportDirName()); 47f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov File stateFile = new File(stateDir, mPackage.packageName); 48f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov stateFile.delete(); 49f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov 50f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov // Tell the transport to remove all the persistent storage for the app 51f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov // TODO - need to handle failures 52f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov mTransport.clearBackupData(mPackage); 53f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov } catch (Exception e) { 54dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov Slog.e(TAG, "Transport threw clearing data for " + mPackage + ": " + e.getMessage()); 55f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov } finally { 56f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov try { 57f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov // TODO - need to handle failures 58f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov mTransport.finishBackup(); 59f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov } catch (Exception e) { 60f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov // Nothing we can do here, alas 61dbe68324801cfd45d0d1116c9da983b8ebe651aeArtem Iglikov Slog.e(TAG, "Unable to mark clear operation finished: " + e.getMessage()); 62f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov } 63f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov 64f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov // Last but not least, release the cpu 65d6c00c711000aa70db51f46b48a86c2884e91b15Artem Iglikov backupManagerService.getWakelock().release(); 66f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov } 67f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov } 68f251e3509838e3fbc62ccdba9d4cfd0527f67acdArtem Iglikov} 69