blob: 3258d57ba8e0aa5658eefb98c57fb202c91649bf [file] [log] [blame]
fionaxua21a87b2016-12-13 17:15:11 -08001/*
2 * Copyright (C) 2016 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.carrierdefaultapp;
17
18import android.app.Notification;
fionaxu009848b2017-04-04 14:13:11 -070019import android.app.NotificationChannel;
fionaxua21a87b2016-12-13 17:15:11 -080020import android.app.NotificationManager;
21import android.app.PendingIntent;
fionaxud60a9d02017-05-23 14:55:27 -070022import android.content.ComponentName;
fionaxua21a87b2016-12-13 17:15:11 -080023import android.content.Context;
24import android.content.Intent;
fionaxud60a9d02017-05-23 14:55:27 -070025import android.content.pm.PackageManager;
fionaxua21a87b2016-12-13 17:15:11 -080026import android.content.res.Resources;
fionaxu5b834a82017-03-06 14:03:45 -080027import android.os.Bundle;
fionaxua21a87b2016-12-13 17:15:11 -080028import android.telephony.SubscriptionManager;
29import android.telephony.TelephonyManager;
fionaxu7569cc22017-09-01 13:39:55 -070030import android.text.TextUtils;
fionaxua21a87b2016-12-13 17:15:11 -080031import android.util.Log;
32import com.android.internal.telephony.PhoneConstants;
chen xu3d59fdb2018-10-17 22:57:45 -070033
fionaxua21a87b2016-12-13 17:15:11 -080034/**
35 * This util class provides common logic for carrier actions
36 */
37public class CarrierActionUtils {
38 private static final String TAG = CarrierActionUtils.class.getSimpleName();
39
40 private static final String PORTAL_NOTIFICATION_TAG = "CarrierDefault.Portal.Notification";
41 private static final String NO_DATA_NOTIFICATION_TAG = "CarrierDefault.NoData.Notification";
fionaxu009848b2017-04-04 14:13:11 -070042 private static final String NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS = "mobile_data_status";
fionaxua21a87b2016-12-13 17:15:11 -080043 private static final int PORTAL_NOTIFICATION_ID = 0;
44 private static final int NO_DATA_NOTIFICATION_ID = 1;
45 private static boolean ENABLE = true;
46
47 // A list of supported carrier action idx
48 public static final int CARRIER_ACTION_ENABLE_METERED_APNS = 0;
49 public static final int CARRIER_ACTION_DISABLE_METERED_APNS = 1;
50 public static final int CARRIER_ACTION_DISABLE_RADIO = 2;
51 public static final int CARRIER_ACTION_ENABLE_RADIO = 3;
52 public static final int CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION = 4;
53 public static final int CARRIER_ACTION_SHOW_NO_DATA_SERVICE_NOTIFICATION = 5;
54 public static final int CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS = 6;
fionaxud60a9d02017-05-23 14:55:27 -070055 public static final int CARRIER_ACTION_ENABLE_DEFAULT_URL_HANDLER = 7;
56 public static final int CARRIER_ACTION_DISABLE_DEFAULT_URL_HANDLER = 8;
57 public static final int CARRIER_ACTION_REGISTER_DEFAULT_NETWORK_AVAIL = 9;
58 public static final int CARRIER_ACTION_DEREGISTER_DEFAULT_NETWORK_AVAIL = 10;
fionaxu79d77bb2017-07-19 11:11:54 -070059 public static final int CARRIER_ACTION_RESET_ALL = 11;
fionaxua21a87b2016-12-13 17:15:11 -080060
61 public static void applyCarrierAction(int actionIdx, Intent intent, Context context) {
62 switch (actionIdx) {
63 case CARRIER_ACTION_ENABLE_METERED_APNS:
64 onEnableAllMeteredApns(intent, context);
65 break;
66 case CARRIER_ACTION_DISABLE_METERED_APNS:
67 onDisableAllMeteredApns(intent, context);
68 break;
69 case CARRIER_ACTION_DISABLE_RADIO:
70 onDisableRadio(intent, context);
71 break;
72 case CARRIER_ACTION_ENABLE_RADIO:
73 onEnableRadio(intent, context);
74 break;
75 case CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION:
76 onShowCaptivePortalNotification(intent, context);
77 break;
78 case CARRIER_ACTION_SHOW_NO_DATA_SERVICE_NOTIFICATION:
79 onShowNoDataServiceNotification(context);
80 break;
81 case CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS:
82 onCancelAllNotifications(context);
83 break;
fionaxud60a9d02017-05-23 14:55:27 -070084 case CARRIER_ACTION_ENABLE_DEFAULT_URL_HANDLER:
85 onEnableDefaultURLHandler(context);
86 break;
87 case CARRIER_ACTION_DISABLE_DEFAULT_URL_HANDLER:
88 onDisableDefaultURLHandler(context);
89 break;
90 case CARRIER_ACTION_REGISTER_DEFAULT_NETWORK_AVAIL:
91 onRegisterDefaultNetworkAvail(intent, context);
92 break;
93 case CARRIER_ACTION_DEREGISTER_DEFAULT_NETWORK_AVAIL:
94 onDeregisterDefaultNetworkAvail(intent, context);
95 break;
fionaxu79d77bb2017-07-19 11:11:54 -070096 case CARRIER_ACTION_RESET_ALL:
97 onResetAllCarrierActions(intent, context);
98 break;
fionaxua21a87b2016-12-13 17:15:11 -080099 default:
100 loge("unsupported carrier action index: " + actionIdx);
101 }
102 }
103
104 private static void onDisableAllMeteredApns(Intent intent, Context context) {
105 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
106 SubscriptionManager.getDefaultVoiceSubscriptionId());
107 logd("onDisableAllMeteredApns subId: " + subId);
108 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
chen xu3d59fdb2018-10-17 22:57:45 -0700109 telephonyMgr.createForSubscriptionId(subId).setCarrierDataEnabled(!ENABLE);
fionaxua21a87b2016-12-13 17:15:11 -0800110 }
111
112 private static void onEnableAllMeteredApns(Intent intent, Context context) {
113 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
114 SubscriptionManager.getDefaultVoiceSubscriptionId());
115 logd("onEnableAllMeteredApns subId: " + subId);
116 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
chen xu3d59fdb2018-10-17 22:57:45 -0700117 telephonyMgr.createForSubscriptionId(subId).setCarrierDataEnabled(ENABLE);
fionaxua21a87b2016-12-13 17:15:11 -0800118 }
119
fionaxud60a9d02017-05-23 14:55:27 -0700120 private static void onEnableDefaultURLHandler(Context context) {
121 logd("onEnableDefaultURLHandler");
122 final PackageManager pm = context.getPackageManager();
123 pm.setComponentEnabledSetting(
124 new ComponentName(context, CaptivePortalLoginActivity.getAlias(context)),
125 PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
126 }
127
128 private static void onDisableDefaultURLHandler(Context context) {
129 logd("onDisableDefaultURLHandler");
130 final PackageManager pm = context.getPackageManager();
131 pm.setComponentEnabledSetting(
132 new ComponentName(context, CaptivePortalLoginActivity.getAlias(context)),
133 PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
134 }
135
136 private static void onRegisterDefaultNetworkAvail(Intent intent, Context context) {
137 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
138 SubscriptionManager.getDefaultVoiceSubscriptionId());
139 logd("onRegisterDefaultNetworkAvail subId: " + subId);
140 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
141 telephonyMgr.carrierActionReportDefaultNetworkStatus(subId, true);
142 }
143
144 private static void onDeregisterDefaultNetworkAvail(Intent intent, Context context) {
145 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
146 SubscriptionManager.getDefaultVoiceSubscriptionId());
147 logd("onDeregisterDefaultNetworkAvail subId: " + subId);
148 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
149 telephonyMgr.carrierActionReportDefaultNetworkStatus(subId, false);
150 }
151
fionaxua21a87b2016-12-13 17:15:11 -0800152 private static void onDisableRadio(Intent intent, Context context) {
153 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
154 SubscriptionManager.getDefaultVoiceSubscriptionId());
155 logd("onDisableRadio subId: " + subId);
156 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
157 telephonyMgr.carrierActionSetRadioEnabled(subId, !ENABLE);
158 }
159
160 private static void onEnableRadio(Intent intent, Context context) {
161 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
162 SubscriptionManager.getDefaultVoiceSubscriptionId());
163 logd("onEnableRadio subId: " + subId);
164 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
165 telephonyMgr.carrierActionSetRadioEnabled(subId, ENABLE);
166 }
167
168 private static void onShowCaptivePortalNotification(Intent intent, Context context) {
169 logd("onShowCaptivePortalNotification");
fionaxuda578042017-03-10 10:16:09 -0800170 Intent portalIntent = new Intent(context, CaptivePortalLoginActivity.class);
fionaxua21a87b2016-12-13 17:15:11 -0800171 portalIntent.putExtras(intent);
fionaxuda578042017-03-10 10:16:09 -0800172 portalIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
173 | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
fionaxua21a87b2016-12-13 17:15:11 -0800174 PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, portalIntent,
175 PendingIntent.FLAG_UPDATE_CURRENT);
176 Notification notification = getNotification(context, R.string.portal_notification_id,
177 R.string.portal_notification_detail, pendingIntent);
178 try {
fionaxu92d759d2017-05-02 15:56:58 -0700179 context.getSystemService(NotificationManager.class)
180 .notify(PORTAL_NOTIFICATION_TAG, PORTAL_NOTIFICATION_ID, notification);
fionaxua21a87b2016-12-13 17:15:11 -0800181 } catch (NullPointerException npe) {
182 loge("setNotificationVisible: " + npe);
183 }
184 }
185
186 private static void onShowNoDataServiceNotification(Context context) {
187 logd("onShowNoDataServiceNotification");
fionaxua21a87b2016-12-13 17:15:11 -0800188 Notification notification = getNotification(context, R.string.no_data_notification_id,
189 R.string.no_data_notification_detail, null);
190 try {
fionaxu92d759d2017-05-02 15:56:58 -0700191 context.getSystemService(NotificationManager.class)
192 .notify(NO_DATA_NOTIFICATION_TAG, NO_DATA_NOTIFICATION_ID, notification);
fionaxua21a87b2016-12-13 17:15:11 -0800193 } catch (NullPointerException npe) {
194 loge("setNotificationVisible: " + npe);
195 }
196 }
197
198 private static void onCancelAllNotifications(Context context) {
199 logd("onCancelAllNotifications");
fionaxu92d759d2017-05-02 15:56:58 -0700200 context.getSystemService(NotificationManager.class).cancelAll();
fionaxua21a87b2016-12-13 17:15:11 -0800201 }
202
fionaxu79d77bb2017-07-19 11:11:54 -0700203 private static void onResetAllCarrierActions(Intent intent, Context context) {
204 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
205 SubscriptionManager.getDefaultVoiceSubscriptionId());
206 logd("onResetAllCarrierActions subId: " + subId);
207 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
208 telephonyMgr.carrierActionResetAll(subId);
209 }
210
fionaxua21a87b2016-12-13 17:15:11 -0800211 private static Notification getNotification(Context context, int titleId, int textId,
212 PendingIntent pendingIntent) {
fionaxu5b834a82017-03-06 14:03:45 -0800213 final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
214 final Resources resources = context.getResources();
fionaxu7569cc22017-09-01 13:39:55 -0700215 String spn = telephonyMgr.getSimOperatorName();
216 if (TextUtils.isEmpty(spn)) {
217 // There is no consistent way to get the current carrier name as MNOs didn't
218 // bother to set EF_SPN. in the long term, we should display a generic wording if
219 // spn from subscription is not set.
220 spn = telephonyMgr.getNetworkOperatorName();
221 }
fionaxu5b834a82017-03-06 14:03:45 -0800222 final Bundle extras = Bundle.forPair(Notification.EXTRA_SUBSTITUTE_APP_NAME,
223 resources.getString(R.string.android_system_label));
fionaxu92d759d2017-05-02 15:56:58 -0700224 createNotificationChannels(context);
fionaxua21a87b2016-12-13 17:15:11 -0800225 Notification.Builder builder = new Notification.Builder(context)
226 .setContentTitle(resources.getString(titleId))
fionaxu7569cc22017-09-01 13:39:55 -0700227 .setContentText(String.format(resources.getString(textId), spn))
fionaxua21a87b2016-12-13 17:15:11 -0800228 .setSmallIcon(R.drawable.ic_sim_card)
fionaxu5b834a82017-03-06 14:03:45 -0800229 .setColor(context.getColor(
230 com.android.internal.R.color.system_notification_accent_color))
fionaxua21a87b2016-12-13 17:15:11 -0800231 .setOngoing(true)
232 .setPriority(Notification.PRIORITY_HIGH)
233 .setDefaults(Notification.DEFAULT_ALL)
234 .setVisibility(Notification.VISIBILITY_PUBLIC)
235 .setLocalOnly(true)
236 .setWhen(System.currentTimeMillis())
fionaxu5b834a82017-03-06 14:03:45 -0800237 .setShowWhen(false)
fionaxu009848b2017-04-04 14:13:11 -0700238 .setExtras(extras)
239 .setChannel(NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS);
fionaxua21a87b2016-12-13 17:15:11 -0800240
241 if (pendingIntent != null) {
242 builder.setContentIntent(pendingIntent);
243 }
244 return builder.build();
245 }
246
fionaxu92d759d2017-05-02 15:56:58 -0700247 /**
248 * Creates the notification channel and registers it with NotificationManager. Also used to
249 * update an existing channel's name.
250 */
251 static void createNotificationChannels(Context context) {
252 context.getSystemService(NotificationManager.class)
253 .createNotificationChannel(new NotificationChannel(
254 NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS,
255 context.getResources().getString(
256 R.string.mobile_data_status_notification_channel_name),
257 NotificationManager.IMPORTANCE_DEFAULT));
258 }
259
fionaxua21a87b2016-12-13 17:15:11 -0800260 private static void logd(String s) {
261 Log.d(TAG, s);
262 }
263
264 private static void loge(String s) {
265 Log.e(TAG, s);
266 }
267}