Handling of issues while migrating primary storage

Bug: 28177789
Change-Id: Icfbd048ddf0a1d55df1e7273d49727357b98a452
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4f5c7b3..eaa6dc0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3432,6 +3432,10 @@
     <!-- Manage applications, text for Move button when move is in progress -->
     <string name="moving">Moving</string>
 
+    <!-- Text of pop up message if the request for a "migrate primary storage" operation
+         (see storage_menu_migrate) is denied as another is already in progress. [CHAR LIMIT=75] -->
+    <string name="another_migration_already_in_progress">Another migration is already in progress.</string>
+
     <!-- Manage applications, text for move error messages -->
     <string name="insufficient_storage">Not enough storage space.</string>
     <string name="does_not_exist">App doesn\u2019t exist.</string>
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
index 3eae081..7b98dc2 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
@@ -19,11 +19,16 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
+import android.os.storage.DiskInfo;
+import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
 import android.util.Log;
 
+import android.widget.Toast;
 import com.android.settings.R;
 
+import java.util.Objects;
+
 import static com.android.settings.deviceinfo.StorageSettings.TAG;
 
 public class StorageWizardMigrateConfirm extends StorageWizardBase {
@@ -70,7 +75,31 @@
 
     @Override
     public void onNavigateNext() {
-        final int moveId = getPackageManager().movePrimaryStorage(mVolume);
+        int moveId;
+
+        // We only expect exceptions from MountService#setPrimaryStorageUuid
+        try {
+            moveId = getPackageManager().movePrimaryStorage(mVolume);
+        } catch (IllegalArgumentException e) {
+            StorageManager sm = (StorageManager) getSystemService(STORAGE_SERVICE);
+
+            if (Objects.equals(mVolume.getFsUuid(), sm.getPrimaryStorageVolume().getUuid())) {
+                final Intent intent = new Intent(this, StorageWizardReady.class);
+                intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
+                startActivity(intent);
+                finishAffinity();
+
+                return;
+            } else {
+                throw e;
+            }
+        } catch (IllegalStateException e) {
+            Toast.makeText(this, getString(R.string.another_migration_already_in_progress),
+                    Toast.LENGTH_LONG).show();
+            finishAffinity();
+
+            return;
+        }
 
         final Intent intent = new Intent(this, StorageWizardMigrateProgress.class);
         intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, mVolume.getId());
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
index 163ff42..ade3bfa 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
@@ -76,9 +76,11 @@
                         finishIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
                         sendBroadcast(finishIntent);
 
-                        final Intent intent = new Intent(context, StorageWizardReady.class);
-                        intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
-                        startActivity(intent);
+                        if (!StorageWizardMigrateProgress.this.isFinishing()) {
+                            final Intent intent = new Intent(context, StorageWizardReady.class);
+                            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
+                            startActivity(intent);
+                        }
                     }
                 } else {
                     Toast.makeText(context, getString(R.string.insufficient_storage),