/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.dialer.contacts.displaypreference; import android.content.Context; import android.content.SharedPreferences; import android.os.UserManager; import android.preference.PreferenceManager; import com.android.dialer.inject.ApplicationContext; import javax.inject.Inject; /** * Implementation of {@link ContactDisplayPreferences} backed by a {@link SharedPreferences}. Can * only be instantiated when the device is unlocked. */ public final class ContactDisplayPreferencesImpl implements ContactDisplayPreferences { private final Context appContext; private final SharedPreferences sharedPreferences; private final String displayOrderKey; private final String sortOrderKey; @Inject ContactDisplayPreferencesImpl(@ApplicationContext Context appContext) { this.appContext = appContext; // @Unencrypted preference would be a better choice, but Android Preference only supports the // default file. Stub should be used instead when device is locked. this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext); displayOrderKey = appContext.getString(R.string.display_options_view_names_as_key); sortOrderKey = appContext.getString(R.string.display_options_sort_list_by_key); } @Override public DisplayOrder getDisplayOrder() { migrate(); if (!sharedPreferences.contains(displayOrderKey)) { return DisplayOrder.PRIMARY; } return DisplayOrder.fromValue(appContext, sharedPreferences.getString(displayOrderKey, null)); } @Override public void setDisplayOrder(DisplayOrder displayOrder) { sharedPreferences.edit().putString(displayOrderKey, displayOrder.getValue(appContext)).apply(); } @Override public SortOrder getSortOrder() { migrate(); if (!sharedPreferences.contains(sortOrderKey)) { return SortOrder.BY_PRIMARY; } return SortOrder.fromValue(appContext, sharedPreferences.getString(sortOrderKey, null)); } @Override public void setSortOrder(SortOrder sortOrder) { sharedPreferences.edit().putString(sortOrderKey, sortOrder.getValue(appContext)).apply(); } /** * Moves the stored values to the standard location. * *

Usually preferences are stored in {@code package.name_preferences.xml}. However the old * com.android.contacts.common.preference.ContactsPreferences stored it in {@code * package.name.xml} which is incompatible with the regular {@link android.preference.Preference} * widgets. */ private void migrate() { if (!appContext.getSystemService(UserManager.class).isUserUnlocked()) { return; } SharedPreferences oldPreference = appContext.getSharedPreferences(appContext.getPackageName(), Context.MODE_PRIVATE); if (oldPreference.contains(displayOrderKey) || oldPreference.contains(sortOrderKey)) { sharedPreferences .edit() .putString( displayOrderKey, translateLegacyDisplayOrder(oldPreference.getInt(displayOrderKey, 1))) .putString(sortOrderKey, translateLegacySortOrder(oldPreference.getInt(sortOrderKey, 1))) .apply(); oldPreference.edit().remove(displayOrderKey).remove(sortOrderKey).apply(); } } private String translateLegacyDisplayOrder(int legacyValue) { switch (legacyValue) { case 2: return DisplayOrder.ALTERNATIVE.getValue(appContext); default: return DisplayOrder.PRIMARY.getValue(appContext); } } private String translateLegacySortOrder(int legacyValue) { switch (legacyValue) { case 2: return SortOrder.BY_ALTERNATIVE.getValue(appContext); default: return SortOrder.BY_PRIMARY.getValue(appContext); } } }