Merge "Implement the new requestNetworkScan API with current modem API."
diff --git a/testapps/EmbmsServiceTestApp/Android.mk b/testapps/EmbmsServiceTestApp/Android.mk
index 4dc522c..874fad2 100644
--- a/testapps/EmbmsServiceTestApp/Android.mk
+++ b/testapps/EmbmsServiceTestApp/Android.mk
@@ -15,5 +15,6 @@
 LOCAL_PRIVILEGED_MODULE := true
 # Change the following to "debug" to build the EmbmsTestService into the userdebug build.
 LOCAL_MODULE_TAGS := optional
+#LOCAL_MODULE_TAGS := debug
 
 include $(BUILD_PACKAGE)
diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/AppActiveStreams.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/AppActiveStreams.java
index 35d18e9..6a0f61e 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/AppActiveStreams.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/AppActiveStreams.java
@@ -22,6 +22,7 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Random;
 
 // Tracks the states of the streams for a single (uid, appName, subscriptionId) tuple
 public class AppActiveStreams {
@@ -29,10 +30,13 @@
     private static class StreamCallbackWithState {
         private final IStreamingServiceCallback mCallback;
         private int mState;
+        private int mMethod;
+        private boolean mMethodSet = false;
 
-        public StreamCallbackWithState(IStreamingServiceCallback callback, int state) {
+        StreamCallbackWithState(IStreamingServiceCallback callback, int state, int method) {
             mCallback = callback;
             mState = state;
+            mMethod = method;
         }
 
         public IStreamingServiceCallback getCallback() {
@@ -46,11 +50,25 @@
         public void setState(int state) {
             mState = state;
         }
+
+        public int getMethod() {
+            return mMethod;
+        }
+
+        public void setMethod(int method) {
+            mMethod = method;
+            mMethodSet = true;
+        }
+
+        public boolean isMethodSet() {
+            return mMethodSet;
+        }
     }
 
     // Stores the state and callback per service ID.
     private final Map<String, StreamCallbackWithState> mStreamStates = new HashMap<>();
     private final StreamingAppIdentifier mAppIdentifier;
+    private final Random mRand = new Random();
 
     public AppActiveStreams(StreamingAppIdentifier appIdentifier) {
         mAppIdentifier = appIdentifier;
@@ -63,10 +81,22 @@
     }
 
     public void startStreaming(String serviceId, IStreamingServiceCallback callback) {
+        if (mStreamStates.get(serviceId) != null) {
+            // error - already started
+            return;
+        }
+        for (StreamCallbackWithState c : mStreamStates.values()) {
+            if (c.getCallback() == callback) {
+                // error - callback already in use
+                return;
+            }
+        }
         mStreamStates.put(serviceId,
-                new StreamCallbackWithState(callback, StreamingService.STATE_STARTED));
+                new StreamCallbackWithState(callback, StreamingService.STATE_STARTED,
+                        StreamingService.UNICAST_METHOD));
         try {
-            callback.streamStateChanged(StreamingService.STATE_STARTED);
+            callback.streamStateUpdated(StreamingService.STATE_STARTED);
+            updateStreamingMethod(serviceId);
         } catch (RemoteException e) {
             dispose(serviceId);
         }
@@ -79,7 +109,7 @@
             try {
                 if (entry.getState() != StreamingService.STATE_STOPPED) {
                     entry.setState(StreamingService.STATE_STOPPED);
-                    entry.getCallback().streamStateChanged(StreamingService.STATE_STOPPED);
+                    entry.getCallback().streamStateUpdated(StreamingService.STATE_STOPPED);
                 }
             } catch (RemoteException e) {
                 dispose(serviceId);
@@ -90,4 +120,25 @@
     public void dispose(String serviceId) {
         mStreamStates.remove(serviceId);
     }
+
+    private void updateStreamingMethod(String serviceId) {
+        StreamCallbackWithState callbackWithState = mStreamStates.get(serviceId);
+        if (callbackWithState != null) {
+            int oldMethod = callbackWithState.getMethod();
+            int newMethod = oldMethod;
+            if (mRand.nextInt(99) < 50) {
+                newMethod = StreamingService.UNICAST_METHOD;
+            } else {
+                newMethod = StreamingService.BROADCAST_METHOD;
+            }
+            if (newMethod != oldMethod || callbackWithState.isMethodSet()) {
+                callbackWithState.setMethod(newMethod);
+                try {
+                    callbackWithState.getCallback().streamMethodUpdated(newMethod);
+                } catch (RemoteException e) {
+                    dispose(serviceId);
+                }
+            }
+        }
+    }
 }
diff --git a/testapps/EmbmsTestStreamingApp/Android.mk b/testapps/EmbmsTestStreamingApp/Android.mk
index 2700522..45826b9 100644
--- a/testapps/EmbmsTestStreamingApp/Android.mk
+++ b/testapps/EmbmsTestStreamingApp/Android.mk
@@ -13,5 +13,6 @@
 
 LOCAL_CERTIFICATE := platform
 LOCAL_MODULE_TAGS := tests
+#LOCAL_MODULE_TAGS := debug
 
 include $(BUILD_PACKAGE)
diff --git a/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml b/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml
index c1cc539..b75a157 100644
--- a/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml
+++ b/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml
@@ -30,6 +30,10 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"/>
     <TextView
+        android:id="@+id/curr_streaming_method"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+    <TextView
         android:id="@+id/tracked_streams_label"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
index aa4a15b..00e76c1 100644
--- a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
+++ b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
@@ -25,6 +25,7 @@
 import android.telephony.MbmsStreamingManager;
 import android.telephony.mbms.MbmsException;
 import android.telephony.mbms.MbmsStreamingManagerCallback;
+import android.telephony.mbms.StreamingService;
 import android.telephony.mbms.StreamingServiceInfo;
 import android.view.View;
 import android.view.ViewGroup;
@@ -295,9 +296,28 @@
         });
     }
 
+    private void setStreamMethodDisplay(int method) {
+        runOnUiThread(() -> {
+            String methodString = "UNKNOWN METHOD";
+            switch (method) {
+                case StreamingService.BROADCAST_METHOD: {
+                    methodString = "BROADCAST";
+                    break;
+                }
+                case StreamingService.UNICAST_METHOD: {
+                    methodString = "UNICAST";
+                    break;
+                }
+            }
+            TextView methodField = (TextView) findViewById(R.id.curr_streaming_method);
+            methodField.setText(methodString);
+        });
+    }
+
     private void clearStateAndUriDisplay() {
         setUriDisplay(Uri.EMPTY);
         setStreamStateDisplay("");
+        setStreamMethodDisplay(StreamingService.UNICAST_METHOD);
     }
 
     public void updateUri() {
@@ -311,4 +331,14 @@
             "" : String.valueOf(getSelectedTrackedStream().getState());
         setStreamStateDisplay(stateString);
     }
+
+    /** implementation of updateMethod callback */
+    public void updateMethod() {
+        StreamingServiceTracker serviceTracker = getSelectedTrackedStream();
+        if (serviceTracker == null) {
+            setStreamMethodDisplay(StreamingService.UNICAST_METHOD);
+        } else {
+            setStreamMethodDisplay(serviceTracker.getMethod());
+        }
+    }
 }
diff --git a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
index c0b12cb..9ca4476 100644
--- a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
+++ b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
@@ -34,8 +34,13 @@
         }
 
         @Override
-        public void streamStateChanged(int state) {
-            onStreamStateChanged(state);
+        public void streamStateUpdated(int state) {
+            onStreamStateUpdated(state);
+        }
+
+        @Override
+        public void streamMethodUpdated(int method) {
+            onStreamMethodUpdated(method);
         }
     }
 
@@ -45,6 +50,7 @@
 
     private int mState = StreamingService.STATE_STOPPED;
     private Uri mStreamingUri = Uri.EMPTY;
+    private int mMethod = StreamingService.UNICAST_METHOD;
 
     public StreamingServiceTracker(EmbmsTestStreamingApp appActivity, StreamingServiceInfo info) {
         mActivity = appActivity;
@@ -96,7 +102,11 @@
         return mStreamingUri;
     }
 
-    private void onStreamStateChanged(int state) {
+    public int getMethod() {
+        return mMethod;
+    }
+
+    private void onStreamStateUpdated(int state) {
         if (state == StreamingService.STATE_STARTED && mState != StreamingService.STATE_STARTED) {
             try {
                 mStreamingUri = mStreamingService.getPlaybackUri();
@@ -111,6 +121,13 @@
         mActivity.updateStreamingState();
     }
 
+    private void onStreamMethodUpdated(int method) {
+        if (mMethod != method) {
+            mMethod = method;
+            mActivity.updateMethod();
+        }
+    }
+
     @Override
     public String toString() {
         return "Tracked service with ID " + getServiceId();