• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
16 package com.android.phone.vvm.omtp;
17 
18 import android.content.Context;
19 import android.content.pm.PackageManager.NameNotFoundException;
20 import android.os.PersistableBundle;
21 import android.telephony.CarrierConfigManager;
22 import android.telephony.SmsManager;
23 import android.telephony.SubscriptionManager;
24 import android.telephony.TelephonyManager;
25 import android.text.TextUtils;
26 import android.util.Log;
27 
28 import com.android.phone.vvm.omtp.sms.OmtpCvvmMessageSender;
29 import com.android.phone.vvm.omtp.sms.OmtpMessageSender;
30 import com.android.phone.vvm.omtp.sms.OmtpStandardMessageSender;
31 
32 /**
33  * Handle activation and deactivation of a visual voicemail source. This class is necessary to
34  * retrieve carrier vvm configuration details before sending the appropriate texts.
35  */
36 public class OmtpVvmCarrierConfigHelper {
37     private static final String TAG = "OmtpVvmCarrierConfigHelper";
38     private Context mContext;
39     private int mSubId;
40     private PersistableBundle mCarrierConfig;
41     private String mVvmType;
42 
OmtpVvmCarrierConfigHelper(Context context, int subId)43     public OmtpVvmCarrierConfigHelper(Context context, int subId) {
44         mContext = context;
45         mSubId = subId;
46         mCarrierConfig = getCarrierConfig();
47         mVvmType = getVvmType();
48     }
49 
getVvmType()50     public String getVvmType() {
51         if (mCarrierConfig == null) {
52             return null;
53         }
54 
55         return mCarrierConfig.getString(
56                 CarrierConfigManager.KEY_VVM_TYPE_STRING, null);
57     }
58 
getCarrierVvmPackageName()59     public String getCarrierVvmPackageName() {
60         if (mCarrierConfig == null) {
61             return null;
62         }
63 
64         return mCarrierConfig.getString(
65                 CarrierConfigManager.KEY_CARRIER_VVM_PACKAGE_NAME_STRING, null);
66     }
67 
isOmtpVvmType()68     public boolean isOmtpVvmType() {
69         return (TelephonyManager.VVM_TYPE_OMTP.equals(mVvmType) ||
70                 TelephonyManager.VVM_TYPE_CVVM.equals(mVvmType));
71     }
72 
73     /**
74      * For checking upon sim insertion whether visual voicemail should be enabled. This method does
75      * so by checking if the carrier's voicemail app is installed.
76      */
isEnabledByDefault()77     public boolean isEnabledByDefault() {
78         String packageName = mCarrierConfig.getString(
79                 CarrierConfigManager.KEY_CARRIER_VVM_PACKAGE_NAME_STRING);
80         if (packageName == null) {
81             return true;
82         }
83         try {
84             mContext.getPackageManager().getPackageInfo(packageName, 0);
85             return false;
86         } catch (NameNotFoundException e) {
87             return true;
88         }
89     }
90 
startActivation()91     public void startActivation() {
92         OmtpMessageSender messageSender = getMessageSender();
93         if (messageSender != null) {
94             Log.i(TAG, "Requesting VVM activation for subId: " + mSubId);
95             messageSender.requestVvmActivation(null);
96         }
97     }
98 
startDeactivation()99     public void startDeactivation() {
100         OmtpMessageSender messageSender = getMessageSender();
101         if (messageSender != null) {
102             Log.i(TAG, "Requesting VVM deactivation for subId: " + mSubId);
103             messageSender.requestVvmDeactivation(null);
104         }
105     }
106 
getCarrierConfig()107     private PersistableBundle getCarrierConfig() {
108         if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
109             Log.w(TAG, "Invalid subscriptionId or subscriptionId not provided in intent.");
110             return null;
111         }
112 
113         CarrierConfigManager carrierConfigManager = (CarrierConfigManager)
114                 mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
115         if (carrierConfigManager == null) {
116             Log.w(TAG, "No carrier config service found.");
117             return null;
118         }
119 
120         return carrierConfigManager.getConfigForSubId(mSubId);
121     }
122 
getMessageSender()123     private OmtpMessageSender getMessageSender() {
124         if (mCarrierConfig == null) {
125             Log.w(TAG, "Empty carrier config.");
126             return null;
127         }
128 
129         int applicationPort = mCarrierConfig.getInt(
130                 CarrierConfigManager.KEY_VVM_PORT_NUMBER_INT, 0);
131         String destinationNumber = mCarrierConfig.getString(
132                 CarrierConfigManager.KEY_VVM_DESTINATION_NUMBER_STRING);
133         if (TextUtils.isEmpty(destinationNumber)) {
134             Log.w(TAG, "No destination number for this carrier.");
135             return null;
136         }
137 
138         OmtpMessageSender messageSender = null;
139         SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(mSubId);
140         switch (mVvmType) {
141             case TelephonyManager.VVM_TYPE_OMTP:
142                 messageSender = new OmtpStandardMessageSender(smsManager, (short) applicationPort,
143                         destinationNumber, null, OmtpConstants.PROTOCOL_VERSION1_1, null);
144                 break;
145             case TelephonyManager.VVM_TYPE_CVVM:
146                 messageSender = new OmtpCvvmMessageSender(smsManager, (short) applicationPort,
147                         destinationNumber);
148                 break;
149             default:
150                 Log.w(TAG, "Unexpected visual voicemail type: " + mVvmType);
151         }
152 
153         return messageSender;
154     }
155 }