From dd7b56fbb3ef86f0e07ed75862537f1f4df31e78 Mon Sep 17 00:00:00 2001 From: Trevor Terris Date: Tue, 4 May 2021 12:56:35 -0400 Subject: [PATCH] Copy settings from credential to device encrypted storage Copy settings from credential to device encrypted storage if device encrypted is empty. This should only happen at most once, if the user is updating the application to the version with device encrypted storage. --- .../latin/utils/DeviceProtectedUtils.java | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DeviceProtectedUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DeviceProtectedUtils.java index 1f531b72b..6911d0736 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DeviceProtectedUtils.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DeviceProtectedUtils.java @@ -19,22 +19,51 @@ package org.dslul.openboard.inputmethod.latin.utils; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; +import android.util.Log; + +import org.dslul.openboard.inputmethod.latin.LatinIME; + +import java.util.Map; +import java.util.Set; public final class DeviceProtectedUtils { - private static Context deviceProtectedContext; + static final String TAG = DeviceProtectedUtils.class.getSimpleName(); + @SuppressWarnings("unchecked") public static SharedPreferences getSharedPreferences(final Context context) { - return PreferenceManager.getDefaultSharedPreferences(getDeviceProtectedContext(context)); + SharedPreferences deviceProtectedPreferences = PreferenceManager.getDefaultSharedPreferences(getDeviceProtectedContext(context)); + if (deviceProtectedPreferences.getAll().isEmpty()) { + Log.i(TAG, "Device encrypted storage is empty, copying values from credential encrypted storage"); + for (Map.Entry entry : PreferenceManager.getDefaultSharedPreferences(context).getAll().entrySet()) { + SharedPreferences.Editor deviceProtectedPreferencesEditor = deviceProtectedPreferences.edit(); + try { + if (entry.getKey() != null && entry.getValue() != null) { + if (entry.getValue() instanceof Boolean) + deviceProtectedPreferencesEditor.putBoolean(entry.getKey(), (Boolean) entry.getValue()); + if (entry.getValue() instanceof Float) + deviceProtectedPreferencesEditor.putFloat(entry.getKey(), (Float) entry.getValue()); + if (entry.getValue() instanceof Integer) + deviceProtectedPreferencesEditor.putInt(entry.getKey(), (Integer) entry.getValue()); + if (entry.getValue() instanceof Long) + deviceProtectedPreferencesEditor.putLong(entry.getKey(), (Long) entry.getValue()); + if (entry.getValue() instanceof String) + deviceProtectedPreferencesEditor.putString(entry.getKey(), (String) entry.getValue()); + if (entry.getValue() instanceof Set) + deviceProtectedPreferencesEditor.putStringSet(entry.getKey(), (Set) entry.getValue()); + } + } catch (Exception e) { + Log.w(TAG, "Unable to copy preference from credential to device encrypted storage", e); + } + deviceProtectedPreferencesEditor.apply(); + } + } + return deviceProtectedPreferences; } private static Context getDeviceProtectedContext(final Context context) { - if (deviceProtectedContext != null) { - return deviceProtectedContext; - } - deviceProtectedContext = context.isDeviceProtectedStorage() + return context.isDeviceProtectedStorage() ? context : context.createDeviceProtectedStorageContext(); - return deviceProtectedContext; } private DeviceProtectedUtils() {