Merge "Provide network bands in AvailableNetworkInfo"
diff --git a/api/current.txt b/api/current.txt
index 63c43fc..63ca6da 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -44135,9 +44135,10 @@
   }
 
   public final class AvailableNetworkInfo implements android.os.Parcelable {
-    ctor public AvailableNetworkInfo(int, int, java.util.List<java.lang.String>);
+    ctor public AvailableNetworkInfo(int, int, @NonNull java.util.List<java.lang.String>, @NonNull java.util.List<java.lang.Integer>);
     method public int describeContents();
-    method public java.util.List<java.lang.String> getMccMncs();
+    method @NonNull public java.util.List<java.lang.Integer> getBands();
+    method @NonNull public java.util.List<java.lang.String> 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 8a7153e..a15f959 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,11 +63,22 @@
     /**
      * 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<String> 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<Integer> mBands;
+
+    /**
      * Return subscription Id of the available network.
      * This value must be one of the entry retrieved from
      * {@link SubscriptionManager#getOpportunisticSubscriptions}
@@ -91,10 +103,20 @@
      * to revalidate the input.
      * @return list of PLMN ids
      */
-    public List<String> getMccMncs() {
+    public @NonNull List<String> getMccMncs() {
         return (List<String>) 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<Integer> getBands() {
+        return (List<Integer>) mBands.clone();
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -105,6 +127,7 @@
         dest.writeInt(mSubId);
         dest.writeInt(mPriority);
         dest.writeStringList(mMccMncs);
+        dest.writeList(mBands);
     }
 
     private AvailableNetworkInfo(Parcel in) {
@@ -112,12 +135,16 @@
         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<String> mccMncs) {
+    public AvailableNetworkInfo(int subId, int priority, @NonNull List<String> mccMncs,
+            @NonNull List<Integer> bands) {
         mSubId = subId;
         mPriority = priority;
         mMccMncs = new ArrayList<String>(mccMncs);
+        mBands = new ArrayList<Integer>(bands);
     }
 
     @Override
@@ -135,14 +162,15 @@
         }
 
         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 @android.annotation.NonNull Parcelable.Creator<AvailableNetworkInfo> CREATOR =
@@ -161,9 +189,9 @@
     @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 beba14f..9ca5717 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -10305,11 +10305,11 @@
     /**
      * 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}.