1a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu/*
2a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * Copyright (C) 2016 The Android Open Source Project
3a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu *
4a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * Licensed under the Apache License, Version 2.0 (the "License");
5a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * you may not use this file except in compliance with the License.
6a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * You may obtain a copy of the License at
7a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu *
8a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu *      http://www.apache.org/licenses/LICENSE-2.0
9a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu *
10a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * Unless required by applicable law or agreed to in writing, software
11a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * distributed under the License is distributed on an "AS IS" BASIS,
12a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * See the License for the specific language governing permissions and
14a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * limitations under the License.
15a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu */
16a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxupackage com.android.carrierdefaultapp;
17a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
18a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.app.Notification;
19009848b03ed049bd9f6f6e8a9fb4e7da414727a0fionaxuimport android.app.NotificationChannel;
20a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.app.NotificationManager;
21a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.app.PendingIntent;
22d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxuimport android.content.ComponentName;
23a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.content.Context;
24a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.content.Intent;
25d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxuimport android.content.pm.PackageManager;
26a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.content.res.Resources;
275b834a82082c1e7c938d81ade2f28a08d59195a6fionaxuimport android.os.Bundle;
28a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.telephony.SubscriptionManager;
29a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.telephony.TelephonyManager;
307569cc2e0644c562587a7dd486789a3fe488adb0fionaxuimport android.text.TextUtils;
31a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport android.util.Log;
32a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport com.android.internal.telephony.PhoneConstants;
33a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxuimport com.android.carrierdefaultapp.R;
34a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu/**
35a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu * This util class provides common logic for carrier actions
36a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu */
37a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxupublic class CarrierActionUtils {
38a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static final String TAG = CarrierActionUtils.class.getSimpleName();
39a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
40a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static final String PORTAL_NOTIFICATION_TAG = "CarrierDefault.Portal.Notification";
41a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static final String NO_DATA_NOTIFICATION_TAG = "CarrierDefault.NoData.Notification";
42009848b03ed049bd9f6f6e8a9fb4e7da414727a0fionaxu    private static final String NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS = "mobile_data_status";
43a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static final int PORTAL_NOTIFICATION_ID = 0;
44a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static final int NO_DATA_NOTIFICATION_ID = 1;
45a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static boolean ENABLE = true;
46a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
47a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    // A list of supported carrier action idx
48a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static final int CARRIER_ACTION_ENABLE_METERED_APNS               = 0;
49a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static final int CARRIER_ACTION_DISABLE_METERED_APNS              = 1;
50a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static final int CARRIER_ACTION_DISABLE_RADIO                     = 2;
51a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static final int CARRIER_ACTION_ENABLE_RADIO                      = 3;
52a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static final int CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION          = 4;
53a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static final int CARRIER_ACTION_SHOW_NO_DATA_SERVICE_NOTIFICATION = 5;
54a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static final int CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS          = 6;
55d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    public static final int CARRIER_ACTION_ENABLE_DEFAULT_URL_HANDLER        = 7;
56d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    public static final int CARRIER_ACTION_DISABLE_DEFAULT_URL_HANDLER       = 8;
57d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    public static final int CARRIER_ACTION_REGISTER_DEFAULT_NETWORK_AVAIL    = 9;
58d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    public static final int CARRIER_ACTION_DEREGISTER_DEFAULT_NETWORK_AVAIL  = 10;
59a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
60a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    public static void applyCarrierAction(int actionIdx, Intent intent, Context context) {
61a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        switch (actionIdx) {
62a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            case CARRIER_ACTION_ENABLE_METERED_APNS:
63a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                onEnableAllMeteredApns(intent, context);
64a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                break;
65a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            case CARRIER_ACTION_DISABLE_METERED_APNS:
66a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                onDisableAllMeteredApns(intent, context);
67a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                break;
68a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            case CARRIER_ACTION_DISABLE_RADIO:
69a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                onDisableRadio(intent, context);
70a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                break;
71a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            case CARRIER_ACTION_ENABLE_RADIO:
72a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                onEnableRadio(intent, context);
73a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                break;
74a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            case CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION:
75a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                onShowCaptivePortalNotification(intent, context);
76a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                break;
77a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            case CARRIER_ACTION_SHOW_NO_DATA_SERVICE_NOTIFICATION:
78a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                onShowNoDataServiceNotification(context);
79a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                break;
80a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            case CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS:
81a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                onCancelAllNotifications(context);
82a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                break;
83d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu            case CARRIER_ACTION_ENABLE_DEFAULT_URL_HANDLER:
84d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                onEnableDefaultURLHandler(context);
85d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                break;
86d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu            case CARRIER_ACTION_DISABLE_DEFAULT_URL_HANDLER:
87d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                onDisableDefaultURLHandler(context);
88d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                break;
89d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu            case CARRIER_ACTION_REGISTER_DEFAULT_NETWORK_AVAIL:
90d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                onRegisterDefaultNetworkAvail(intent, context);
91d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                break;
92d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu            case CARRIER_ACTION_DEREGISTER_DEFAULT_NETWORK_AVAIL:
93d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                onDeregisterDefaultNetworkAvail(intent, context);
94d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                break;
95a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            default:
96a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                loge("unsupported carrier action index: " + actionIdx);
97a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        }
98a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
99a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
100a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void onDisableAllMeteredApns(Intent intent, Context context) {
101a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
102a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                SubscriptionManager.getDefaultVoiceSubscriptionId());
103a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        logd("onDisableAllMeteredApns subId: " + subId);
104a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
105a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        telephonyMgr.carrierActionSetMeteredApnsEnabled(subId, !ENABLE);
106a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
107a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
108a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void onEnableAllMeteredApns(Intent intent, Context context) {
109a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
110a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                SubscriptionManager.getDefaultVoiceSubscriptionId());
111a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        logd("onEnableAllMeteredApns subId: " + subId);
112a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
113a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        telephonyMgr.carrierActionSetMeteredApnsEnabled(subId, ENABLE);
114a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
115a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
116d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    private static void onEnableDefaultURLHandler(Context context) {
117d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        logd("onEnableDefaultURLHandler");
118d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        final PackageManager pm = context.getPackageManager();
119d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        pm.setComponentEnabledSetting(
120d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                new ComponentName(context, CaptivePortalLoginActivity.getAlias(context)),
121d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
122d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    }
123d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu
124d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    private static void onDisableDefaultURLHandler(Context context) {
125d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        logd("onDisableDefaultURLHandler");
126d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        final PackageManager pm = context.getPackageManager();
127d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        pm.setComponentEnabledSetting(
128d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                new ComponentName(context, CaptivePortalLoginActivity.getAlias(context)),
129d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
130d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    }
131d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu
132d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    private static void onRegisterDefaultNetworkAvail(Intent intent, Context context) {
133d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
134d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                SubscriptionManager.getDefaultVoiceSubscriptionId());
135d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        logd("onRegisterDefaultNetworkAvail subId: " + subId);
136d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
137d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        telephonyMgr.carrierActionReportDefaultNetworkStatus(subId, true);
138d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    }
139d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu
140d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    private static void onDeregisterDefaultNetworkAvail(Intent intent, Context context) {
141d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
142d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu                SubscriptionManager.getDefaultVoiceSubscriptionId());
143d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        logd("onDeregisterDefaultNetworkAvail subId: " + subId);
144d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
145d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu        telephonyMgr.carrierActionReportDefaultNetworkStatus(subId, false);
146d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu    }
147d60a9d0e586e95be2f2730a940afdf1ed436c612fionaxu
148a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void onDisableRadio(Intent intent, Context context) {
149a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
150a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                SubscriptionManager.getDefaultVoiceSubscriptionId());
151a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        logd("onDisableRadio subId: " + subId);
152a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
153a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        telephonyMgr.carrierActionSetRadioEnabled(subId, !ENABLE);
154a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
155a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
156a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void onEnableRadio(Intent intent, Context context) {
157a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
158a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                SubscriptionManager.getDefaultVoiceSubscriptionId());
159a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        logd("onEnableRadio subId: " + subId);
160a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
161a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        telephonyMgr.carrierActionSetRadioEnabled(subId, ENABLE);
162a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
163a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
164a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void onShowCaptivePortalNotification(Intent intent, Context context) {
165a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        logd("onShowCaptivePortalNotification");
166da578042ae2560d2753bda5869adde7597a7ddf0fionaxu        Intent portalIntent = new Intent(context, CaptivePortalLoginActivity.class);
167a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        portalIntent.putExtras(intent);
168da578042ae2560d2753bda5869adde7597a7ddf0fionaxu        portalIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
169da578042ae2560d2753bda5869adde7597a7ddf0fionaxu                | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
170a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, portalIntent,
171a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                PendingIntent.FLAG_UPDATE_CURRENT);
172a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        Notification notification = getNotification(context, R.string.portal_notification_id,
173a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                R.string.portal_notification_detail, pendingIntent);
174a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        try {
17592d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu            context.getSystemService(NotificationManager.class)
17692d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu                    .notify(PORTAL_NOTIFICATION_TAG, PORTAL_NOTIFICATION_ID, notification);
177a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        } catch (NullPointerException npe) {
178a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            loge("setNotificationVisible: " + npe);
179a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        }
180a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
181a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
182a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void onShowNoDataServiceNotification(Context context) {
183a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        logd("onShowNoDataServiceNotification");
184a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        Notification notification = getNotification(context, R.string.no_data_notification_id,
185a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                R.string.no_data_notification_detail, null);
186a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        try {
18792d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu            context.getSystemService(NotificationManager.class)
18892d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu                    .notify(NO_DATA_NOTIFICATION_TAG, NO_DATA_NOTIFICATION_ID, notification);
189a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        } catch (NullPointerException npe) {
190a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            loge("setNotificationVisible: " + npe);
191a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        }
192a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
193a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
194a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void onCancelAllNotifications(Context context) {
195a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        logd("onCancelAllNotifications");
19692d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu        context.getSystemService(NotificationManager.class).cancelAll();
197a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
198a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
199a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static Notification getNotification(Context context, int titleId, int textId,
200a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                                         PendingIntent pendingIntent) {
2015b834a82082c1e7c938d81ade2f28a08d59195a6fionaxu        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
2025b834a82082c1e7c938d81ade2f28a08d59195a6fionaxu        final Resources resources = context.getResources();
2037569cc2e0644c562587a7dd486789a3fe488adb0fionaxu        String spn = telephonyMgr.getSimOperatorName();
2047569cc2e0644c562587a7dd486789a3fe488adb0fionaxu        if (TextUtils.isEmpty(spn)) {
2057569cc2e0644c562587a7dd486789a3fe488adb0fionaxu            // There is no consistent way to get the current carrier name as MNOs didn't
2067569cc2e0644c562587a7dd486789a3fe488adb0fionaxu            // bother to set EF_SPN. in the long term, we should display a generic wording if
2077569cc2e0644c562587a7dd486789a3fe488adb0fionaxu            // spn from subscription is not set.
2087569cc2e0644c562587a7dd486789a3fe488adb0fionaxu            spn = telephonyMgr.getNetworkOperatorName();
2097569cc2e0644c562587a7dd486789a3fe488adb0fionaxu        }
2105b834a82082c1e7c938d81ade2f28a08d59195a6fionaxu        final Bundle extras = Bundle.forPair(Notification.EXTRA_SUBSTITUTE_APP_NAME,
2115b834a82082c1e7c938d81ade2f28a08d59195a6fionaxu                resources.getString(R.string.android_system_label));
21292d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu        createNotificationChannels(context);
213a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        Notification.Builder builder = new Notification.Builder(context)
214a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setContentTitle(resources.getString(titleId))
2157569cc2e0644c562587a7dd486789a3fe488adb0fionaxu                .setContentText(String.format(resources.getString(textId), spn))
216a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setSmallIcon(R.drawable.ic_sim_card)
2175b834a82082c1e7c938d81ade2f28a08d59195a6fionaxu                .setColor(context.getColor(
2185b834a82082c1e7c938d81ade2f28a08d59195a6fionaxu                        com.android.internal.R.color.system_notification_accent_color))
219a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setOngoing(true)
220a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setPriority(Notification.PRIORITY_HIGH)
221a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setDefaults(Notification.DEFAULT_ALL)
222a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setVisibility(Notification.VISIBILITY_PUBLIC)
223a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setLocalOnly(true)
224a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu                .setWhen(System.currentTimeMillis())
2255b834a82082c1e7c938d81ade2f28a08d59195a6fionaxu                .setShowWhen(false)
226009848b03ed049bd9f6f6e8a9fb4e7da414727a0fionaxu                .setExtras(extras)
227009848b03ed049bd9f6f6e8a9fb4e7da414727a0fionaxu                .setChannel(NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS);
228a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
229a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        if (pendingIntent != null) {
230a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu            builder.setContentIntent(pendingIntent);
231a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        }
232a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        return builder.build();
233a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
234a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
23592d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu    /**
23692d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu     * Creates the notification channel and registers it with NotificationManager. Also used to
23792d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu     * update an existing channel's name.
23892d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu     */
23992d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu    static void createNotificationChannels(Context context) {
24092d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu        context.getSystemService(NotificationManager.class)
24192d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu                .createNotificationChannel(new NotificationChannel(
24292d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu                NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS,
24392d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu                context.getResources().getString(
24492d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu                        R.string.mobile_data_status_notification_channel_name),
24592d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu                NotificationManager.IMPORTANCE_DEFAULT));
24692d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu    }
24792d759d56a3eedfbbda36da10d0fed44f57dc58ffionaxu
248a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void logd(String s) {
249a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        Log.d(TAG, s);
250a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
251a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu
252a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    private static void loge(String s) {
253a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu        Log.e(TAG, s);
254a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu    }
255a21a87b7a4153839cebb3152d0003ee86d7a5252fionaxu}
256