Merge "Use CDS display white balance getter and setter" into qt-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a8fa7cc..68a7cbb 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1475,7 +1475,7 @@
         <!-- Lock screen settings -->
         <activity android:name=".password.ConfirmDeviceCredentialActivity"
             android:exported="true"
-            android:taskAffinity=".password.ConfirmDeviceCredentialActivity"
+            android:taskAffinity="com.android.settings.workmode"
             android:theme="@android:style/Theme.Translucent.NoTitleBar">
             <intent-filter android:priority="1">
                 <action android:name="android.app.action.CONFIRM_DEVICE_CREDENTIAL" />
@@ -1493,7 +1493,7 @@
             android:exported="false"
             android:permission="android.permission.MANAGE_USERS"
             android:resizeableActivity="false"
-            android:taskAffinity=".password.ConfirmDeviceCredentialActivity"
+            android:taskAffinity="com.android.settings.workmode"
             android:theme="@android:style/Theme.Translucent.NoTitleBar">
             <intent-filter android:priority="1">
                 <action android:name="android.app.action.CONFIRM_DEVICE_CREDENTIAL_WITH_USER" />
@@ -2810,6 +2810,7 @@
 
         <activity android:name=".enterprise.ActionDisabledByAdminDialog"
                 android:theme="@style/Transparent"
+                android:taskAffinity="com.android.settings.enterprise"
                 android:excludeFromRecents="true"
                 android:launchMode="singleTop">
             <intent-filter android:priority="1">
diff --git a/res/layout/panel_layout.xml b/res/layout/panel_layout.xml
index 233a01b..3a8045f 100644
--- a/res/layout/panel_layout.xml
+++ b/res/layout/panel_layout.xml
@@ -31,8 +31,6 @@
         android:textColor="?android:attr/colorPrimary"
         android:textSize="20sp"/>
 
-    <include layout="@layout/horizontal_divider"/>
-
     <include layout="@layout/panel_slice_list"/>
 
     <LinearLayout
diff --git a/res/layout/panel_slice_row.xml b/res/layout/panel_slice_row.xml
index 3288c40..4e1184b 100644
--- a/res/layout/panel_slice_row.xml
+++ b/res/layout/panel_slice_row.xml
@@ -26,6 +26,4 @@
         android:layout_height="wrap_content"
         android:paddingStart="20dp"
         android:paddingEnd="20dp"/>
-
-    <include layout="@layout/horizontal_divider"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/res/layout/preference_tts_engine.xml b/res/layout/preference_tts_engine.xml
deleted file mode 100644
index 19401f0..0000000
--- a/res/layout/preference_tts_engine.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="?android:attr/listPreferredItemHeight"
-    android:paddingStart="@dimen/preference_no_icon_padding_start"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:layout_gravity="center_vertical">
-
-    <RadioButton
-        android:id="@+id/tts_engine_radiobutton"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:clickable="true"
-        android:layout_weight="1"
-        android:maxLines="2"
-        android:textAppearance="?android:attr/textAppearanceListItem"
-        android:ellipsize="marquee"/>
-</LinearLayout>
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index b07635f..55b31d2 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -26,7 +26,6 @@
     public static final String MOBILE_NETWORK_V2 = "settings_mobile_network_v2";
     public static final String NETWORK_INTERNET_V2 = "settings_network_and_internet_v2";
     public static final String SLICE_INJECTION = "settings_slice_injection";
-    public static final String MAINLINE_MODULE = "settings_mainline_module";
     public static final String WIFI_DETAILS_SAVED_SCREEN = "settings_wifi_details_saved_screen";
     public static final String WIFI_DETAILS_DATAUSAGE_HEADER =
             "settings_wifi_details_datausage_header";
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
index 174cb8c..ff9352a 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
@@ -21,14 +21,12 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.text.TextUtils;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
 import com.android.settings.core.BasePreferenceController;
-import com.android.settings.core.FeatureFlags;
 
 public class MainlineModuleVersionPreferenceController extends BasePreferenceController {
 
@@ -49,16 +47,10 @@
 
     @Override
     public int getAvailabilityStatus() {
-        if (!FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MAINLINE_MODULE)) {
-            return UNSUPPORTED_ON_DEVICE;
-        }
         return !TextUtils.isEmpty(mModuleVersion) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
     private void initModules() {
-        if (!FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MAINLINE_MODULE)) {
-            return;
-        }
         final String moduleProvider = mContext.getString(
                 com.android.internal.R.string.config_defaultModuleMetadataProvider);
         if (!TextUtils.isEmpty(moduleProvider)) {
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 20421d0..f1391dc 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -37,6 +37,7 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.panel.PanelLoggingContract.PanelClosedKeys;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.google.android.setupdesign.DividerItemDecoration;
 
 public class PanelFragment extends Fragment {
 
@@ -93,6 +94,10 @@
         mPanelSlices.setLayoutManager(new LinearLayoutManager((activity)));
         mPanelSlices.setAdapter(mAdapter);
 
+        DividerItemDecoration itemDecoration = new DividerItemDecoration(getActivity());
+        itemDecoration.setDividerCondition(DividerItemDecoration.DIVIDER_CONDITION_BOTH);
+        mPanelSlices.addItemDecoration(itemDecoration);
+
         mTitleView.setText(mPanel.getTitle());
 
         mSeeMoreButton.setOnClickListener(getSeeMoreListener());
diff --git a/src/com/android/settings/panel/PanelSlicesAdapter.java b/src/com/android/settings/panel/PanelSlicesAdapter.java
index 47ff631..0eec534 100644
--- a/src/com/android/settings/panel/PanelSlicesAdapter.java
+++ b/src/com/android/settings/panel/PanelSlicesAdapter.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.panel;
 
+import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.net.Uri;
@@ -33,6 +35,7 @@
 
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
+import com.google.android.setupdesign.DividerItemDecoration;
 
 import java.util.List;
 
@@ -80,10 +83,13 @@
     /**
      * ViewHolder for binding Slices to SliceViews.
      */
-    public static class SliceRowViewHolder extends RecyclerView.ViewHolder {
+    public static class SliceRowViewHolder extends RecyclerView.ViewHolder
+            implements DividerItemDecoration.DividedViewHolder {
 
         private final PanelContent mPanelContent;
 
+        private boolean mDividerAllowedAbove = true;
+
         @VisibleForTesting
         LiveData<Slice> sliceLiveData;
 
@@ -103,6 +109,11 @@
             sliceLiveData = SliceLiveData.fromUri(context, sliceUri);
             sliceLiveData.observe(fragment.getViewLifecycleOwner(), sliceView);
 
+            // Do not show the divider above media devices switcher slice per request
+            if (sliceUri.equals(MEDIA_OUTPUT_INDICATOR_SLICE_URI)) {
+                mDividerAllowedAbove = false;
+            }
+
             // Log Panel interaction
             sliceView.setOnSliceActionListener(
                     ((eventInfo, sliceItem) -> {
@@ -116,5 +127,15 @@
                     })
             );
         }
+
+        @Override
+        public boolean isDividerAllowedAbove() {
+            return mDividerAllowedAbove;
+        }
+
+        @Override
+        public boolean isDividerAllowedBelow() {
+            return true;
+        }
     }
 }
diff --git a/src/com/android/settings/tts/TtsEnginePreference.java b/src/com/android/settings/tts/TtsEnginePreference.java
index 7dc00fe..6ea414d 100644
--- a/src/com/android/settings/tts/TtsEnginePreference.java
+++ b/src/com/android/settings/tts/TtsEnginePreference.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.Intent;
 import android.speech.tts.TextToSpeech.EngineInfo;
 import android.util.Log;
 import android.widget.Checkable;
@@ -30,7 +29,6 @@
 import androidx.preference.PreferenceViewHolder;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 
 
 public class TtsEnginePreference extends Preference {
@@ -54,21 +52,20 @@
      */
     private volatile boolean mPreventRadioButtonCallbacks;
 
-    private RadioButton mRadioButton;
-    private Intent mVoiceCheckData;
-
     private final CompoundButton.OnCheckedChangeListener mRadioChangeListener =
-        new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                onRadioButtonClicked(buttonView, isChecked);
-            }
-        };
+            new CompoundButton.OnCheckedChangeListener() {
+                @Override
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    onRadioButtonClicked(buttonView, isChecked);
+                }
+            };
 
-    public TtsEnginePreference(Context context, EngineInfo info, RadioButtonGroupState state,
-            SettingsActivity prefActivity) {
+    public TtsEnginePreference(Context context, EngineInfo info, RadioButtonGroupState state) {
         super(context);
-        setLayoutResource(R.layout.preference_tts_engine);
+
+        setWidgetLayoutResource(R.layout.preference_widget_radiobutton);
+        setLayoutResource(R.layout.preference_radio);
+        setIconSpaceReserved(false);
 
         mSharedState = state;
         mEngineInfo = info;
@@ -87,9 +84,8 @@
                     "setSharedState()");
         }
 
-        final RadioButton rb = (RadioButton) view.findViewById(R.id.tts_engine_radiobutton);
+        final RadioButton rb = view.itemView.findViewById(android.R.id.checkbox);
         rb.setOnCheckedChangeListener(mRadioChangeListener);
-        rb.setText(mEngineInfo.label);
 
         boolean isChecked = getKey().equals(mSharedState.getCurrentKey());
         if (isChecked) {
@@ -99,12 +95,6 @@
         mPreventRadioButtonCallbacks = true;
         rb.setChecked(isChecked);
         mPreventRadioButtonCallbacks = false;
-
-        mRadioButton = rb;
-    }
-
-    public void setVoiceDataDetails(Intent data) {
-        mVoiceCheckData = data;
     }
 
     private boolean shouldDisplayDataAlert() {
@@ -145,7 +135,7 @@
                     public void onClick(DialogInterface dialog, int which) {
                         makeCurrentEngine(buttonView);
                     }
-                },new DialogInterface.OnClickListener() {
+                }, new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         // Undo the click.
@@ -176,9 +166,11 @@
      */
     public interface RadioButtonGroupState {
         String getCurrentKey();
+
         Checkable getCurrentChecked();
 
         void setCurrentKey(String key);
+
         void setCurrentChecked(Checkable current);
     }
 
diff --git a/src/com/android/settings/tts/TtsEnginePreferenceFragment.java b/src/com/android/settings/tts/TtsEnginePreferenceFragment.java
index 43bb459..244e5b1 100644
--- a/src/com/android/settings/tts/TtsEnginePreferenceFragment.java
+++ b/src/com/android/settings/tts/TtsEnginePreferenceFragment.java
@@ -15,7 +15,6 @@
 import androidx.preference.PreferenceCategory;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -87,12 +86,10 @@
 
         mEnginePreferenceCategory.removeAll();
 
-        SettingsActivity activity = (SettingsActivity) getActivity();
-
         List<EngineInfo> engines = mEnginesHelper.getEngines();
         for (EngineInfo engine : engines) {
             TtsEnginePreference enginePref =
-                    new TtsEnginePreference(getPrefContext(), engine, this, activity);
+                    new TtsEnginePreference(getPrefContext(), engine, this);
             mEnginePreferenceCategory.addPreference(enginePref);
         }
     }
@@ -161,6 +158,7 @@
     public void onUpdateEngine(int status) {
         if (status == TextToSpeech.SUCCESS) {
             Log.d(
+
                     TAG,
                     "Updating engine: Successfully bound to the engine: "
                             + mTts.getCurrentEngine());
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
index f391aac..adddc96 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
@@ -60,18 +60,6 @@
         mContext = spy(RuntimeEnvironment.application);
         mPreference = new Preference(mContext);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
-
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.MAINLINE_MODULE, true);
-    }
-
-    @Test
-    public void getAvailabilityStatus_featureDisabled_unavailable() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.MAINLINE_MODULE, false);
-
-        final MainlineModuleVersionPreferenceController controller =
-                new MainlineModuleVersionPreferenceController(mContext, "key");
-
-        assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
index 4dce15e..9795b55 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
@@ -16,13 +16,18 @@
 
 package com.android.settings.panel;
 
+import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
@@ -39,6 +44,9 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 
+import java.util.Arrays;
+import java.util.List;
+
 @RunWith(RobolectricTestRunner.class)
 public class PanelSlicesAdapterTest {
 
@@ -48,8 +56,6 @@
     private FakeFeatureFactory mFakeFeatureFactory;
     private PanelFeatureProvider mPanelFeatureProvider;
 
-    private PanelSlicesAdapter mAdapter;
-
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
@@ -70,28 +76,83 @@
                                 .get()
                                 .getSupportFragmentManager()
                                 .findFragmentById(R.id.main_content));
-
-        mAdapter = new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
     }
 
     @Test
     public void onCreateViewHolder_returnsSliceRowViewHolder() {
+        final PanelSlicesAdapter adapter =
+                new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
         final ViewGroup view = new FrameLayout(mContext);
         final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
-                mAdapter.onCreateViewHolder(view, 0);
+                adapter.onCreateViewHolder(view, 0);
 
         assertThat(viewHolder.sliceView).isNotNull();
     }
 
     @Test
     public void onBindViewHolder_bindsSlice() {
+        final PanelSlicesAdapter adapter =
+                new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
         final int position = 0;
         final ViewGroup view = new FrameLayout(mContext);
         final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
-                mAdapter.onCreateViewHolder(view, 0 /* view type*/);
+                adapter.onCreateViewHolder(view, 0 /* view type*/);
 
-        mAdapter.onBindViewHolder(viewHolder, position);
+        adapter.onBindViewHolder(viewHolder, position);
 
         assertThat(viewHolder.sliceLiveData).isNotNull();
     }
+
+    @Test
+    public void nonMediaOutputIndicatorSlice_shouldAllowDividerAboveAndBelow() {
+        final PanelSlicesAdapter adapter =
+                new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
+        final int position = 0;
+        final ViewGroup view = new FrameLayout(mContext);
+        final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
+                adapter.onCreateViewHolder(view, 0 /* view type*/);
+
+        adapter.onBindViewHolder(viewHolder, position);
+
+        assertThat(viewHolder.isDividerAllowedAbove()).isTrue();
+        assertThat(viewHolder.isDividerAllowedBelow()).isTrue();
+    }
+
+    @Test
+    public void mediaOutputIndicatorSlice_shouldNotAllowDividerAbove() {
+        PanelContent mediaOutputIndicatorSlicePanelContent = new PanelContent() {
+            @Override
+            public CharSequence getTitle() {
+                return "title";
+            }
+
+            @Override
+            public List<Uri> getSlices() {
+                return Arrays.asList(
+                        MEDIA_OUTPUT_INDICATOR_SLICE_URI
+                );
+            }
+
+            @Override
+            public Intent getSeeMoreIntent() {
+                return new Intent();
+            }
+
+            @Override
+            public int getMetricsCategory() {
+                return SettingsEnums.TESTING;
+            }
+        };
+
+        final PanelSlicesAdapter adapter =
+                new PanelSlicesAdapter(mPanelFragment, mediaOutputIndicatorSlicePanelContent);
+        final int position = 0;
+        final ViewGroup view = new FrameLayout(mContext);
+        final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
+                adapter.onCreateViewHolder(view, 0 /* view type*/);
+
+        adapter.onBindViewHolder(viewHolder, position);
+
+        assertThat(viewHolder.isDividerAllowedAbove()).isFalse();
+    }
 }
\ No newline at end of file