Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6b78a5a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix the section below "Pair new device" moves up a few pixels" into sc-dev

parents 461b72cd 139ff593
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@
        android:key="add_bt_devices"
        android:title="@string/bluetooth_pairing_pref_title"
        android:icon="@drawable/ic_add_24dp"
        android:summary="@string/connected_device_add_device_summary"
        android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
        settings:allowDividerAbove="true"
        settings:keywords="@string/keywords_add_bt_device"
@@ -48,6 +47,18 @@
        settings:useAdminDisabledSummary="true"
        settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/>

    <com.android.settingslib.RestrictedPreference
        android:key="add_bt_devices_summary"
        android:title="@string/bluetooth_pairing_pref_title"
        android:icon="@drawable/ic_add_24dp"
        android:summary="@string/connected_device_add_device_summary"
        android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
        settings:allowDividerAbove="true"
        settings:keywords="@string/keywords_add_bt_device"
        settings:userRestriction="no_config_bluetooth"
        settings:useAdminDisabledSummary="true"
        settings:controller="com.android.settings.connecteddevice.AddDeviceSummaryPreferenceController"/>

    <PreferenceCategory
        android:key="previously_connected_devices"
        android:title="@string/connected_device_previously_connected_title"
+11 −3
Original line number Diff line number Diff line
@@ -33,7 +33,8 @@ import com.android.settingslib.core.lifecycle.events.OnStop;

/**
 * Controller to maintain the {@link androidx.preference.Preference} for add
 * device. It monitor Bluetooth's status(on/off) and decide if need to show summary or not.
 * device without summary at beginning. It monitor Bluetooth's status(on/off) and decide if need
 * to show summary or not.
 */
public class AddDevicePreferenceController extends BasePreferenceController
        implements LifecycleObserver, OnStart, OnStop {
@@ -46,7 +47,8 @@ public class AddDevicePreferenceController extends BasePreferenceController
        }
    };
    private IntentFilter mIntentFilter;
    private BluetoothAdapter mBluetoothAdapter;

    protected BluetoothAdapter mBluetoothAdapter;

    public AddDevicePreferenceController(Context context, String key) {
        super(context, key);
@@ -57,6 +59,7 @@ public class AddDevicePreferenceController extends BasePreferenceController
    @Override
    public void onStart() {
        mContext.registerReceiver(mReceiver, mIntentFilter);
        updateState(mPreference);
    }

    @Override
@@ -75,17 +78,22 @@ public class AddDevicePreferenceController extends BasePreferenceController
    @Override
    public int getAvailabilityStatus() {
        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
                && isBluetoothEnabled()
                ? AVAILABLE
                : UNSUPPORTED_ON_DEVICE;
    }

    @Override
    public CharSequence getSummary() {
        return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
        return isBluetoothEnabled()
                ? ""
                : mContext.getString(R.string.connected_device_add_device_summary);
    }

    protected boolean isBluetoothEnabled() {
        return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled();
    }

    void updateState() {
        updateState(mPreference);
    }
+39 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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.connecteddevice;

import android.content.Context;
import android.content.pm.PackageManager;

/**
 * Controller to maintain the {@link androidx.preference.Preference} for add
 * device with summary at beginning. It monitor Bluetooth's status(on/off) and decide if need
 * to show summary or not.
 */
public class AddDeviceSummaryPreferenceController extends AddDevicePreferenceController {

    public AddDeviceSummaryPreferenceController(Context context, String key) {
        super(context, key);
    }

    @Override
    public int getAvailabilityStatus() {
        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
                && !isBluetoothEnabled()
                ? AVAILABLE
                : UNSUPPORTED_ON_DEVICE;
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ public class AddDevicePreferenceControllerTest {
        String key = mAddDevicePreferenceController.getPreferenceKey();
        mAddDevicePreference = new RestrictedPreference(mContext);
        mAddDevicePreference.setKey(key);
        when(mBluetoothAdapter.isEnabled()).thenReturn(true);
        when(mScreen.findPreference(key)).thenReturn(mAddDevicePreference);
        mAddDevicePreferenceController.displayPreference(mScreen);
    }
@@ -128,4 +129,13 @@ public class AddDevicePreferenceControllerTest {
        assertThat(mAddDevicePreferenceController.getAvailabilityStatus())
                .isEqualTo(AVAILABLE);
    }

    @Test
    public void getAvailabilityStatus_bluetoothIsDisabled_unSupported() {
        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);
        when(mBluetoothAdapter.isEnabled()).thenReturn(false);

        assertThat(mAddDevicePreferenceController.getAvailabilityStatus())
                .isEqualTo(UNSUPPORTED_ON_DEVICE);
    }
}
+151 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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.connecteddevice;

import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;

import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;

import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.text.TextUtils;

import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settingslib.RestrictedPreference;

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 org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplicationPackageManager;
import org.robolectric.util.ReflectionHelpers;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowApplicationPackageManager.class)
public class AddDeviceSummaryPreferenceControllerTest {

    @Mock
    private PreferenceScreen mScreen;
    @Mock
    private BluetoothAdapter mBluetoothAdapter;

    private Context mContext;
    private AddDeviceSummaryPreferenceController mAddDeviceSummaryPreferenceController;
    private RestrictedPreference mAddDevicePreference;
    private ShadowApplicationPackageManager mPackageManager;


    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        mContext = RuntimeEnvironment.application;
        mPackageManager = (ShadowApplicationPackageManager) Shadows.shadowOf(
                mContext.getPackageManager());
        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);

        mAddDeviceSummaryPreferenceController = new AddDeviceSummaryPreferenceController(mContext,
                "add_bt_devices");
        ReflectionHelpers.setField(mAddDeviceSummaryPreferenceController,
                "mBluetoothAdapter", mBluetoothAdapter);

        String key = mAddDeviceSummaryPreferenceController.getPreferenceKey();
        mAddDevicePreference = new RestrictedPreference(mContext);
        mAddDevicePreference.setKey(key);
        when(mScreen.findPreference(key)).thenReturn(mAddDevicePreference);
        when(mBluetoothAdapter.isEnabled()).thenReturn(false);
        mAddDeviceSummaryPreferenceController.displayPreference(mScreen);
    }

    @Test
    public void getSummary_btOnThenOff_summaryShouldBeShown() {
        when(mBluetoothAdapter.isEnabled()).thenReturn(true);

        mAddDeviceSummaryPreferenceController.updateState();

        assertTrue(TextUtils.isEmpty(mAddDevicePreference.getSummary()));

        Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
        intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
        BroadcastReceiver receiver = ReflectionHelpers.getField(
                mAddDeviceSummaryPreferenceController, "mReceiver");
        when(mBluetoothAdapter.isEnabled()).thenReturn(false);

        receiver.onReceive(mContext, intent);

        assertThat(mAddDevicePreference.getSummary()).isEqualTo(
                mContext.getString(R.string.connected_device_add_device_summary));
    }

    @Test
    public void getSummary_btOffThenOn_summaryShouldNotBeShown() {
        when(mBluetoothAdapter.isEnabled()).thenReturn(false);

        mAddDeviceSummaryPreferenceController.updateState();

        assertThat(mAddDevicePreference.getSummary()).isEqualTo(
                mContext.getString(R.string.connected_device_add_device_summary));

        Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
        intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_ON);
        BroadcastReceiver receiver = ReflectionHelpers.getField(
                mAddDeviceSummaryPreferenceController, "mReceiver");
        when(mBluetoothAdapter.isEnabled()).thenReturn(true);

        receiver.onReceive(mContext, intent);

        assertTrue(TextUtils.isEmpty(mAddDevicePreference.getSummary()));
    }

    @Test
    public void getAvailabilityStatus_notHaveBluetoothFeature_unSupported() {
        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false);

        assertThat(mAddDeviceSummaryPreferenceController.getAvailabilityStatus())
                .isEqualTo(UNSUPPORTED_ON_DEVICE);
    }

    @Test
    public void getAvailabilityStatus_haveBluetoothFeature_supported() {
        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);

        assertThat(mAddDeviceSummaryPreferenceController.getAvailabilityStatus())
                .isEqualTo(AVAILABLE);
    }

    @Test
    public void getAvailabilityStatus_bluetoothIsEnabled_unSupported() {
        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);
        when(mBluetoothAdapter.isEnabled()).thenReturn(true);

        assertThat(mAddDeviceSummaryPreferenceController.getAvailabilityStatus())
                .isEqualTo(UNSUPPORTED_ON_DEVICE);
    }
}