Snap for 5822255 from 481a7dbd2f9d1a891ab0c2beb19022e8a39d9754 to r-keystone-qcom-release

Change-Id: If726470171c53769fba4a8326e2bf0e7445b8423
diff --git a/build.gradle b/build.gradle
index 7a33abd..15071ea 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,16 @@
 apply plugin: 'com.android.library'
 
 android {
+    compileSdkVersion 28
+    buildToolsVersion '28.0.0'
+
+    defaultConfig {
+        // Most backup classes (e.g. SharedPreferencesBackupHelper) were added
+        // in Froyo.
+        minSdkVersion 8
+        targetSdkVersion 28
+    }
+
     publishNonDefault true
 
     buildTypes {
diff --git a/src/com/google/android/libraries/backup/shadow/BackupAgentHelperShadow.java b/src/com/google/android/libraries/backup/shadow/BackupAgentHelperShadow.java
index 18deabf..5615723 100644
--- a/src/com/google/android/libraries/backup/shadow/BackupAgentHelperShadow.java
+++ b/src/com/google/android/libraries/backup/shadow/BackupAgentHelperShadow.java
@@ -26,7 +26,6 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.RealObject;
-import org.robolectric.fakes.RoboSharedPreferences;
 
 /**
  * Shadow class for end-to-end testing of {@link BackupAgentHelper} subclasses in unit tests.
@@ -141,8 +140,9 @@
     } else if (helperClass == FileBackupHelper.class) {
       simulator = FileBackupHelperSimulator.fromHelper(keyPrefix, (FileBackupHelper) helper);
     } else {
-      throw new UnsupportedOperationException(
-          "Unknown backup helper class for key prefix \"" + keyPrefix + "\": " + helperClass);
+      Log.w(
+          TAG, "Unknown backup helper class for key prefix \"" + keyPrefix + "\": " + helperClass);
+      simulator = new UnsupportedBackupHelperSimulator(keyPrefix, helper);
     }
     helperSimulators.put(keyPrefix, simulator);
   }
diff --git a/src/com/google/android/libraries/backup/shadow/UnsupportedBackupHelperSimulator.java b/src/com/google/android/libraries/backup/shadow/UnsupportedBackupHelperSimulator.java
new file mode 100644
index 0000000..15ee687
--- /dev/null
+++ b/src/com/google/android/libraries/backup/shadow/UnsupportedBackupHelperSimulator.java
@@ -0,0 +1,58 @@
+package com.google.android.libraries.backup.shadow;
+
+import android.app.backup.BackupHelper;
+import android.content.Context;
+import android.util.Log;
+
+/**
+ * No-op backup helper representing all an unsupported backup helpers.
+ *
+ * <p>{@see BackupAgentHelperShadow}
+ */
+public class UnsupportedBackupHelperSimulator extends BackupHelperSimulator {
+  private static final String TAG = "UnsupportedBckupHlprSim";
+  private final BackupHelper mHelper;
+
+  UnsupportedBackupHelperSimulator(String keyPrefix, BackupHelper helper) {
+    super(keyPrefix);
+    mHelper = helper;
+  }
+
+  @Override
+  public Object backup(Context context) {
+    return new UnsupportedBackupHelperOutput(mHelper);
+  }
+
+  @Override
+  public void restore(Context context, Object data) {
+    if (!(data instanceof UnsupportedBackupHelperOutput)) {
+      throw new IllegalArgumentException(
+          "Invalid type of data to restore in unsupported helper \""
+              + keyPrefix
+              + "\": "
+              + (data == null ? null : data.getClass()));
+    }
+    Log.w(
+        TAG,
+        "Attempt to restore from an unsupported backup helper: " + mHelper.getClass().getName());
+  }
+
+  public static class UnsupportedBackupHelperOutput {
+    public final BackupHelper wrappedHelper;
+
+    public UnsupportedBackupHelperOutput(BackupHelper helper) {
+      wrappedHelper = helper;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      return obj instanceof UnsupportedBackupHelperOutput
+          && wrappedHelper.equals(((UnsupportedBackupHelperOutput) obj).wrappedHelper);
+    }
+
+    @Override
+    public int hashCode() {
+      return wrappedHelper.hashCode();
+    }
+  }
+}