From c9948da02a00e431cce29adacacfc7675e396251 Mon Sep 17 00:00:00 2001 From: Sooraj Sasindran Date: Thu, 7 Mar 2019 15:52:59 -0800 Subject: [PATCH 1/2] Provide network bands in AvailableNetworkInfo Provide network bands in AvailableNetworkInfo Test: verified using CTS and make Bug: 123292899 Merged-In: I0d0a180eb4da3edf50a94ba621505ad95c7a262c Change-Id: I0d0a180eb4da3edf50a94ba621505ad95c7a262c --- api/current.txt | 5 +- .../telephony/AvailableNetworkInfo.java | 50 +++++++++++++++---- .../android/telephony/TelephonyManager.java | 10 ++-- 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/api/current.txt b/api/current.txt index 482a221ee80d3..5746403fd5419 100755 --- a/api/current.txt +++ b/api/current.txt @@ -42099,9 +42099,10 @@ package android.telephony { } public final class AvailableNetworkInfo implements android.os.Parcelable { - ctor public AvailableNetworkInfo(int, int, java.util.List); + ctor public AvailableNetworkInfo(int, int, @NonNull java.util.List, @NonNull java.util.List); method public int describeContents(); - method public java.util.List getMccMncs(); + method @NonNull public java.util.List getBands(); + method @NonNull public java.util.List getMccMncs(); method public int getPriority(); method public int getSubId(); method public void writeToParcel(android.os.Parcel, int); diff --git a/telephony/java/android/telephony/AvailableNetworkInfo.java b/telephony/java/android/telephony/AvailableNetworkInfo.java index b407b2a03bc47..8286e1e1712bc 100644 --- a/telephony/java/android/telephony/AvailableNetworkInfo.java +++ b/telephony/java/android/telephony/AvailableNetworkInfo.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; @@ -62,10 +63,21 @@ public final class AvailableNetworkInfo implements Parcelable { /** * Describes the List of PLMN ids (MCC-MNC) associated with mSubId. * If this entry is left empty, then the platform software will not scan the network - * to revalidate the input. + * to revalidate the input else platform will scan and verify specified PLMNs are available. */ private ArrayList mMccMncs; + /** + * Returns the frequency bands associated with the {@link #getMccMncs() MCC/MNCs}. + * Opportunistic network service will use these bands to scan. + * + * When no specific bands are specified (empty array or null) CBRS band (B48) will be + * used for network scan. + * + * See {@link AccessNetworkConstants} for details. + */ + private ArrayList mBands; + /** * Return subscription Id of the available network. * This value must be one of the entry retrieved from @@ -91,10 +103,20 @@ public final class AvailableNetworkInfo implements Parcelable { * to revalidate the input. * @return list of PLMN ids */ - public List getMccMncs() { + public @NonNull List getMccMncs() { return (List) mMccMncs.clone(); } + /** + * Returns the frequency bands that need to be scanned by opportunistic network service + * + * The returned value is defined in either of {@link AccessNetworkConstants.GeranBand}, + * {@link AccessNetworkConstants.UtranBand} and {@link AccessNetworkConstants.EutranBand} + */ + public @NonNull List getBands() { + return (List) mBands.clone(); + } + @Override public int describeContents() { return 0; @@ -105,6 +127,7 @@ public final class AvailableNetworkInfo implements Parcelable { dest.writeInt(mSubId); dest.writeInt(mPriority); dest.writeStringList(mMccMncs); + dest.writeList(mBands); } private AvailableNetworkInfo(Parcel in) { @@ -112,12 +135,16 @@ public final class AvailableNetworkInfo implements Parcelable { mPriority = in.readInt(); mMccMncs = new ArrayList<>(); in.readStringList(mMccMncs); + mBands = new ArrayList<>(); + in.readList(mBands, Integer.class.getClassLoader()); } - public AvailableNetworkInfo(int subId, int priority, List mccMncs) { + public AvailableNetworkInfo(int subId, int priority, @NonNull List mccMncs, + @NonNull List bands) { mSubId = subId; mPriority = priority; mMccMncs = new ArrayList(mccMncs); + mBands = new ArrayList(bands); } @Override @@ -135,14 +162,15 @@ public final class AvailableNetworkInfo implements Parcelable { } return (mSubId == ani.mSubId - && mPriority == ani.mPriority - && (((mMccMncs != null) - && mMccMncs.equals(ani.mMccMncs)))); + && mPriority == ani.mPriority + && (((mMccMncs != null) + && mMccMncs.equals(ani.mMccMncs))) + && mBands.equals(ani.mBands)); } @Override public int hashCode() { - return Objects.hash(mSubId, mPriority, mMccMncs); + return Objects.hash(mSubId, mPriority, mMccMncs, mBands); } public static final Parcelable.Creator CREATOR = @@ -161,9 +189,9 @@ public final class AvailableNetworkInfo implements Parcelable { @Override public String toString() { return ("AvailableNetworkInfo:" - + " mSubId: " + mSubId - + " mPriority: " + mPriority - + " mMccMncs: " + Arrays.toString(mMccMncs.toArray())); + + " mSubId: " + mSubId + + " mPriority: " + mPriority + + " mMccMncs: " + Arrays.toString(mMccMncs.toArray()) + + " mBands: " + Arrays.toString(mBands.toArray())); } } - diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 27720495bfc8a..22614a2be1924 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -10243,11 +10243,11 @@ public class TelephonyManager { /** * Update availability of a list of networks in the current location. * - * This api should be called by opportunistic network selection app to inform - * OpportunisticNetwork Service about the availability of a network at the current location. - * This information will be used by OpportunisticNetwork service to decide to attach to the - * network opportunistically. - * If an empty list is passed, it is assumed that no network is available. + * This api should be called to inform OpportunisticNetwork Service about the availability + * of a network at the current location. This information will be used by OpportunisticNetwork + * service to decide to attach to the network opportunistically. If an empty list is passed, + * it is assumed that no network is available and will result in disabling the modem stack + * to save power. * Requires that the calling app has carrier privileges on both primary and * secondary subscriptions (see {@link #hasCarrierPrivileges}), or has permission * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. From 3b09d711f903266eaaa8af4c3b7e1cb121e718a1 Mon Sep 17 00:00:00 2001 From: Sooraj Sasindran Date: Thu, 28 Feb 2019 14:46:14 -0800 Subject: [PATCH 2/2] Should not turn on validation for data Should not turn on validation for data switch every time. Provide result as a callback Test: verified manually Bug: 126264455 Merged-In: I5df2311d91fdab34563148b4466163696e52faf9 Change-Id: I5df2311d91fdab34563148b4466163696e52faf9 --- api/current.txt | 2 +- api/system-current.txt | 2 +- .../telephony/SubscriptionManager.java | 9 +++--- .../android/telephony/TelephonyManager.java | 32 +++++++++++++++---- .../com/android/internal/telephony/IOns.aidl | 8 +++-- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/api/current.txt b/api/current.txt index 5746403fd5419..98502c890e3a3 100755 --- a/api/current.txt +++ b/api/current.txt @@ -43118,7 +43118,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setNetworkSelectionModeManual(String, boolean); method public boolean setOperatorBrandOverride(String); method public boolean setPreferredNetworkTypeToGlobal(); - method public boolean setPreferredOpportunisticDataSubscription(int); + method public void setPreferredOpportunisticDataSubscription(int, boolean, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer); method public void setVisualVoicemailSmsFilterSettings(android.telephony.VisualVoicemailSmsFilterSettings); method public boolean setVoiceMailNumber(String, String); method @Deprecated public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri); diff --git a/api/system-current.txt b/api/system-current.txt index b89a1da22ca27..050d179139a6d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6317,7 +6317,7 @@ package android.telephony { method public void requestEmbeddedSubscriptionInfoListRefresh(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultDataSubId(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @NonNull java.util.concurrent.Executor, java.util.function.Consumer); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSubscriptionEnabled(int, boolean); field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI; field public static final int PROFILE_CLASS_DEFAULT = -1; // 0xffffffff diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index e6bf5a30c5c8f..90df45af66456 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2597,7 +2597,7 @@ public class SubscriptionManager { @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int subId, boolean needValidation, - @NonNull @CallbackExecutor Executor executor, Consumer callback) { + @Nullable @CallbackExecutor Executor executor, @Nullable Consumer callback) { if (VDBG) logd("[setPreferredDataSubscriptionId]+ subId:" + subId); try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); @@ -2606,10 +2606,11 @@ public class SubscriptionManager { ISetOpportunisticDataCallback callbackStub = new ISetOpportunisticDataCallback.Stub() { @Override public void onComplete(int result) { + if (executor == null || callback == null) { + return; + } Binder.withCleanCallingIdentity(() -> executor.execute(() -> { - if (callback != null) { - callback.accept(result); - } + callback.accept(result); })); } }; diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 22614a2be1924..a0c14e30b0066 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -81,6 +81,7 @@ import com.android.internal.telephony.CellNetworkScanResult; import com.android.internal.telephony.INumberVerificationCallback; import com.android.internal.telephony.IOns; import com.android.internal.telephony.IPhoneSubInfo; +import com.android.internal.telephony.ISetOpportunisticDataCallback; import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.IUpdateAvailableNetworksCallback; @@ -10194,21 +10195,40 @@ public class TelephonyManager { * @param subId which opportunistic subscription * {@link SubscriptionManager#getOpportunisticSubscriptions} is preferred for cellular data. * Pass {@link SubscriptionManager#DEFAULT_SUBSCRIPTION_ID} to unset the preference - * @return true if request is accepted, else false. + * @param needValidation whether validation is needed before switch happens. + * @param executor The executor of where the callback will execute. + * @param callback Callback will be triggered once it succeeds or failed. + * See {@link TelephonyManager.SetOpportunisticSubscriptionResult} + * for more details. Pass null if don't care about the result. * */ - public boolean setPreferredOpportunisticDataSubscription(int subId) { + public void setPreferredOpportunisticDataSubscription(int subId, boolean needValidation, + @Nullable @CallbackExecutor Executor executor, @Nullable Consumer callback) { String pkgForDebug = mContext != null ? mContext.getOpPackageName() : ""; try { IOns iOpportunisticNetworkService = getIOns(); - if (iOpportunisticNetworkService != null) { - return iOpportunisticNetworkService - .setPreferredDataSubscriptionId(subId, pkgForDebug); + if (iOpportunisticNetworkService == null) { + return; } + ISetOpportunisticDataCallback callbackStub = new ISetOpportunisticDataCallback.Stub() { + @Override + public void onComplete(int result) { + if (executor == null || callback == null) { + return; + } + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(result); + })); + } + }; + + iOpportunisticNetworkService + .setPreferredDataSubscriptionId(subId, needValidation, callbackStub, + pkgForDebug); } catch (RemoteException ex) { Rlog.e(TAG, "setPreferredDataSubscriptionId RemoteException", ex); } - return false; + return; } /** diff --git a/telephony/java/com/android/internal/telephony/IOns.aidl b/telephony/java/com/android/internal/telephony/IOns.aidl index 4672e2d443012..a74498f680db8 100755 --- a/telephony/java/com/android/internal/telephony/IOns.aidl +++ b/telephony/java/com/android/internal/telephony/IOns.aidl @@ -19,6 +19,8 @@ package com.android.internal.telephony; import android.telephony.AvailableNetworkInfo; import com.android.internal.telephony.IUpdateAvailableNetworksCallback; +import com.android.internal.telephony.ISetOpportunisticDataCallback; + interface IOns { /** @@ -63,11 +65,13 @@ interface IOns { * @param subId which opportunistic subscription * {@link SubscriptionManager#getOpportunisticSubscriptions} is preferred for cellular data. * Pass {@link SubscriptionManager#DEFAULT_SUBSCRIPTION_ID} to unset the preference + * @param needValidation whether validation is needed before switch happens. + * @param callback callback upon request completion. * @param callingPackage caller's package name - * @return true if request is accepted, else false. * */ - boolean setPreferredDataSubscriptionId(int subId, String callingPackage); + void setPreferredDataSubscriptionId(int subId, boolean needValidation, + ISetOpportunisticDataCallback callbackStub, String callingPackage); /** * Get preferred opportunistic data subscription Id