1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16package com.android.dialer.backup;
17
18import android.app.backup.BackupDataInput;
19import android.app.backup.BackupDataOutput;
20import android.os.ParcelFileDescriptor;
21import android.support.annotation.NonNull;
22import android.support.annotation.VisibleForTesting;
23import android.util.ArrayMap;
24import com.android.dialer.common.Assert;
25import com.android.dialer.common.LogUtil;
26import com.android.dialer.logging.DialerImpression;
27import com.android.dialer.logging.Logger;
28import com.google.android.libraries.backup.BackupKeyPredicate;
29import com.google.android.libraries.backup.BackupKeyPredicates;
30import com.google.android.libraries.backup.PersistentBackupAgentHelper;
31import java.io.IOException;
32import java.util.Map;
33
34/** Implementation of Key/Value Backup that powers Dialer's backup and restore. */
35public class DialerPersistentBackupAgent extends PersistentBackupAgentHelper {
36
37  private static final String[] BACKUP_NAMED_SHARED_PREFS = {
38    "com.google.android.dialer_preferences", "com.google.android.dialer", "com.android.dialer"
39  };
40
41  @NonNull private final String[] sharedPreferencesToBackup;
42
43  @VisibleForTesting(otherwise = VisibleForTesting.NONE)
44  DialerPersistentBackupAgent(@NonNull String[] sharedPrefs) {
45    this.sharedPreferencesToBackup = Assert.isNotNull(sharedPrefs);
46    Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_BACKUP_AGENT_CONSTRUCTOR);
47  }
48
49  public DialerPersistentBackupAgent() {
50    this(BACKUP_NAMED_SHARED_PREFS);
51  }
52
53  @Override
54  public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor stateFile)
55      throws IOException {
56    Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_ON_RESTORE);
57    LogUtil.i("DialerPersistentBackupAgent.onRestore", "restore from version: " + appVersionCode);
58    super.onRestore(data, appVersionCode, stateFile);
59  }
60
61  @Override
62  public void onBackup(
63      ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState)
64      throws IOException {
65    Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_ON_BACKUP);
66    LogUtil.i("DialerPersistentBackupAgent.onBackup", "onBackup being performed");
67    super.onBackup(oldState, data, newState);
68  }
69
70  @Override
71  public Map<String, BackupKeyPredicate> getBackupSpecification() {
72    Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_GET_BACKUP_SPECIFICATION);
73    LogUtil.i(
74        "DialerPersistentBackupAgent.getBackupSpecification",
75        "number of files being backed up: " + sharedPreferencesToBackup.length);
76
77    Map<String, BackupKeyPredicate> arrayMap = new ArrayMap<>();
78    for (String fileName : sharedPreferencesToBackup) {
79      LogUtil.i("DialerPersistentBackupAgent.getBackupSpecification", "arrayMap.put: " + fileName);
80      arrayMap.put(fileName, BackupKeyPredicates.alwaysTrue());
81    }
82
83    return arrayMap;
84  }
85
86  @Override
87  public void onRestoreFinished() {
88    Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_ON_RESTORE_FINISHED);
89    super.onRestoreFinished();
90  }
91}
92