Add backup configuration action to Privacy settings

Settings now queries the backup manager for a configuration Intent and
text descriptive of the state of the currently-active transport.  These
are used by a new Intent PreferenceScreen within the backup section of
the Privacy settings UI.

When touched, the Configure item launches the Intent supplied by the
transport; when no such Intent is available, the item is disabled.  The
summary text describing the current backup state is also supplied by
the transport.

Bug: 2753632
Change-Id: I3d8fb3d4b08a2b6fa8d3ad8f9e02a66430948423
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5df08d7..36046c4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2906,6 +2906,10 @@
     <string name="backup_data_title">Back up my data</string>
     <!-- Summary text of the "back up data" setting -->
     <string name="backup_data_summary">Back up application data, Wi-Fi passwords, and other settings to Google servers</string>
+    <!-- Configure backup options menu title [CHAR LIMIT=25]-->
+    <string name="backup_configure_transport_title">Configure backup</string>
+    <!-- Default summary text of the "Configure backup" setting [CHAR LIMIT=80]-->
+    <string name="backup_configure_transport_default_summary">No backup destination is available.</string>
     <!-- Auto-restore menu title -->
     <string name="auto_restore_title">Automatic restore</string>
     <!-- Summary text of the "automatic restore" setting -->
diff --git a/res/xml/privacy_settings.xml b/res/xml/privacy_settings.xml
index 86fc306..c28dbc1 100644
--- a/res/xml/privacy_settings.xml
+++ b/res/xml/privacy_settings.xml
@@ -25,6 +25,14 @@
                 android:title="@string/backup_data_title"
                 android:summary="@string/backup_data_summary"
                 android:persistent="false" />
+        <PreferenceScreen
+                android:key="configure_transport"
+                android:dependency="backup_data"
+                android:layout="?android:attr/preferenceLayoutChild"
+                android:title="@string/backup_configure_transport_title"
+                android:summary="@string/backup_configure_transport_default_summary">
+            <intent android:action="dummy" />
+        </PreferenceScreen>
         <CheckBoxPreference
                 android:key="auto_restore"
                 android:title="@string/auto_restore_title"
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index 3f62f19..4132507 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -22,6 +22,7 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -41,9 +42,12 @@
     private static final String BACKUP_CATEGORY = "backup_category";
     private static final String BACKUP_DATA = "backup_data";
     private static final String AUTO_RESTORE = "auto_restore";
+    private static final String CONFIGURE_TRANSPORT = "configure_transport";
+    private IBackupManager mBackupManager;
     private CheckBoxPreference mBackup;
     private CheckBoxPreference mAutoRestore;
     private Dialog mConfirmDialog;
+    private PreferenceScreen mConfigure;
 
     private static final int DIALOG_ERASE_BACKUP = 2;
     private int     mDialogType;
@@ -54,8 +58,12 @@
         addPreferencesFromResource(R.xml.privacy_settings);
         final PreferenceScreen screen = getPreferenceScreen();
 
+        mBackupManager = IBackupManager.Stub.asInterface(
+                ServiceManager.getService(Context.BACKUP_SERVICE));
+
         mBackup = (CheckBoxPreference) screen.findPreference(BACKUP_DATA);
         mAutoRestore = (CheckBoxPreference) screen.findPreference(AUTO_RESTORE);
+        mConfigure = (PreferenceScreen) screen.findPreference(CONFIGURE_TRANSPORT);
 
         // Vendor specific
         if (getActivity().getPackageManager().
@@ -121,13 +129,31 @@
     private void updateToggles() {
         ContentResolver res = getContentResolver();
 
-        final boolean backupEnabled = Settings.Secure.getInt(res,
-                Settings.Secure.BACKUP_ENABLED, 0) == 1;
+        boolean backupEnabled = false;
+        Intent configIntent = null;
+        String configSummary = null;
+        try {
+            backupEnabled = mBackupManager.isBackupEnabled();
+            String transport = mBackupManager.getCurrentTransport();
+            configIntent = mBackupManager.getConfigurationIntent(transport);
+            configSummary = mBackupManager.getDestinationString(transport);
+        } catch (RemoteException e) {
+            // leave it 'false' and disable the UI; there's no backup manager
+            mBackup.setEnabled(false);
+        }
         mBackup.setChecked(backupEnabled);
 
         mAutoRestore.setChecked(Settings.Secure.getInt(res,
                 Settings.Secure.BACKUP_AUTO_RESTORE, 1) == 1);
         mAutoRestore.setEnabled(backupEnabled);
+
+        mConfigure.setEnabled(configIntent != null);
+        mConfigure.setIntent(configIntent);
+        if (configSummary != null) {
+            mConfigure.setSummary(configSummary);
+        } else {
+            mConfigure.setSummary(R.string.backup_configure_transport_default_summary);
+        }
     }
 
     public void onClick(DialogInterface dialog, int which) {
@@ -151,11 +177,9 @@
      * @param enable whether to enable backup
      */
     private void setBackupEnabled(boolean enable) {
-        IBackupManager bm = IBackupManager.Stub.asInterface(
-                ServiceManager.getService(Context.BACKUP_SERVICE));
-        if (bm != null) {
+        if (mBackupManager != null) {
             try {
-                bm.setBackupEnabled(enable);
+                mBackupManager.setBackupEnabled(enable);
             } catch (RemoteException e) {
                 mBackup.setChecked(!enable);
                 mAutoRestore.setEnabled(!enable);