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 
17 package com.android.phone.settings;
18 
19 import android.content.Context;
20 import android.content.Intent;
21 import android.content.SharedPreferences;
22 import android.content.pm.ActivityInfo;
23 import android.content.pm.PackageManager;
24 import android.content.pm.ResolveInfo;
25 import android.database.Cursor;
26 import android.preference.ListPreference;
27 import android.preference.PreferenceManager;
28 import android.text.TextUtils;
29 import android.util.AttributeSet;
30 import android.util.Log;
31 
32 import com.android.internal.telephony.Phone;
33 import com.android.phone.PhoneGlobals;
34 import com.android.phone.R;
35 
36 import java.util.ArrayList;
37 import java.util.HashMap;
38 import java.util.List;
39 import java.util.Map;
40 
41 public 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 
VoicemailProvider(String name, Intent intent)52         public VoicemailProvider(String name, Intent intent) {
53             this.name = name;
54             this.intent = intent;
55         }
56 
toString()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 
VoicemailProviderListPreference(Context context, AttributeSet attrs)76     public VoicemailProviderListPreference(Context context, AttributeSet attrs) {
77         super(context, attrs);
78     }
79 
init(Phone phone, Intent intent)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      */
initVoicemailProviders(Intent activityIntent)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
getValue()156     public String getValue() {
157         final String providerKey = super.getValue();
158         return (providerKey != null) ? providerKey : DEFAULT_KEY;
159     }
160 
getVoicemailProvider(String key)161     public VoicemailProvider getVoicemailProvider(String key) {
162         return mVmProvidersData.get(key);
163     }
164 
hasMoreThanOneVoicemailProvider()165     public boolean hasMoreThanOneVoicemailProvider() {
166         return mVmProvidersData.size() > 1;
167     }
168 
log(String msg)169     private static void log(String msg) {
170         Log.d(LOG_TAG, msg);
171     }
172 }
173