1/*
2 * Copyright (C) 2015 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.messaging.util;
17
18import android.content.Context;
19import android.content.res.Resources;
20import android.text.TextUtils;
21
22import com.android.messaging.Factory;
23import com.android.messaging.R;
24
25/**
26 * Provides interface to access per-subscription shared preferences. We have one instance of
27 * this per active subscription.
28 */
29public class BugleSubscriptionPrefs extends BuglePrefsImpl {
30    private final int mSubId;
31
32    public BugleSubscriptionPrefs(final Context context, final int subId) {
33        super(context);
34        mSubId = subId;
35    }
36
37    @Override
38    public String getSharedPreferencesName() {
39        return SHARED_PREFERENCES_PER_SUBSCRIPTION_PREFIX + String.valueOf(mSubId);
40    }
41
42    @Override
43    protected void validateKey(String key) {
44        super.validateKey(key);
45        // Callers should only access per-subscription preferences from this class
46        Assert.isTrue(key.startsWith(SHARED_PREFERENCES_PER_SUBSCRIPTION_PREFIX));
47    }
48
49    @Override
50    public void onUpgrade(final int oldVersion, final int newVersion) {
51        switch (oldVersion) {
52            case BuglePrefs.NO_SHARED_PREFERENCES_VERSION:
53                // Upgrade to version 1. Adding per-subscription shared prefs.
54                // Migrate values from the application-wide settings.
55                migratePrefBooleanInternal(BuglePrefs.getApplicationPrefs(), "delivery_reports",
56                        R.string.delivery_reports_pref_key, R.bool.delivery_reports_pref_default);
57                migratePrefBooleanInternal(BuglePrefs.getApplicationPrefs(), "auto_retrieve_mms",
58                        R.string.auto_retrieve_mms_pref_key, R.bool.auto_retrieve_mms_pref_default);
59                migratePrefBooleanInternal(BuglePrefs.getApplicationPrefs(),
60                        "auto_retrieve_mms_when_roaming",
61                        R.string.auto_retrieve_mms_when_roaming_pref_key,
62                        R.bool.auto_retrieve_mms_when_roaming_pref_default);
63                migratePrefBooleanInternal(BuglePrefs.getApplicationPrefs(), "group_messaging",
64                        R.string.group_mms_pref_key, R.bool.group_mms_pref_default);
65
66                if (PhoneUtils.getDefault().getActiveSubscriptionCount() == 1) {
67                    migratePrefStringInternal(BuglePrefs.getApplicationPrefs(), "mms_phone_number",
68                            R.string.mms_phone_number_pref_key, null);
69                }
70        }
71    }
72
73    private void migratePrefBooleanInternal(final BuglePrefs oldPrefs, final String oldKey,
74            final int newKeyResId, final int defaultValueResId) {
75        final Resources resources = Factory.get().getApplicationContext().getResources();
76        final boolean defaultValue = resources.getBoolean(defaultValueResId);
77        final boolean oldValue = oldPrefs.getBoolean(oldKey, defaultValue);
78
79        // Only migrate pref value if it's different than the default.
80        if (oldValue != defaultValue) {
81            putBoolean(resources.getString(newKeyResId), oldValue);
82        }
83    }
84
85    private void migratePrefStringInternal(final BuglePrefs oldPrefs, final String oldKey,
86            final int newKeyResId, final String defaultValue) {
87        final Resources resources = Factory.get().getApplicationContext().getResources();
88        final String oldValue = oldPrefs.getString(oldKey, defaultValue);
89
90        // Only migrate pref value if it's different than the default.
91        if (!TextUtils.equals(oldValue, defaultValue)) {
92            putString(resources.getString(newKeyResId), oldValue);
93        }
94    }
95}
96