Add local transport parameters for transport flags GTS test

Added parameters for local transport in secure setting for setting up
local transport to test transport flags GTS test.

Test: GTS test in topic CL.
Bug: 73100304
Change-Id: If654175d91fdf1ea68db0f3320d59b2b770a4db3
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 72eb494..d36a794 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -163,6 +163,16 @@
      */
     public static final int FLAG_DEVICE_TO_DEVICE_TRANSFER = 2;
 
+    /**
+     * Flag for {@link BackupDataOutput#getTransportFlags()} and
+     * {@link FullBackupDataOutput#getTransportFlags()} only.
+     *
+     * <p>Used for internal testing only. Do not check this flag in production code.
+     *
+     * @hide
+     */
+    public static final int FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED = 1 << 31;
+
     Handler mHandler = null;
 
     Handler getHandler() {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e381693..df29fcb 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7679,6 +7679,24 @@
          */
         public static final String BACKUP_MANAGER_CONSTANTS = "backup_manager_constants";
 
+
+        /**
+         * Local transport parameters so we can configure it for tests.
+         * This is encoded as a key=value list, separated by commas.
+         *
+         * The following keys are supported:
+         *
+         * <pre>
+         * fake_encryption_flag  (boolean)
+         * </pre>
+         *
+         * <p>
+         * Type: string
+         * @hide
+         */
+        public static final String BACKUP_LOCAL_TRANSPORT_PARAMETERS =
+                "backup_local_transport_parameters";
+
         /**
          * Flag to set if the system should predictively attempt to re-enable Bluetooth while
          * the user is driving.
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index 543bd0c..b049db3 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.backup;
 
+import android.app.backup.BackupAgent;
 import android.app.backup.BackupDataInput;
 import android.app.backup.BackupDataOutput;
 import android.app.backup.BackupTransport;
@@ -98,6 +99,7 @@
     private FileInputStream mCurFullRestoreStream;
     private FileOutputStream mFullRestoreSocketStream;
     private byte[] mFullRestoreBuffer;
+    private final LocalTransportParameters mParameters;
 
     private void makeDataDirs() {
         mCurrentSetDir.mkdirs();
@@ -105,11 +107,16 @@
         mCurrentSetIncrementalDir.mkdir();
     }
 
-    public LocalTransport(Context context) {
+    public LocalTransport(Context context, LocalTransportParameters parameters) {
         mContext = context;
+        mParameters = parameters;
         makeDataDirs();
     }
 
+    LocalTransportParameters getParameters() {
+        return mParameters;
+    }
+
     @Override
     public String name() {
         return new ComponentName(mContext, this.getClass()).flattenToShortString();
@@ -143,6 +150,17 @@
     }
 
     @Override
+    public int getTransportFlags() {
+        int flags = super.getTransportFlags();
+        // Testing for a fake flag and having it set as a boolean in settings prevents anyone from
+        // using this it to pull data from the agent
+        if (mParameters.isFakeEncryptionFlag()) {
+            flags |= BackupAgent.FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED;
+        }
+        return flags;
+    }
+
+    @Override
     public long requestBackupTime() {
         // any time is a good time for local backup
         return 0;
diff --git a/core/java/com/android/internal/backup/LocalTransportParameters.java b/core/java/com/android/internal/backup/LocalTransportParameters.java
new file mode 100644
index 0000000..390fae9
--- /dev/null
+++ b/core/java/com/android/internal/backup/LocalTransportParameters.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.internal.backup;
+
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.KeyValueListParser;
+import android.util.Slog;
+
+class LocalTransportParameters {
+    private static final String TAG = "LocalTransportParams";
+    private static final String SETTING = Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS;
+    private static final String KEY_FAKE_ENCRYPTION_FLAG = "fake_encryption_flag";
+
+    private final KeyValueListParser mParser = new KeyValueListParser(',');
+    private final ContentObserver mObserver;
+    private final ContentResolver mResolver;
+    private boolean mFakeEncryptionFlag;
+
+    LocalTransportParameters(Handler handler, ContentResolver resolver) {
+        mObserver = new Observer(handler);
+        mResolver = resolver;
+    }
+
+    /** Observes for changes in the setting. This method MUST be paired with {@link #stop()}. */
+    void start() {
+        mResolver.registerContentObserver(Settings.Secure.getUriFor(SETTING), false, mObserver);
+        update();
+    }
+
+    /** Stop observing for changes in the setting. */
+    void stop() {
+        mResolver.unregisterContentObserver(mObserver);
+    }
+
+    boolean isFakeEncryptionFlag() {
+        return mFakeEncryptionFlag;
+    }
+
+    private void update() {
+        String parameters = "";
+        try {
+            parameters = Settings.Secure.getString(mResolver, SETTING);
+        } catch (IllegalArgumentException e) {
+            Slog.e(TAG, "Malformed " + SETTING + " setting: " + e.getMessage());
+        }
+        mParser.setString(parameters);
+        mFakeEncryptionFlag = mParser.getBoolean(KEY_FAKE_ENCRYPTION_FLAG, false);
+    }
+
+    private class Observer extends ContentObserver {
+        private Observer(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            update();
+        }
+    }
+}
diff --git a/core/java/com/android/internal/backup/LocalTransportService.java b/core/java/com/android/internal/backup/LocalTransportService.java
index 77ac313..69c48e2 100644
--- a/core/java/com/android/internal/backup/LocalTransportService.java
+++ b/core/java/com/android/internal/backup/LocalTransportService.java
@@ -26,8 +26,16 @@
     @Override
     public void onCreate() {
         if (sTransport == null) {
-            sTransport = new LocalTransport(this);
+            LocalTransportParameters parameters =
+                    new LocalTransportParameters(getMainThreadHandler(), getContentResolver());
+            sTransport = new LocalTransport(this, parameters);
         }
+        sTransport.getParameters().start();
+    }
+
+    @Override
+    public void onDestroy() {
+        sTransport.getParameters().stop();
     }
 
     @Override
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index ff0f4fd..34f716b 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -662,10 +662,11 @@
     optional SettingProto backup_manager_constants = 169;
     optional SettingProto show_first_crash_dialog_dev_option = 195 [ (android.privacy).dest = DEST_AUTOMATIC ];
     optional SettingProto bluetooth_on_while_driving = 196 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    optional SettingProto backup_local_transport_parameters = 197;
 
     // Please insert fields in the same order as in
     // frameworks/base/core/java/android/provider/Settings.java.
-    // Next tag = 197
+    // Next tag = 198
 }
 
 message SystemSettingsProto {
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index da86c9f..370fc33 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -17,9 +17,11 @@
 package android.provider;
 
 import static com.google.android.collect.Sets.newHashSet;
+
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.is;
+
 import static java.lang.reflect.Modifier.isFinal;
 import static java.lang.reflect.Modifier.isPublic;
 import static java.lang.reflect.Modifier.isStatic;
@@ -556,6 +558,7 @@
                  Settings.Secure.VOICE_RECOGNITION_SERVICE,
                  Settings.Secure.INSTANT_APPS_ENABLED,
                  Settings.Secure.BACKUP_MANAGER_CONSTANTS,
+                 Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS,
                  Settings.Secure.KEYGUARD_SLICE_URI,
                  Settings.Secure.PARENTAL_CONTROL_ENABLED,
                  Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,