sdk: Kill TelephonyExtUtils class
Since Android 10 arrived, the support for manual SIM provisioning
was never ported. In fact, there seems to be a way to do that
using some bits of AOSP code.
This way we get rid of the telephony-ext dependency for good.
Change-Id: Ibe4e430d696782032b7d9840ab36db040c3a4df9
diff --git a/Android.bp b/Android.bp
index f231864..8c4321e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -78,9 +78,7 @@
name: "org.lineageos.platform",
installable: true,
sdk_version: "core_platform",
- static_libs: [
- "telephony-ext",
- ] + lineage_sdk_LOCAL_STATIC_ANDROID_LIBRARIES + lineage_sdk_LOCAL_STATIC_JAVA_LIBRARIES,
+ static_libs: lineage_sdk_LOCAL_STATIC_ANDROID_LIBRARIES + lineage_sdk_LOCAL_STATIC_JAVA_LIBRARIES,
libs: [
"framework",
@@ -107,9 +105,7 @@
java_library {
name: "org.lineageos.platform.internal",
required: ["services"],
- static_libs: [
- "telephony-ext",
- ] + lineage_sdk_LOCAL_STATIC_ANDROID_LIBRARIES + lineage_sdk_LOCAL_STATIC_JAVA_LIBRARIES,
+ static_libs: lineage_sdk_LOCAL_STATIC_ANDROID_LIBRARIES + lineage_sdk_LOCAL_STATIC_JAVA_LIBRARIES,
srcs: [
lineage_sdk_src + "/**/*.java",
diff --git a/sdk/src/java/org/lineageos/internal/util/TelephonyExtUtils.java b/sdk/src/java/org/lineageos/internal/util/TelephonyExtUtils.java
deleted file mode 100644
index 77893cf..0000000
--- a/sdk/src/java/org/lineageos/internal/util/TelephonyExtUtils.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 2018 The LineageOS 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 org.lineageos.internal.util;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.AsyncTask;
-import android.os.IBinder.DeathRecipient;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemProperties;
-import android.telephony.SubscriptionManager;
-import android.util.Log;
-
-import com.android.internal.telephony.PhoneConstants;
-
-import org.codeaurora.internal.IExtTelephony;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.TimeUnit;
-
-public final class TelephonyExtUtils {
- private static final boolean DEBUG = false;
- private static final String TAG = "TelephonyExtUtils";
-
- public static final String ACTION_UICC_MANUAL_PROVISION_STATUS_CHANGED =
- "org.codeaurora.intent.action.ACTION_UICC_MANUAL_PROVISION_STATUS_CHANGED";
-
- public static final String EXTRA_NEW_PROVISION_STATE = "newProvisionState";
-
- private static final int ACTIVATE_TIME_OUT = 15000;
- private static final String PROP_TIME_OUT = "sys.uicc.activate.timeout";
-
- // This is the list of possible values that
- // IExtTelephony.getCurrentUiccCardProvisioningStatus() can return
- public static final int CARD_NOT_PRESENT = -2;
- public static final int INVALID_STATE = -1;
- public static final int NOT_PROVISIONED = 0;
- public static final int PROVISIONED = 1;
-
- private boolean mNoServiceAvailable = false;
- private IExtTelephony mExtTelephony;
-
- private static TelephonyExtUtils sInstance;
-
- private final List<ProvisioningChangedListener> mListeners = new ArrayList<>();
-
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
- if (DEBUG) Log.d(TAG, "Boot completed, registering service");
- mNoServiceAvailable = getService() == null;
- } else if (ACTION_UICC_MANUAL_PROVISION_STATUS_CHANGED.equals(action)) {
- int slotId = intent.getIntExtra(PhoneConstants.PHONE_KEY,
- SubscriptionManager.INVALID_SIM_SLOT_INDEX);
- boolean provisioned = intent.getIntExtra(EXTRA_NEW_PROVISION_STATE,
- NOT_PROVISIONED) == PROVISIONED;
- if (DEBUG) Log.d(TAG, "Received ACTION_UICC_MANUAL_PROVISION_STATUS_CHANGED"
- + " on slotId: " + slotId + ", sub provisioned: " + provisioned);
- notifyListeners(slotId, provisioned);
- }
- }
- };
-
- private final DeathRecipient mDeathRecipient = new DeathRecipient() {
- @Override
- public void binderDied() {
- if (DEBUG) Log.d(TAG, "Binder died");
- synchronized(TelephonyExtUtils.class) {
- mExtTelephony.asBinder().unlinkToDeath(mDeathRecipient, 0);
- mExtTelephony = null;
- }
- }
- };
-
- // This class is not supposed to be instantiated externally
- private TelephonyExtUtils(Context context) {
- if (DEBUG) Log.d(TAG, "Registering listeners!");
-
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(ACTION_UICC_MANUAL_PROVISION_STATUS_CHANGED);
- intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
- context.registerReceiver(mReceiver, intentFilter);
- }
-
- /**
- * Get an existing instance of the utils or create a new one if not existant
- *
- * @return An instance of this class
- */
- public static TelephonyExtUtils getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new TelephonyExtUtils(context.getApplicationContext());
- }
- return sInstance;
- }
-
- /**
- * Determines whether the ITelephonyExt service is available on the device
- * Any result of the methods in this class are only valid if this method returns true
- *
- * @return true on success
- */
- public boolean hasService() {
- return getService() != null;
- }
-
- /**
- * Determines whether the SIM associated with the given SubscriptionId is provisioned
- *
- * @return true if the SIM associated with the given subId is provisioned
- */
- public boolean isSubProvisioned(int subId) {
- return isSlotProvisioned(SubscriptionManager.getSlotIndex(subId));
- }
-
- /**
- * Determines whether the given SIM is provisioned
- *
- * @return true if the SIM is provisioned
- */
- public boolean isSlotProvisioned(int slotId) {
- return getCurrentUiccCardProvisioningStatus(slotId) == PROVISIONED;
- }
-
- /**
- * Get the current provisioning status for a given SIM slot
- *
- * @return The provisioning status from the extension or INVALID_STATE if not possible
- */
- public int getCurrentUiccCardProvisioningStatus(int slotId) {
- IExtTelephony service = getService();
- if (service != null && slotId != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
- try {
- return mExtTelephony.getCurrentUiccCardProvisioningStatus(slotId);
- } catch (RemoteException ex) {
- Log.e(TAG, "Failed to get provisioning status for slotId: " + slotId, ex);
- }
- }
- return INVALID_STATE;
- }
-
- /**
- * Activate the SIM card with the given slotId
- *
- * @return The result of the activation or -1
- */
- public int activateUiccCard(int slotId) {
- return setUiccCardProvisioningStatus(PROVISIONED, slotId);
- }
-
- /**
- * Deactivate the SIM card with the given slotId
- *
- * @return The result of the deactivation or -1
- */
- public int deactivateUiccCard(int slotId) {
- return setUiccCardProvisioningStatus(NOT_PROVISIONED, slotId);
- }
-
- private int setUiccCardProvisioningStatus(int provStatus, int slotId) {
- String actionStr;
- switch (provStatus) {
- case PROVISIONED:
- actionStr = "Activating";
- break;
- case NOT_PROVISIONED:
- actionStr = "Deactivating";
- break;
- default:
- Log.e(TAG, "Invalid argument for setUiccCardProvisioningStatus " +
- "(provStatus=" + provStatus + ", slotId=" + slotId + ")");
- return -1;
- }
-
- IExtTelephony service = getService();
- if (service == null) {
- return -1;
- }
-
- AsyncTask<Integer, Void, Integer> task = new AsyncTask<Integer, Void, Integer>() {
- @Override
- protected Integer doInBackground(Integer... params) {
- try {
- return params[0] == PROVISIONED
- ? mExtTelephony.activateUiccCard(params[1])
- : mExtTelephony.deactivateUiccCard(params[1]);
- } catch (RemoteException ex) {
- Log.e(TAG, actionStr + " sub failed for slotId: " + params[1]);
- }
- return -1;
- }
- };
-
- try {
- return task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, provStatus, slotId)
- .get(ACTIVATE_TIME_OUT, TimeUnit.MILLISECONDS);
- } catch (TimeoutException ex) {
- Log.e(TAG, actionStr + " sub timed out for slotId: " + slotId);
- SystemProperties.set(PROP_TIME_OUT, Integer.toString(slotId + 1));
- } catch (Exception ex) {
- Log.e(TAG, actionStr + " sub task failed for slotId: " + slotId);
- }
-
- return -1;
- }
-
- /**
- * Add a ProvisioningChangedListener to get notified in case of provisioning changes
- */
- public void addListener(ProvisioningChangedListener listener) {
- if (listener != null) {
- mListeners.remove(listener);
- mListeners.add(listener);
- }
- }
-
- /**
- * Remove a ProvisioningChangedListener to not get notified of provisioning changes anymore
- */
- public void removeListener(ProvisioningChangedListener listener) {
- if (listener != null) {
- mListeners.remove(listener);
- }
- }
-
- /**
- * Notify all registered listeners about provisioning changes
- */
- private void notifyListeners(int slotId, boolean provisioned) {
- for (ProvisioningChangedListener listener : mListeners) {
- listener.onProvisioningChanged(slotId, provisioned);
- }
- }
-
- /**
- * Helper method to get an already instantiated service or instantiate it
- *
- * @return a valid service instance or null
- */
- private IExtTelephony getService() {
- // We already tried to get the service but weren't successful, so just return null here
- if (mNoServiceAvailable) {
- if (DEBUG) Log.v(TAG, "Already tried to get a service without success, returning!");
- return null;
- }
-
- if (DEBUG) Log.d(TAG, "Retrieving the service");
-
- // Instead of getting a new service instance, return an already existing one here
- if (mExtTelephony != null) {
- if (DEBUG) Log.d(TAG, "Returning cached service instance");
- return mExtTelephony;
- }
-
- synchronized(TelephonyExtUtils.class) {
- try {
- mExtTelephony =
- IExtTelephony.Stub.asInterface(ServiceManager.getService("extphone"));
- if (mExtTelephony != null) {
- mExtTelephony.asBinder().linkToDeath(mDeathRecipient, 0);
- }
- } catch (NoClassDefFoundError ex) {
- // Ignore, device does not ship with telephony-ext
- Log.d(TAG, "Failed to get telephony extension service!");
- mNoServiceAvailable = true;
- } catch (RemoteException ex) {
- Log.d(TAG, "linkToDeath failed!");
- }
- }
-
- return mExtTelephony;
- }
-
- /**
- * Interface definition so we can register callbacks to get the provisioning status
- * whenever it changes
- */
- public interface ProvisioningChangedListener {
- public void onProvisioningChanged(int slotId, boolean isProvisioned);
- }
-}