Merge "Make some notification related slices public."
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 91c333a..4f20a01 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -28,4 +28,5 @@
             "settings_wifi_details_datausage_header";
     public static final String PERSONAL_WORK_PROFILE = "settings_work_profile";
     public static final String CONTROLLER_ENHANCEMENT = "settings_controller_loading_enhancement";
+    public static final String CONDITIONAL_CARDS = "settings_conditionals";
 }
diff --git a/src/com/android/settings/development/bluetooth/BluetoothSampleRateDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothSampleRateDialogPreferenceController.java
new file mode 100644
index 0000000..9e4b99e
--- /dev/null
+++ b/src/com/android/settings/development/bluetooth/BluetoothSampleRateDialogPreferenceController.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2019 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.settings.development.bluetooth;
+
+import android.bluetooth.BluetoothCodecConfig;
+import android.content.Context;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.development.BluetoothA2dpConfigStore;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Dialog preference controller to set the Bluetooth A2DP config of sample rate
+ */
+public class BluetoothSampleRateDialogPreferenceController extends
+        AbstractBluetoothDialogPreferenceController {
+
+    private static final String KEY = "bluetooth_sample_rate_settings";
+    private static final String TAG = "BtSampleRateCtr";
+
+    public BluetoothSampleRateDialogPreferenceController(Context context, Lifecycle lifecycle,
+                                                         BluetoothA2dpConfigStore store) {
+        super(context, lifecycle, store);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        ((BaseBluetoothDialogPreference) mPreference).setCallback(this);
+    }
+
+    @Override
+    protected void writeConfigurationValues(final int index) {
+        int sampleRateValue = BluetoothCodecConfig.SAMPLE_RATE_NONE; // default
+        switch (index) {
+            case 0:
+                final BluetoothCodecConfig currentConfig = getCurrentCodecConfig();
+                if (currentConfig != null) {
+                    sampleRateValue = getHighestSampleRate(getSelectableByCodecType(
+                            currentConfig.getCodecType()));
+                }
+                break;
+            case 1:
+                sampleRateValue = BluetoothCodecConfig.SAMPLE_RATE_44100;
+                break;
+            case 2:
+                sampleRateValue = BluetoothCodecConfig.SAMPLE_RATE_48000;
+                break;
+            case 3:
+                sampleRateValue = BluetoothCodecConfig.SAMPLE_RATE_88200;
+                break;
+            case 4:
+                sampleRateValue = BluetoothCodecConfig.SAMPLE_RATE_96000;
+                break;
+            default:
+                break;
+        }
+        mBluetoothA2dpConfigStore.setSampleRate(sampleRateValue);
+    }
+
+    @Override
+    protected int getCurrentIndexByConfig(BluetoothCodecConfig config) {
+        if (config == null) {
+            Log.e(TAG, "Unable to get current config index. Config is null.");
+        }
+        return convertCfgToBtnIndex(config.getSampleRate());
+    }
+
+    @Override
+    public List<Integer> getSelectableIndex() {
+        List<Integer> selectableIndex = new ArrayList<>();
+        selectableIndex.add(getDefaultIndex());
+        final BluetoothCodecConfig currentConfig = getCurrentCodecConfig();
+        if (currentConfig != null) {
+            final int configs =
+                    getSelectableByCodecType(currentConfig.getCodecType()).getSampleRate();
+            for (int sampleRate : SAMPLE_RATES) {
+                if ((configs & sampleRate) != 0) {
+                    selectableIndex.add(convertCfgToBtnIndex(sampleRate));
+                }
+            }
+        }
+        return selectableIndex;
+    }
+
+    @VisibleForTesting
+    int convertCfgToBtnIndex(int config) {
+        int index = getDefaultIndex();
+        switch (config) {
+            case BluetoothCodecConfig.SAMPLE_RATE_44100:
+                index = 1;
+                break;
+            case BluetoothCodecConfig.SAMPLE_RATE_48000:
+                index = 2;
+                break;
+            case BluetoothCodecConfig.SAMPLE_RATE_88200:
+                index = 3;
+                break;
+            case BluetoothCodecConfig.SAMPLE_RATE_96000:
+                index = 4;
+                break;
+            default:
+                Log.e(TAG, "Unsupported config:" + config);
+                break;
+        }
+        return index;
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryWifiParser.java b/src/com/android/settings/fuelgauge/BatteryWifiParser.java
index 014c069..2aa6749 100644
--- a/src/com/android/settings/fuelgauge/BatteryWifiParser.java
+++ b/src/com/android/settings/fuelgauge/BatteryWifiParser.java
@@ -14,8 +14,8 @@
 
 package com.android.settings.fuelgauge;
 
-import android.os.BatteryStats;
 import android.os.BatteryStats.HistoryItem;
+import android.os.BatteryStatsManager;
 
 public class BatteryWifiParser extends BatteryFlagParser {
 
@@ -27,12 +27,12 @@
     protected boolean isSet(HistoryItem record) {
         switch ((record.states2 & HistoryItem.STATE2_WIFI_SUPPL_STATE_MASK)
                 >> HistoryItem.STATE2_WIFI_SUPPL_STATE_SHIFT) {
-            case BatteryStats.WIFI_SUPPL_STATE_DISCONNECTED:
-            case BatteryStats.WIFI_SUPPL_STATE_DORMANT:
-            case BatteryStats.WIFI_SUPPL_STATE_INACTIVE:
-            case BatteryStats.WIFI_SUPPL_STATE_INTERFACE_DISABLED:
-            case BatteryStats.WIFI_SUPPL_STATE_INVALID:
-            case BatteryStats.WIFI_SUPPL_STATE_UNINITIALIZED:
+            case BatteryStatsManager.WIFI_SUPPL_STATE_DISCONNECTED:
+            case BatteryStatsManager.WIFI_SUPPL_STATE_DORMANT:
+            case BatteryStatsManager.WIFI_SUPPL_STATE_INACTIVE:
+            case BatteryStatsManager.WIFI_SUPPL_STATE_INTERFACE_DISABLED:
+            case BatteryStatsManager.WIFI_SUPPL_STATE_INVALID:
+            case BatteryStatsManager.WIFI_SUPPL_STATE_UNINITIALIZED:
                 return false;
         }
         return true;
diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java
index 65eaf87..152028c 100644
--- a/src/com/android/settings/network/telephony/MobileDataSlice.java
+++ b/src/com/android/settings/network/telephony/MobileDataSlice.java
@@ -38,11 +38,11 @@
 
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.network.AirplaneModePreferenceController;
 import com.android.settings.network.MobileDataContentObserver;
 import com.android.settings.slices.CustomSliceRegistry;
 import com.android.settings.slices.CustomSliceable;
 import com.android.settings.slices.SliceBackgroundWorker;
+import com.android.settingslib.WirelessUtils;
 
 import com.google.common.annotations.VisibleForTesting;
 
@@ -184,10 +184,7 @@
 
     @VisibleForTesting
     boolean isAirplaneModeEnabled() {
-        // Generic key since we only want the method check - no UI.
-        AirplaneModePreferenceController controller = new AirplaneModePreferenceController(mContext,
-                "key" /* Key */);
-        return controller.isChecked();
+        return WirelessUtils.isAirplaneModeOn(mContext);
     }
 
     @VisibleForTesting
diff --git a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothSampleRateDialogPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothSampleRateDialogPreferenceControllerTest.java
new file mode 100644
index 0000000..d274a57
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothSampleRateDialogPreferenceControllerTest.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2019 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.settings.development.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothCodecConfig;
+import android.bluetooth.BluetoothCodecStatus;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.development.BluetoothA2dpConfigStore;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothSampleRateDialogPreferenceControllerTest {
+
+    @Mock
+    private BluetoothA2dp mBluetoothA2dp;
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private BluetoothSampleRateDialogPreferenceController mController;
+    private BluetoothSampleRateDialogPreference mPreference;
+    private BluetoothA2dpConfigStore mBluetoothA2dpConfigStore;
+    private BluetoothCodecStatus mCodecStatus;
+    private BluetoothCodecConfig mCodecConfigAAC;
+    private BluetoothCodecConfig mCodecConfigSBC;
+    private Context mContext;
+    private LifecycleOwner mLifecycleOwner;
+    private Lifecycle mLifecycle;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+        mBluetoothA2dpConfigStore = spy(new BluetoothA2dpConfigStore());
+        mController = spy(new BluetoothSampleRateDialogPreferenceController(mContext, mLifecycle,
+                mBluetoothA2dpConfigStore));
+        mPreference = new BluetoothSampleRateDialogPreference(mContext);
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        mController.displayPreference(mScreen);
+        mCodecConfigAAC = new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
+                BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
+                BluetoothCodecConfig.SAMPLE_RATE_48000 | BluetoothCodecConfig.SAMPLE_RATE_88200,
+                BluetoothCodecConfig.BITS_PER_SAMPLE_NONE,
+                BluetoothCodecConfig.CHANNEL_MODE_NONE,
+                0, 0, 0, 0);
+        mCodecConfigSBC = new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
+                BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
+                BluetoothCodecConfig.SAMPLE_RATE_96000,
+                BluetoothCodecConfig.BITS_PER_SAMPLE_NONE,
+                BluetoothCodecConfig.CHANNEL_MODE_NONE,
+                0, 0, 0, 0);
+    }
+
+    @Test
+    public void writeConfigurationValues_selectDefault_setHighest() {
+        mCodecConfigSBC = new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC);
+        BluetoothCodecConfig[] mCodecConfigs = {mCodecConfigAAC, mCodecConfigSBC};
+        mCodecStatus = new BluetoothCodecStatus(mCodecConfigAAC, null, mCodecConfigs);
+        when(mBluetoothA2dp.getCodecStatus(null)).thenReturn(mCodecStatus);
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+
+        mController.writeConfigurationValues(0);
+        verify(mBluetoothA2dpConfigStore).setSampleRate(BluetoothCodecConfig.SAMPLE_RATE_88200);
+    }
+
+    @Test
+    public void writeConfigurationValues_checkSampleRate() {
+        mController.writeConfigurationValues(1);
+        verify(mBluetoothA2dpConfigStore).setSampleRate(BluetoothCodecConfig.SAMPLE_RATE_44100);
+
+        mController.writeConfigurationValues(2);
+        verify(mBluetoothA2dpConfigStore).setSampleRate(BluetoothCodecConfig.SAMPLE_RATE_48000);
+
+        mController.writeConfigurationValues(3);
+        verify(mBluetoothA2dpConfigStore).setSampleRate(BluetoothCodecConfig.SAMPLE_RATE_88200);
+
+        mController.writeConfigurationValues(4);
+        verify(mBluetoothA2dpConfigStore).setSampleRate(BluetoothCodecConfig.SAMPLE_RATE_96000);
+    }
+
+    @Test
+    public void getCurrentIndexByConfig_verifyIndex() {
+        assertThat(mController.getCurrentIndexByConfig(mCodecConfigSBC)).isEqualTo(
+                mController.convertCfgToBtnIndex(BluetoothCodecConfig.SAMPLE_RATE_96000));
+    }
+
+    @Test
+    public void getSelectableIndex_verifyList() {
+        BluetoothCodecConfig[] mCodecConfigs = {mCodecConfigAAC, mCodecConfigSBC};
+        mCodecStatus = new BluetoothCodecStatus(mCodecConfigAAC, null, mCodecConfigs);
+        when(mBluetoothA2dp.getCodecStatus(null)).thenReturn(mCodecStatus);
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+        List<Integer> indexList = new ArrayList<>();
+        indexList.add(mController.getDefaultIndex());
+        indexList.add(mController.convertCfgToBtnIndex(BluetoothCodecConfig.SAMPLE_RATE_48000));
+        indexList.add(mController.convertCfgToBtnIndex(BluetoothCodecConfig.SAMPLE_RATE_88200));
+
+        assertThat(mController.getSelectableIndex().containsAll(indexList)).isTrue();
+        assertThat(indexList.containsAll(mController.getSelectableIndex())).isTrue();
+    }
+}