From 8314fa72f27d0358ab29681fee5dfa4a4276946c Mon Sep 17 00:00:00 2001 From: Qingxi Li Date: Thu, 14 Dec 2017 15:36:06 -0800 Subject: [PATCH] Add API EuiccController#startOtaUpdatingIfNecessary This function requests calling app has WRITE_EMBEDDED_SUBSCRIPTIONS permission. It will check whether the OTA update needed to be done first. If current eUICC OS isn't latest one and OTA needed to be performed, it will update eUICC OS. When the OS update is started or finished, a broadcast will be sent. Bug: 37279356 Test: E2E Merged-In: Iea86add4bdc01c79a8714af4b3a89735ba78ee74 Change-Id: Iea86add4bdc01c79a8714af4b3a89735ba78ee74 --- Android.bp | 1 + .../android/service/euicc/EuiccService.java | 42 +++++++++++++++++++ .../android/service/euicc/IEuiccService.aidl | 2 + .../euicc/IOtaStatusChangedCallback.aidl | 22 ++++++++++ core/res/AndroidManifest.xml | 3 ++ .../android/telephony/euicc/EuiccManager.java | 14 +++++++ 6 files changed, 84 insertions(+) create mode 100644 core/java/android/service/euicc/IOtaStatusChangedCallback.aidl diff --git a/Android.bp b/Android.bp index d4b15caf30472..e6aa7cf0f61ac 100644 --- a/Android.bp +++ b/Android.bp @@ -248,6 +248,7 @@ java_library { "core/java/android/service/euicc/IGetEuiccInfoCallback.aidl", "core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl", "core/java/android/service/euicc/IGetOtaStatusCallback.aidl", + "core/java/android/service/euicc/IOtaStatusChangedCallback.aidl", "core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl", "core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl", "core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl", diff --git a/core/java/android/service/euicc/EuiccService.java b/core/java/android/service/euicc/EuiccService.java index fb530074d5b06..be8580074f73b 100644 --- a/core/java/android/service/euicc/EuiccService.java +++ b/core/java/android/service/euicc/EuiccService.java @@ -192,6 +192,18 @@ public abstract class EuiccService extends Service { return mStubWrapper; } + /** + * Callback class for {@link #onStartOtaIfNecessary(int, OtaStatusChangedCallback)} + * + * The status of OTA which can be {@code android.telephony.euicc.EuiccManager#EUICC_OTA_} + * + * @see IEuiccService#startOtaIfNecessary + */ + public interface OtaStatusChangedCallback { + /** Called when OTA status is changed. */ + void onOtaStatusChanged(int status); + } + /** * Return the EID of the eUICC. * @@ -213,6 +225,16 @@ public abstract class EuiccService extends Service { */ public abstract @OtaStatus int onGetOtaStatus(int slotId); + /** + * Perform OTA if current OS is not the latest one. + * + * @param slotId ID of the SIM slot to use for the operation. This is currently not populated + * but is here to future-proof the APIs. + * @param statusChangedCallback Function called when OTA status changed. + */ + public abstract void onStartOtaIfNecessary( + int slotId, OtaStatusChangedCallback statusChangedCallback); + /** * Populate {@link DownloadableSubscription} metadata for the given downloadable subscription. * @@ -395,6 +417,26 @@ public abstract class EuiccService extends Service { }); } + @Override + public void startOtaIfNecessary( + int slotId, IOtaStatusChangedCallback statusChangedCallback) { + mExecutor.execute(new Runnable() { + @Override + public void run() { + EuiccService.this.onStartOtaIfNecessary(slotId, new OtaStatusChangedCallback() { + @Override + public void onOtaStatusChanged(int status) { + try { + statusChangedCallback.onOtaStatusChanged(status); + } catch (RemoteException e) { + // Can't communicate with the phone process; ignore. + } + } + }); + } + }); + } + @Override public void getOtaStatus(int slotId, IGetOtaStatusCallback callback) { mExecutor.execute(new Runnable() { diff --git a/core/java/android/service/euicc/IEuiccService.aidl b/core/java/android/service/euicc/IEuiccService.aidl index a24e5c35c1cbe..45be52740f321 100644 --- a/core/java/android/service/euicc/IEuiccService.aidl +++ b/core/java/android/service/euicc/IEuiccService.aidl @@ -25,6 +25,7 @@ import android.service.euicc.IGetEidCallback; import android.service.euicc.IGetEuiccInfoCallback; import android.service.euicc.IGetEuiccProfileInfoListCallback; import android.service.euicc.IGetOtaStatusCallback; +import android.service.euicc.IOtaStatusChangedCallback; import android.service.euicc.IRetainSubscriptionsForFactoryResetCallback; import android.service.euicc.ISwitchToSubscriptionCallback; import android.service.euicc.IUpdateSubscriptionNicknameCallback; @@ -39,6 +40,7 @@ oneway interface IEuiccService { boolean forceDeactivateSim, in IGetDownloadableSubscriptionMetadataCallback callback); void getEid(int slotId, in IGetEidCallback callback); void getOtaStatus(int slotId, in IGetOtaStatusCallback callback); + void startOtaIfNecessary(int slotId, in IOtaStatusChangedCallback statusChangedCallback); void getEuiccProfileInfoList(int slotId, in IGetEuiccProfileInfoListCallback callback); void getDefaultDownloadableSubscriptionList(int slotId, boolean forceDeactivateSim, in IGetDefaultDownloadableSubscriptionListCallback callback); diff --git a/core/java/android/service/euicc/IOtaStatusChangedCallback.aidl b/core/java/android/service/euicc/IOtaStatusChangedCallback.aidl new file mode 100644 index 0000000000000..caec75f13f615 --- /dev/null +++ b/core/java/android/service/euicc/IOtaStatusChangedCallback.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2017 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.service.euicc; + +/** @hide */ +oneway interface IOtaStatusChangedCallback { + void onOtaStatusChanged(int status); +} \ No newline at end of file diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4b2ae06eff2f2..fdda55bfa01bd 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -563,6 +563,9 @@ + + + diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index f777649283e75..3dfadf585c28a 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -60,6 +60,20 @@ public class EuiccManager { public static final String ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS = "android.telephony.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS"; + + /** + * Broadcast Action: The eUICC OTA status is changed. + *

+ * Requires the {@link android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission. + * + *

This is a protected intent that can only be sent + * by the system. + * TODO(b/35851809): Make this a SystemApi. + */ + @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_OTA_STATUS_CHANGED + = "android.telephony.euicc.action.OTA_STATUS_CHANGED"; + /** * Intent action to provision an embedded subscription. *