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