Merge "Adds DownloadStateCallback test to EMBMS Download TestApp" into oc-mr1-dev
diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
index dcb7320..093d683 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
@@ -32,6 +32,7 @@
 import android.os.RemoteException;
 import android.telephony.MbmsDownloadSession;
 import android.telephony.mbms.DownloadRequest;
+import android.telephony.mbms.DownloadStateCallback;
 import android.telephony.mbms.FileInfo;
 import android.telephony.mbms.FileServiceInfo;
 import android.telephony.mbms.MbmsDownloadSessionCallback;
@@ -142,6 +143,13 @@
         }
 
         @Override
+        public int registerStateCallback(DownloadRequest downloadRequest,
+                DownloadStateCallback callback) throws RemoteException {
+            mDownloadStateCallbacks.put(downloadRequest, callback);
+            return MbmsErrors.SUCCESS;
+        }
+
+        @Override
         public int cancelDownload(DownloadRequest downloadRequest) {
             FrontendAppIdentifier appKey = new FrontendAppIdentifier(
                     Binder.getCallingUid(), downloadRequest.getSubscriptionId());
@@ -175,6 +183,8 @@
     // A map of app-identifiers to (maps of service-ids to sets of temp file uris in use)
     private final Map<FrontendAppIdentifier, Map<String, Set<Uri>>> mTempFilesInUse =
             new ConcurrentHashMap<>();
+    private final Map<DownloadRequest, DownloadStateCallback> mDownloadStateCallbacks =
+            new ConcurrentHashMap<>();
 
     private HandlerThread mHandlerThread;
     private Handler mHandler;
@@ -323,6 +333,16 @@
     private void downloadSingleFile(FrontendAppIdentifier appKey, DownloadRequest request,
             UriPathPair tempFile, FileInfo fileToDownload) {
         int result = MbmsDownloadSession.RESULT_SUCCESSFUL;
+        // Test Callback
+        DownloadStateCallback c = mDownloadStateCallbacks.get(request);
+        if (c != null) {
+            c.onProgressUpdated(request, fileToDownload, 0, 10, 0, 10);
+        }
+        // Test Callback
+        if (c != null) {
+            c.onStateUpdated(request, fileToDownload,
+                    MbmsDownloadSession.STATUS_ACTIVELY_DOWNLOADING);
+        }
         try {
             // Get the ParcelFileDescriptor for the single temp file we requested
             ParcelFileDescriptor tempFileFd = getContentResolver().openFileDescriptor(
@@ -346,7 +366,10 @@
         } catch (IOException e) {
             result = MbmsDownloadSession.RESULT_CANCELLED;
         }
-
+        // Test Callback
+        if (c != null) {
+            c.onProgressUpdated(request, fileToDownload, 10, 10, 10, 10);
+        }
         // Take a round-trip through the download request serialization to exercise it
         DownloadRequest request1 = new DownloadRequest.Builder()
                 .setSource(request.getSourceUri())
diff --git a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
index 076bc37..1aea6a5 100644
--- a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
+++ b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
@@ -105,9 +105,31 @@
                 android:layout_row="4"
                 android:layout_column="0"
                 android:text="@string/cancel_download_button" />
+            <Button
+                android:id="@+id/register_state_callback_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="5"
+                android:layout_column="0"
+                android:text="@string/register_state_callback_button" />
+            <Button
+                android:id="@+id/register_progress_callback_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="5"
+                android:layout_column="1"
+                android:text="@string/register_progress_callback_button" />
+            <Button
+                android:id="@+id/register_all_callback_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="6"
+                android:layout_column="0"
+                android:text="@string/register_all_callback_button" />
+
             <Spinner
                 android:id="@+id/active_downloads"
-                android:layout_row="4"
+                android:layout_row="7"
                 android:layout_column="1"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
diff --git a/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml b/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
index 13d9fc2..b032b26 100644
--- a/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
+++ b/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
@@ -24,4 +24,7 @@
     <string name="request_spurious_temp_files_button">Request more temp files</string>
     <string name="delay_download_button">Delay download</string>
     <string name="cancel_download_button">Cancel download</string>
+    <string name="register_state_callback_button">Register State Cb</string>
+    <string name="register_progress_callback_button">Register Progress Cb</string>
+    <string name="register_all_callback_button">Register All Cbs</string>
 </resources>
\ No newline at end of file
diff --git a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
index 23f2cc5..2d668c9 100644
--- a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
+++ b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
@@ -28,6 +28,8 @@
 import android.telephony.MbmsDownloadSession;
 import android.telephony.SubscriptionManager;
 import android.telephony.mbms.DownloadRequest;
+import android.telephony.mbms.DownloadStateCallback;
+import android.telephony.mbms.FileInfo;
 import android.telephony.mbms.FileServiceInfo;
 import android.telephony.mbms.MbmsDownloadSessionCallback;
 import android.util.Log;
@@ -274,6 +276,109 @@
             mDownloadManager.cancelDownload(request);
             mDownloadRequestAdapter.remove(request);
         });
+
+        Button registerProgressCallback =
+                (Button) findViewById(R.id.register_progress_callback_button);
+        registerProgressCallback.setOnClickListener((view) -> {
+            if (mDownloadManager == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No download service bound", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            DownloadRequest req = (DownloadRequest) downloadRequestSpinner.getSelectedItem();
+            if (req == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No DownloadRequest Pending for progress...", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            mDownloadManager.registerStateCallback(req, new DownloadStateCallback(
+                    DownloadStateCallback.PROGRESS_UPDATES) {
+                @Override
+                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
+                        int fullDecodedSize) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
+                                    + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo, int state) {
+                    // only registered for state callback, this shouldn't happen!
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "State ERROR: received state update for callback that didn't filter it",
+                            Toast.LENGTH_SHORT).show();
+                }
+            }, sInstance.getMainThreadHandler());
+        });
+
+        Button registerStateCallback =
+                (Button) findViewById(R.id.register_state_callback_button);
+        registerStateCallback.setOnClickListener((view) -> {
+            if (mDownloadManager == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No download service bound", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            DownloadRequest req = (DownloadRequest) downloadRequestSpinner.getSelectedItem();
+            if (req == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No DownloadRequest Pending for state...", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            mDownloadManager.registerStateCallback(req, new DownloadStateCallback(
+                    DownloadStateCallback.STATE_UPDATES) {
+                @Override
+                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
+                        int fullDecodedSize) {
+                    // only registered for state callback, this shouldn't happen!
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "Progress ERROR: received progress update for callback that didn't "
+                                    + "filter it", Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo, int state) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "State Updated (" + fileInfo + ") state: " + state,
+                            Toast.LENGTH_SHORT).show();
+                }
+            }, sInstance.getMainThreadHandler());
+        });
+
+        Button registerAllCallbacks =
+                (Button) findViewById(R.id.register_all_callback_button);
+        registerAllCallbacks.setOnClickListener((view) -> {
+            if (mDownloadManager == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No download service bound", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            DownloadRequest req = (DownloadRequest) downloadRequestSpinner.getSelectedItem();
+            if (req == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No DownloadRequest Pending for state...", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            mDownloadManager.registerStateCallback(req, new DownloadStateCallback() {
+                @Override
+                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
+                        int fullDecodedSize) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
+                                    + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo, int state) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "State Updated (" + fileInfo + ") state: " + state,
+                            Toast.LENGTH_SHORT).show();
+                }
+            }, sInstance.getMainThreadHandler());
+        });
     }
 
     @Override