Use unencrypted storage for shared prefs in new call log.
We need to be able to write the shared prefs when the device is in direct boot mode, and this data is not sensitive so can be unencrypted.
Bug: 68350256
Test: existing unit, manual
PiperOrigin-RevId: 174075154
Change-Id: Ib52e11c6abba0812d1dc07c642691359089c3e6e
diff --git a/java/com/android/dialer/calllog/CallLogFramework.java b/java/com/android/dialer/calllog/CallLogFramework.java
index 788e56b..e4bb4c8 100644
--- a/java/com/android/dialer/calllog/CallLogFramework.java
+++ b/java/com/android/dialer/calllog/CallLogFramework.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
import com.android.dialer.buildtype.BuildType;
@@ -26,6 +25,7 @@
import com.android.dialer.calllog.datasources.DataSources;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.storage.Unencrypted;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -41,12 +41,14 @@
static final String PREF_FORCE_REBUILD = "callLogFrameworkForceRebuild";
private final DataSources dataSources;
+ private final SharedPreferences sharedPreferences;
@Nullable private CallLogUi ui;
@Inject
- CallLogFramework(DataSources dataSources) {
+ CallLogFramework(DataSources dataSources, @Unencrypted SharedPreferences sharedPreferences) {
this.dataSources = dataSources;
+ this.sharedPreferences = sharedPreferences;
}
/** Registers the content observers for all data sources. */
@@ -99,7 +101,6 @@
Assert.isMainThread();
LogUtil.enterBlock("CallLogFramework.markDirtyAndNotify");
- SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext);
sharedPreferences.edit().putBoolean(PREF_FORCE_REBUILD, true).apply();
if (ui != null) {
diff --git a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
index 2732466..72f73cd 100644
--- a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
+++ b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
@@ -22,7 +22,6 @@
import android.content.SharedPreferences;
import android.os.Build;
import android.os.RemoteException;
-import android.preference.PreferenceManager;
import android.support.annotation.WorkerThread;
import com.android.dialer.calllog.database.CallLogDatabaseComponent;
import com.android.dialer.calllog.datasources.CallLogDataSource;
@@ -32,6 +31,7 @@
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DialerExecutor.Worker;
import com.android.dialer.inject.ApplicationContext;
+import com.android.dialer.storage.Unencrypted;
import javax.inject.Inject;
/**
@@ -43,11 +43,16 @@
private final Context appContext;
private final DataSources dataSources;
+ private final SharedPreferences sharedPreferences;
@Inject
- RefreshAnnotatedCallLogWorker(@ApplicationContext Context appContext, DataSources dataSources) {
+ RefreshAnnotatedCallLogWorker(
+ @ApplicationContext Context appContext,
+ DataSources dataSources,
+ @Unencrypted SharedPreferences sharedPreferences) {
this.appContext = appContext;
this.dataSources = dataSources;
+ this.sharedPreferences = sharedPreferences;
}
@Override
@@ -71,7 +76,6 @@
long startTime = System.currentTimeMillis();
- SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext);
// Default to true. If the pref doesn't exist, the annotated call log hasn't been created and
// we just skip isDirty checks and force a rebuild.
boolean forceRebuildPrefValue =
@@ -171,8 +175,6 @@
dataSourceName,
System.currentTimeMillis() - startTime);
}
-
- SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext);
sharedPreferences.edit().putBoolean(CallLogFramework.PREF_FORCE_REBUILD, false).apply();
}
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index 1fe3507..5ca1607 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -25,7 +25,6 @@
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
-import android.preference.PreferenceManager;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds.Phone;
@@ -48,6 +47,7 @@
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.ThreadUtil;
import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
+import com.android.dialer.storage.StorageComponent;
import com.android.dialer.theme.R;
import com.android.dialer.util.PermissionsUtil;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
@@ -107,7 +107,8 @@
*
* Just return false unless the table has never been written to.
*/
- return !PreferenceManager.getDefaultSharedPreferences(appContext)
+ return !StorageComponent.get(appContext)
+ .unencryptedSharedPrefs()
.contains(PREF_LAST_TIMESTAMP_PROCESSED);
}
@@ -142,7 +143,8 @@
public void onSuccessfulFill(Context appContext) {
// If a fill operation was a no-op, lastTimestampProcessed could still be null.
if (lastTimestampProcessed != null) {
- PreferenceManager.getDefaultSharedPreferences(appContext)
+ StorageComponent.get(appContext)
+ .unencryptedSharedPrefs()
.edit()
.putLong(PREF_LAST_TIMESTAMP_PROCESSED, lastTimestampProcessed)
.apply();
@@ -190,7 +192,8 @@
private void handleInsertsAndUpdates(
Context appContext, CallLogMutations mutations, Set<Long> existingAnnotatedCallLogIds) {
long previousTimestampProcessed =
- PreferenceManager.getDefaultSharedPreferences(appContext)
+ StorageComponent.get(appContext)
+ .unencryptedSharedPrefs()
.getLong(PREF_LAST_TIMESTAMP_PROCESSED, 0L);
DialerPhoneNumberUtil dialerPhoneNumberUtil =
diff --git a/java/com/android/dialer/storage/StorageComponent.java b/java/com/android/dialer/storage/StorageComponent.java
index 067b994..cb5c4a8 100644
--- a/java/com/android/dialer/storage/StorageComponent.java
+++ b/java/com/android/dialer/storage/StorageComponent.java
@@ -28,7 +28,11 @@
/**
* Returns unencrypted default shared preferences. This method should not be used for private
* data.
+ *
+ * <p>These shared prefs are available even when the device is in FBE mode and are generally the
+ * ones that should be used, because Dialer needs to function while in FBE mode.
*/
+ @Unencrypted
public abstract SharedPreferences unencryptedSharedPrefs();
public static StorageComponent get(Context context) {
diff --git a/java/com/android/dialer/storage/StorageModule.java b/java/com/android/dialer/storage/StorageModule.java
index 3ee72c8..e1c5b4b 100644
--- a/java/com/android/dialer/storage/StorageModule.java
+++ b/java/com/android/dialer/storage/StorageModule.java
@@ -30,6 +30,7 @@
@Provides
@Singleton
+ @Unencrypted
static SharedPreferences provideUnencryptedSharedPrefs(@ApplicationContext Context appContext) {
// #createDeviceProtectedStorageContext returns a new context each time, so we cache the shared
// preferences object in order to avoid accessing disk for every operation.
diff --git a/java/com/android/dialer/storage/DeviceProtected.java b/java/com/android/dialer/storage/Unencrypted.java
similarity index 86%
rename from java/com/android/dialer/storage/DeviceProtected.java
rename to java/com/android/dialer/storage/Unencrypted.java
index 862259a..02c9021 100644
--- a/java/com/android/dialer/storage/DeviceProtected.java
+++ b/java/com/android/dialer/storage/Unencrypted.java
@@ -17,6 +17,6 @@
import javax.inject.Qualifier;
-/** Annotation for retrieving device protected storage objects. */
+/** Annotation for retrieving unencrypted storage objects. */
@Qualifier
-public @interface DeviceProtected {}
+public @interface Unencrypted {}