1/*
2 * Copyright (C) 2014 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 */
16
17package com.android.phone.settings;
18
19import android.content.Context;
20import android.content.Intent;
21import android.content.SharedPreferences;
22import android.content.pm.ActivityInfo;
23import android.content.pm.PackageManager;
24import android.content.pm.ResolveInfo;
25import android.database.Cursor;
26import android.preference.ListPreference;
27import android.preference.PreferenceManager;
28import android.text.TextUtils;
29import android.util.AttributeSet;
30import android.util.Log;
31
32import com.android.internal.telephony.Phone;
33import com.android.phone.PhoneGlobals;
34import com.android.phone.R;
35
36import java.util.ArrayList;
37import java.util.HashMap;
38import java.util.List;
39import java.util.Map;
40
41public class VoicemailProviderListPreference extends ListPreference {
42    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
43    private static final String LOG_TAG = VoicemailProviderListPreference.class.getSimpleName();
44
45    // Key identifying the default voice mail provider
46    public static final String DEFAULT_KEY = "";
47
48    public class VoicemailProvider {
49        public String name;
50        public Intent intent;
51
52        public VoicemailProvider(String name, Intent intent) {
53            this.name = name;
54            this.intent = intent;
55        }
56
57        public String toString() {
58            return "[ Name: " + name + ", Intent: " + intent + " ]";
59        }
60    }
61
62    private Phone mPhone;
63
64    /**
65     * Data about discovered voice mail settings providers.
66     * Is populated by querying which activities can handle ACTION_CONFIGURE_VOICEMAIL.
67     * They key in this map is package name + activity name.
68     * We always add an entry for the default provider with a key of empty
69     * string and intent value of null.
70     * @see #initVoicemailProviders()
71     */
72    private final Map<String, VoicemailProvider> mVmProvidersData =
73            new HashMap<String, VoicemailProvider>();
74
75
76    public VoicemailProviderListPreference(Context context, AttributeSet attrs) {
77        super(context, attrs);
78    }
79
80    public void init(Phone phone, Intent intent) {
81        mPhone = phone;
82
83        initVoicemailProviders(intent);
84    }
85
86    /**
87     * Enumerates existing VM providers and puts their data into the list and populates
88     * the preference list objects with their names.
89     * In case we are called with ACTION_ADD_VOICEMAIL intent the intent may have
90     * an extra string called IGNORE_PROVIDER_EXTRA with "package.activityName" of the provider
91     * which should be hidden when we bring up the list of possible VM providers to choose.
92     */
93    private void initVoicemailProviders(Intent activityIntent) {
94        if (DBG) log("initVoicemailProviders()");
95
96        String providerToIgnore = null;
97        String action = activityIntent.getAction();
98        if (!TextUtils.isEmpty(action)
99                && action.equals(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL)
100                && activityIntent.hasExtra(VoicemailSettingsActivity.IGNORE_PROVIDER_EXTRA)) {
101            // Remove this provider from the list.
102            if (DBG) log("Found ACTION_ADD_VOICEMAIL.");
103            providerToIgnore =
104                    activityIntent.getStringExtra(VoicemailSettingsActivity.IGNORE_PROVIDER_EXTRA);
105            VoicemailProviderSettingsUtil.delete(mPhone.getContext(), providerToIgnore);
106        }
107
108        mVmProvidersData.clear();
109
110        List<String> entries = new ArrayList<String>();
111        List<String> values = new ArrayList<String>();
112
113        // Add default voicemail provider.
114        final String myCarrier =
115                mPhone.getContext().getResources().getString(R.string.voicemail_default);
116        mVmProvidersData.put(VoicemailProviderListPreference.DEFAULT_KEY,
117                new VoicemailProvider(myCarrier, null));
118        entries.add(myCarrier);
119        values.add(VoicemailProviderListPreference.DEFAULT_KEY);
120
121        // Add other voicemail providers.
122        PackageManager pm = mPhone.getContext().getPackageManager();
123        Intent intent = new Intent(VoicemailSettingsActivity.ACTION_CONFIGURE_VOICEMAIL);
124        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
125        for (int i = 0; i < resolveInfos.size(); i++) {
126            final ResolveInfo ri= resolveInfos.get(i);
127            final ActivityInfo currentActivityInfo = ri.activityInfo;
128            final String key = currentActivityInfo.name;
129
130            if (key.equals(providerToIgnore)) {
131                continue;
132            }
133
134            if (DBG) log("Loading key: " + key);
135            CharSequence label = ri.loadLabel(pm);
136            if (TextUtils.isEmpty(label)) {
137                Log.w(LOG_TAG, "Adding voicemail provider with no name for display.");
138            }
139            String nameForDisplay = (label != null) ? label.toString() : "";
140            Intent providerIntent = new Intent();
141            providerIntent.setAction(VoicemailSettingsActivity.ACTION_CONFIGURE_VOICEMAIL);
142            providerIntent.setClassName(currentActivityInfo.packageName, currentActivityInfo.name);
143            VoicemailProvider vmProvider = new VoicemailProvider(nameForDisplay, providerIntent);
144
145            if (DBG) log("Store VoicemailProvider. Key: " + key + " -> " + vmProvider.toString());
146            mVmProvidersData.put(key, vmProvider);
147            entries.add(vmProvider.name);
148            values.add(key);
149        }
150
151        setEntries(entries.toArray(new String[0]));
152        setEntryValues(values.toArray(new String[0]));
153    }
154
155    @Override
156    public String getValue() {
157        final String providerKey = super.getValue();
158        return (providerKey != null) ? providerKey : DEFAULT_KEY;
159    }
160
161    public VoicemailProvider getVoicemailProvider(String key) {
162        return mVmProvidersData.get(key);
163    }
164
165    public boolean hasMoreThanOneVoicemailProvider() {
166        return mVmProvidersData.size() > 1;
167    }
168
169    private static void log(String msg) {
170        Log.d(LOG_TAG, msg);
171    }
172}
173