Merge changes from topics 'embms-init-fix', 'embms-download-2' am: 281edb4ebc
am: cf2b2ec7eb

Change-Id: I5b8b4985ad4201519bf5fc8b987240cde77edc69
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 490f3fa..f7abeb9 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
@@ -60,6 +60,7 @@
     }};
 
     private static final String LOG_TAG = "EmbmsSampleDownload";
+    private static final long INITIALIZATION_DELAY = 200;
     private static final long SEND_FILE_SERVICE_INFO_DELAY = 500;
     private static final long DOWNLOAD_DELAY_MS = 1000;
     private static final long FILE_SEPARATION_DELAY = 500;
@@ -67,7 +68,8 @@
     private final IMbmsDownloadService mBinder = new MbmsDownloadServiceBase() {
         @Override
         public void initialize(String appName, int subId, IMbmsDownloadManagerCallback listener) {
-            String[] packageNames = getPackageManager().getPackagesForUid(Binder.getCallingUid());
+            int packageUid = Binder.getCallingUid();
+            String[] packageNames = getPackageManager().getPackagesForUid(packageUid);
             if (packageNames == null) {
                 throw new SecurityException("No matching packages found for your UID");
             }
@@ -77,24 +79,29 @@
                         "service");
             }
 
-            FrontendAppIdentifier appKey =
-                    new FrontendAppIdentifier(Binder.getCallingUid(), appName, subId);
-            if (!mAppCallbacks.containsKey(appKey)) {
-                mAppCallbacks.put(appKey, listener);
-                ComponentName appReceiver = MbmsDownloadManager.getAppReceiverFromUid(
-                        EmbmsSampleDownloadService.this, Binder.getCallingUid());
-                mAppReceivers.put(appKey, appReceiver);
-            } else {
-                // Stick the error callback on a different thread so that we're not calling back
-                // to the app on the same thread.
-                mHandler.post(() -> {
+            // Do initialization with a bit of a delay to simulate work being done.
+            mHandler.postDelayed(() -> {
+                FrontendAppIdentifier appKey =
+                        new FrontendAppIdentifier(packageUid, appName, subId);
+                if (!mAppCallbacks.containsKey(appKey)) {
+                    mAppCallbacks.put(appKey, listener);
+                    ComponentName appReceiver = MbmsDownloadManager.getAppReceiverFromUid(
+                            EmbmsSampleDownloadService.this, packageUid);
+                    mAppReceivers.put(appKey, appReceiver);
+                } else {
                     try {
                         listener.error(MbmsException.ERROR_ALREADY_INITIALIZED, "");
                     } catch (RemoteException e) {
                         // ignore, it was an error anyway
                     }
-                });
-            }
+                    return;
+                }
+                try {
+                    listener.middlewareReady();
+                } catch (RemoteException e) {
+                    // TODO: call dispose
+                }
+            }, INITIALIZATION_DELAY);
         }
 
         @Override
diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java
index 11a9bde..313512f 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java
@@ -49,6 +49,7 @@
 
     private static final String TAG = "EmbmsTestStreaming";
 
+    private static final long INITIALIZATION_DELAY = 200;
     private static final long SEND_SERVICE_LIST_DELAY = 300;
     private static final long START_STREAMING_DELAY = 500;
 
@@ -81,7 +82,8 @@
     private final IMbmsStreamingService.Stub mBinder = new MbmsStreamingServiceBase() {
         @Override
         public int initialize(IMbmsStreamingManagerCallback listener, String appName, int subId) {
-            String[] packageNames = getPackageManager().getPackagesForUid(Binder.getCallingUid());
+            int packageUid = Binder.getCallingUid();
+            String[] packageNames = getPackageManager().getPackagesForUid(packageUid);
             if (packageNames == null) {
                 throw new SecurityException("No matching packages found for your UID");
             }
@@ -91,13 +93,26 @@
                         "service");
             }
 
-            FrontendAppIdentifier appKey =
-                    new FrontendAppIdentifier(Binder.getCallingUid(), appName, subId);
-            if (!mAppCallbacks.containsKey(appKey)) {
-                mAppCallbacks.put(appKey, listener);
-            } else {
-                return MbmsException.ERROR_ALREADY_INITIALIZED;
-            }
+            mHandler.postDelayed(() -> {
+                FrontendAppIdentifier appKey =
+                        new FrontendAppIdentifier(packageUid, appName, subId);
+                if (!mAppCallbacks.containsKey(appKey)) {
+                    mAppCallbacks.put(appKey, listener);
+                } else {
+                    try {
+                        listener.error(MbmsException.ERROR_ALREADY_INITIALIZED, "");
+                    } catch (RemoteException e) {
+                        // ignore, it was an error anyway
+                    }
+                    return;
+                }
+                try {
+                    listener.middlewareReady();
+                } catch (RemoteException e) {
+                    StreamStateTracker.disposeAll(appKey);
+                    mAppCallbacks.remove(appKey);
+                }
+            }, INITIALIZATION_DELAY);
             return 0;
         }
 
diff --git a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
index 07c7d37..048e3dc 100644
--- a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
+++ b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
@@ -38,6 +38,11 @@
         android:layout_height="wrap_content"
         android:text="@string/bind_button" />
     <Button
+        android:id="@+id/set_temp_root_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/set_temp_root_button" />
+    <Button
         android:id="@+id/get_file_services_button"
         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 a29aea3..2d99962 100644
--- a/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
+++ b/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
@@ -19,4 +19,5 @@
     <string name="bind_button">Bind</string>
     <string name="request_dl_button">Request DL</string>
     <string name="get_file_services_button">Fetch file services</string>
+    <string name="set_temp_root_button">Set temp file root</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 b7d3e01..3937bbd 100644
--- a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
+++ b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
@@ -146,6 +146,12 @@
                             Toast.LENGTH_SHORT).show());
             updateFileServicesList(services);
         }
+
+        @Override
+        public void middlewareReady() {
+            runOnUiThread(() -> Toast.makeText(EmbmsTestDownloadApp.this,
+                    "Initialization done", Toast.LENGTH_SHORT).show());
+        }
     };
 
     private MbmsDownloadManager mDownloadManager;
@@ -172,20 +178,29 @@
         downloadedImages.setAdapter(mImageAdapter);
 
         Button bindButton = (Button) findViewById(R.id.bind_button);
-        bindButton.setOnClickListener((view) -> mHandler.post(() -> {
+        bindButton.setOnClickListener((view) -> {
             try {
-                mDownloadManager = MbmsDownloadManager.createManager(this, mCallback, APP_NAME);
-                File downloadDir = new File(EmbmsTestDownloadApp.this.getFilesDir(),
-                        CUSTOM_EMBMS_TEMP_FILE_LOCATION);
-                downloadDir.mkdirs();
-                mDownloadManager.setTempFileRootDirectory(downloadDir);
-                runOnUiThread(() -> Toast.makeText(EmbmsTestDownloadApp.this,
-                        "Initialization done", Toast.LENGTH_SHORT).show());
+                mDownloadManager = MbmsDownloadManager.create(this, mCallback, APP_NAME);
             } catch (MbmsException e) {
-                runOnUiThread(() -> Toast.makeText(EmbmsTestDownloadApp.this,
-                        "caught MbmsException: " + e.getErrorCode(), Toast.LENGTH_SHORT).show());
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "caught MbmsException: " + e.getErrorCode(), Toast.LENGTH_SHORT).show();
             }
-        }));
+        });
+
+        Button setTempFileRootButton = (Button) findViewById(R.id.set_temp_root_button);
+        setTempFileRootButton.setOnClickListener((view) -> {
+            File downloadDir = new File(EmbmsTestDownloadApp.this.getFilesDir(),
+                    CUSTOM_EMBMS_TEMP_FILE_LOCATION);
+            downloadDir.mkdirs();
+            try {
+                mDownloadManager.setTempFileRootDirectory(downloadDir);
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "temp file root set to " + downloadDir, Toast.LENGTH_SHORT).show();
+            } catch (MbmsException e) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "caught MbmsException: " + e.getErrorCode(), Toast.LENGTH_SHORT).show();
+            }
+        });
 
         Button getFileServicesButton = (Button) findViewById(R.id.get_file_services_button);
         getFileServicesButton.setOnClickListener((view) -> mHandler.post(() -> {
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 00e76c1..c3be6ef 100644
--- a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
+++ b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
@@ -54,6 +54,12 @@
                             Toast.LENGTH_SHORT).show());
             updateStreamingServicesList(services);
         }
+
+        @Override
+        public void middlewareReady() {
+            runOnUiThread(() -> Toast.makeText(EmbmsTestStreamingApp.this, "Successfully bound",
+                    Toast.LENGTH_SHORT).show());
+        }
     };
 
     private final class StreamingServiceInfoAdapter
@@ -151,22 +157,16 @@
         mTrackedStreamingServiceAdapter = new TrackedStreamAdapter(this);
 
         Button bindButton = (Button) findViewById(R.id.bind_button);
-        bindButton.setOnClickListener((view) ->
-            mHandler.post(() -> {
-                try {
-                    mStreamingManager = MbmsStreamingManager.create(
-                            EmbmsTestStreamingApp.this, mStreamingListener, APP_NAME);
-                } catch (MbmsException e) {
-                    EmbmsTestStreamingApp.this.runOnUiThread(() ->
-                            Toast.makeText(EmbmsTestStreamingApp.this,
-                                    "Init error: " + e.getErrorCode(), Toast.LENGTH_SHORT).show());
-                    return;
-                }
-                EmbmsTestStreamingApp.this.runOnUiThread(() ->
-                        Toast.makeText(EmbmsTestStreamingApp.this, "Successfully bound",
-                                Toast.LENGTH_SHORT).show());
-            })
-        );
+        bindButton.setOnClickListener((view) -> {
+            try {
+                mStreamingManager = MbmsStreamingManager.create(
+                        EmbmsTestStreamingApp.this, mStreamingListener, APP_NAME);
+            } catch (MbmsException e) {
+                Toast.makeText(EmbmsTestStreamingApp.this,
+                        "Init error: " + e.getErrorCode(), Toast.LENGTH_SHORT).show();
+                return;
+            }
+        });
 
         Button getStreamingServicesButton = (Button)
                 findViewById(R.id.get_streaming_services_button);