/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.telephony; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.UserHandle; import android.provider.Telephony; /** * A static helper class used to send Intents with prepopulated flags. *

* This is intended to be used by the CellBroadcastService and does nothing if the caller does not * have permission to broadcast {@link Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION}. * * @hide */ @SystemApi public class CellBroadcastIntents { private static final String LOG_TAG = "CellBroadcastIntents"; private static final String EXTRA_MESSAGE = "message"; /** * Broadcast intent action for notifying area information has been updated. broadcast is also * sent when the user turns off area info alerts. The information * can be retrieved by {@link CellBroadcastService#getCellBroadcastAreaInfo(int)}. The * associated SIM slot index of updated area information can be retrieved through the extra * {@link SubscriptionManager#EXTRA_SLOT_INDEX}. * * @see SubscriptionManager#EXTRA_SLOT_INDEX */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_AREA_INFO_UPDATED = "android.telephony.action.AREA_INFO_UPDATED"; /** * @hide */ private CellBroadcastIntents() { } /** * Broadcasts an SMS_CB_RECEIVED_ACTION intent which can be received by background * BroadcastReceivers. This is only intended to be used by the CellBroadcastService and will * do nothing if the caller does not have permission to broadcast * {@link Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION}. * * @param context The context from which to send the broadcast * @param user The user from which to send the broadcast * @param smsCbMessage The SmsCbMessage to include with the intent * @param resultReceiver Your own BroadcastReceiver to treat as the final receiver of the * broadcast. * @param scheduler A custom Handler with which to schedule the resultReceiver * callback; if null it will be scheduled in the Context's main * thread. * @param initialCode An initial value for the result code. Often Activity.RESULT_OK. * @param slotIndex The slot index to include in the intent */ public static void sendSmsCbReceivedBroadcast(@NonNull Context context, @Nullable UserHandle user, @NonNull SmsCbMessage smsCbMessage, @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, int slotIndex) { Intent backgroundIntent = new Intent(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION); backgroundIntent.putExtra(EXTRA_MESSAGE, smsCbMessage); putPhoneIdAndSubIdExtra(context, backgroundIntent, slotIndex); String receiverPermission = Manifest.permission.RECEIVE_SMS; String receiverAppOp = AppOpsManager.OPSTR_RECEIVE_SMS; if (user != null) { context.createContextAsUser(user, 0).sendOrderedBroadcast(backgroundIntent, receiverPermission, receiverAppOp, resultReceiver, scheduler, initialCode, null, null); } else { context.sendOrderedBroadcast(backgroundIntent, receiverPermission, receiverAppOp, resultReceiver, scheduler, initialCode, null, null); } } /** * Put the phone ID and sub ID into an intent as extras. */ private static void putPhoneIdAndSubIdExtra(Context context, Intent intent, int phoneId) { int subId = SubscriptionManager.getSubscriptionId(phoneId); if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { intent.putExtra("subscription", subId); intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId); } intent.putExtra("phone", phoneId); intent.putExtra(SubscriptionManager.EXTRA_SLOT_INDEX, phoneId); } }