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

Commit 05d06f99 authored by Edgar Wang's avatar Edgar Wang Committed by Android (Google) Code Review
Browse files

Merge "Clean up unused code -SingleTargetGearPreference" into main

parents 33231938 4650dfee
Loading
Loading
Loading
Loading
+0 −98
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  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.
  -->

<!-- Based off preference_two_target.xml with Material ripple moved to parent for full ripple. -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:gravity="center_vertical"
    android:background="?android:attr/selectableItemBackground"
    android:clipToPadding="false">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="start|center_vertical"
        android:clipToPadding="false"
        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">

        <LinearLayout
            android:id="@+id/icon_frame"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="start|center_vertical"
            android:minWidth="56dp"
            android:orientation="horizontal"
            android:clipToPadding="false"
            android:paddingTop="4dp"
            android:paddingBottom="4dp">
            <androidx.preference.internal.PreferenceImageView
                android:id="@android:id/icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                settings:maxWidth="48dp"
                settings:maxHeight="48dp" />
        </LinearLayout>

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:paddingTop="16dp"
            android:paddingBottom="16dp">

            <TextView
                android:id="@android:id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:textAppearance="?android:attr/textAppearanceListItem"
                android:ellipsize="marquee" />

            <TextView
                android:id="@android:id/summary"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@android:id/title"
                android:layout_alignStart="@android:id/title"
                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
                android:textColor="?android:attr/textColorSecondary"
                android:hyphenationFrequency="normalFast"
                android:lineBreakWordStyle="phrase"
                android:maxLines="10" />

        </RelativeLayout>

    </LinearLayout>

    <include layout="@layout/preference_two_target_divider" />

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout
        android:id="@android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:minWidth="@dimen/two_target_min_width"
        android:gravity="center"
        android:orientation="vertical" />

</LinearLayout>
+0 −67
Original line number Diff line number Diff line
/*
 * 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.settings.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

import com.android.settings.R;

/**
 * A preference with single target and a gear icon on the side.
 */
public class SingleTargetGearPreference extends Preference {
    public SingleTargetGearPreference(Context context, AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    public SingleTargetGearPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public SingleTargetGearPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public SingleTargetGearPreference(Context context) {
        super(context);
        init();
    }

    private void init() {
        setLayoutResource(R.layout.preference_single_target);
        setWidgetLayoutResource(R.layout.preference_widget_gear_optional_background);
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        final View divider = holder.findViewById(
                com.android.settingslib.widget.preference.twotarget.R.id.two_target_divider);
        if (divider != null) {
            divider.setVisibility(View.INVISIBLE);
        }
    }
}
+0 −397
Original line number Diff line number Diff line
/*
 * Copyright 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.settings.connecteddevice;

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

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

import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Looper;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.util.Pair;

import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;

import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothDevicePreference;
import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.connecteddevice.dock.DockUpdater;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.widget.SingleTargetGearPreference;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;

import org.junit.Before;
import org.junit.Rule;
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.annotation.Config;
import org.robolectric.shadow.api.Shadow;

import java.util.ArrayList;
import java.util.List;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowBluetoothAdapter.class)
public class PreviouslyConnectedDevicePreferenceControllerTest {

    private static final String KEY = "test_key";
    private static final String FAKE_ADDRESS_1 = "AA:AA:AA:AA:AA:01";
    private static final String FAKE_ADDRESS_2 = "AA:AA:AA:AA:AA:02";
    private static final String FAKE_ADDRESS_3 = "AA:AA:AA:AA:AA:03";
    private static final String FAKE_ADDRESS_4 = "AA:AA:AA:AA:AA:04";
    private static final String FAKE_ADDRESS_5 = "AA:AA:AA:AA:AA:05";

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    @Mock
    private DashboardFragment mDashboardFragment;
    @Mock
    private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
    @Mock
    private DockUpdater mDockUpdater;
    @Mock
    private PackageManager mPackageManager;
    @Mock
    private PreferenceManager mPreferenceManager;
    @Mock
    private Preference mSeeAllPreference;
    @Mock
    private CachedBluetoothDevice mCachedDevice1;
    @Mock
    private CachedBluetoothDevice mCachedDevice2;
    @Mock
    private CachedBluetoothDevice mCachedDevice3;
    @Mock
    private CachedBluetoothDevice mCachedDevice4;
    @Mock
    private CachedBluetoothDevice mCachedDevice5;
    @Mock
    private BluetoothDevice mBluetoothDevice1;
    @Mock
    private BluetoothDevice mBluetoothDevice2;
    @Mock
    private BluetoothDevice mBluetoothDevice3;
    @Mock
    private BluetoothDevice mBluetoothDevice4;
    @Mock
    private BluetoothDevice mBluetoothDevice5;
    @Mock
    private Drawable mDrawable;

    @Mock private BluetoothManager mBluetoothManager;
    @Mock private BluetoothAdapter mBluetoothAdapter;

    private Context mContext;
    private PreviouslyConnectedDevicePreferenceController mPreConnectedDeviceController;
    private PreferenceGroup mPreferenceGroup;
    private ShadowBluetoothAdapter mShadowBluetoothAdapter;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        Pair<Drawable, String> pairs = new Pair<>(mDrawable, "fake_device");
        mContext = spy(RuntimeEnvironment.application);
        doReturn(mContext).when(mDashboardFragment).getContext();
        doReturn(mPackageManager).when(mContext).getPackageManager();
        when(mContext.getSystemService(BluetoothManager.class)).thenReturn(mBluetoothManager);
        when(mBluetoothManager.getAdapter()).thenReturn(mBluetoothAdapter);
        when(mBluetoothAdapter.isEnabled()).thenReturn(true);
        mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());

        when(mCachedDevice1.getDevice()).thenReturn(mBluetoothDevice1);
        when(mCachedDevice1.getAddress()).thenReturn(FAKE_ADDRESS_1);
        when(mCachedDevice1.getDrawableWithDescription()).thenReturn(pairs);
        when(mCachedDevice2.getDevice()).thenReturn(mBluetoothDevice2);
        when(mCachedDevice2.getAddress()).thenReturn(FAKE_ADDRESS_2);
        when(mCachedDevice2.getDrawableWithDescription()).thenReturn(pairs);
        when(mCachedDevice3.getDevice()).thenReturn(mBluetoothDevice3);
        when(mCachedDevice3.getAddress()).thenReturn(FAKE_ADDRESS_3);
        when(mCachedDevice3.getDrawableWithDescription()).thenReturn(pairs);
        when(mCachedDevice4.getDevice()).thenReturn(mBluetoothDevice4);
        when(mCachedDevice4.getAddress()).thenReturn(FAKE_ADDRESS_4);
        when(mCachedDevice4.getDrawableWithDescription()).thenReturn(pairs);
        when(mCachedDevice5.getDevice()).thenReturn(mBluetoothDevice5);
        when(mCachedDevice5.getAddress()).thenReturn(FAKE_ADDRESS_5);
        when(mCachedDevice5.getDrawableWithDescription()).thenReturn(pairs);

        final List<BluetoothDevice> mMostRecentlyConnectedDevices = new ArrayList<>();
        mMostRecentlyConnectedDevices.add(mBluetoothDevice1);
        mMostRecentlyConnectedDevices.add(mBluetoothDevice2);
        mMostRecentlyConnectedDevices.add(mBluetoothDevice4);
        mMostRecentlyConnectedDevices.add(mBluetoothDevice3);
        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(mMostRecentlyConnectedDevices);
        when(mBluetoothAdapter.getMostRecentlyConnectedDevices())
                .thenReturn(mMostRecentlyConnectedDevices);

        mPreConnectedDeviceController =
                new PreviouslyConnectedDevicePreferenceController(mContext, KEY);
        mPreConnectedDeviceController.setBluetoothDeviceUpdater(mBluetoothDeviceUpdater);
        mPreConnectedDeviceController.setSavedDockUpdater(mDockUpdater);
        mPreferenceGroup = spy(new PreferenceCategory(mContext));
        doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager();
        mPreferenceGroup.setVisible(false);
        mPreConnectedDeviceController.setPreferenceGroup(mPreferenceGroup);
        mPreConnectedDeviceController.mSeeAllPreference = mSeeAllPreference;
    }

    @Test
    public void onStart_registerCallback() {
        // register the callback in onStart()
        mPreConnectedDeviceController.onStart();

        verify(mBluetoothDeviceUpdater).registerCallback();
        verify(mDockUpdater).registerCallback();
        verify(mContext).registerReceiver(mPreConnectedDeviceController.mReceiver,
                mPreConnectedDeviceController.mIntentFilter, Context.RECEIVER_EXPORTED_UNAUDITED);
        verify(mBluetoothDeviceUpdater).refreshPreference();
    }

    @Test
    public void onStop_unregisterCallback() {
        // register it first
        mContext.registerReceiver(mPreConnectedDeviceController.mReceiver, null,
                Context.RECEIVER_EXPORTED/*UNAUDITED*/);

        // unregister the callback in onStop()
        mPreConnectedDeviceController.onStop();

        verify(mBluetoothDeviceUpdater).unregisterCallback();
        verify(mDockUpdater).unregisterCallback();
        verify(mContext).unregisterReceiver(mPreConnectedDeviceController.mReceiver);
    }

    @Test
    public void getAvailabilityStatus_noBluetoothDockFeature_returnUnSupported() {
        doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
        mPreConnectedDeviceController.setSavedDockUpdater(null);

        assertThat(mPreConnectedDeviceController.getAvailabilityStatus()).isEqualTo(
                CONDITIONALLY_UNAVAILABLE);
    }

    @Test
    public void getAvailabilityStatus_hasBluetoothFeature_returnSupported() {
        doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
        mPreConnectedDeviceController.setSavedDockUpdater(null);

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

    @Test
    public void getAvailabilityStatus_haveDockFeature_returnSupported() {
        doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);

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

    @Test
    public void onDeviceAdded_addDevicePreference_displayIt() {
        final BluetoothDevicePreference preference1 = new BluetoothDevicePreference(
                mContext, mCachedDevice1, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);

        mPreConnectedDeviceController.onDeviceAdded(preference1);
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
    }

    @Test
    public void onDeviceAdded_addDockDevicePreference_displayIt() {
        final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference(
                mContext, null /* AttributeSet */);

        mPreConnectedDeviceController.onDeviceAdded(dockPreference);
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
    }

    @Test
    public void onDeviceAdded_addFourDevicePreference_onlyDisplayThree() {
        final BluetoothDevicePreference preference1 = new BluetoothDevicePreference(
                mContext, mCachedDevice1, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final BluetoothDevicePreference preference2 = new BluetoothDevicePreference(
                mContext, mCachedDevice2, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final BluetoothDevicePreference preference3 = new BluetoothDevicePreference(
                mContext, mCachedDevice3, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final BluetoothDevicePreference preference4 = new BluetoothDevicePreference(
                mContext, mCachedDevice4, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference(
                mContext, null /* AttributeSet */);

        mPreConnectedDeviceController.onDeviceAdded(preference1);
        mPreConnectedDeviceController.onDeviceAdded(preference2);
        mPreConnectedDeviceController.onDeviceAdded(preference3);
        mPreConnectedDeviceController.onDeviceAdded(preference4);
        mPreConnectedDeviceController.onDeviceAdded(dockPreference);
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        // 3 BluetoothDevicePreference and 1 see all preference
        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4);
    }

    @Test
    public void onDeviceAdded_addPreferenceNotExistInRecentlyDevices_noCrash() {
        final BluetoothDevicePreference preference = new BluetoothDevicePreference(
                mContext, mCachedDevice5, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);

        mPreConnectedDeviceController.onDeviceAdded(preference);
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        // 1 see all preference
        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
    }

    @Test
    public void onDeviceAdded_addPreferenceNotExistInRecentlyDevices_doNothing() {
        final BluetoothDevicePreference preference = new BluetoothDevicePreference(
                mContext, mCachedDevice5, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);

        mPreConnectedDeviceController.onDeviceAdded(preference);
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        // 1 see all preference
        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
    }

    @Test
    public void onDeviceRemoved_removeLastDevice_showSeeAllPreference() {
        final BluetoothDevicePreference preference1 = new BluetoothDevicePreference(
                mContext, mCachedDevice1, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference(
                mContext, null /* AttributeSet */);
        mPreferenceGroup.addPreference(preference1);
        mPreferenceGroup.addPreference(dockPreference);

        mPreConnectedDeviceController.onDeviceRemoved(preference1);
        mPreConnectedDeviceController.onDeviceRemoved(dockPreference);
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
    }

    @Test
    public void updatePreferenceVisibility_bluetoothIsEnable_shouldShowCorrectText() {
        mShadowBluetoothAdapter.setEnabled(true);
        when(mBluetoothAdapter.isEnabled()).thenReturn(true);
        mPreConnectedDeviceController.updatePreferenceVisibility();

        verify(mSeeAllPreference).setSummary("");
    }

    @Test
    public void updatePreferenceVisibility_bluetoothIsDisable_shouldShowCorrectText() {
        mShadowBluetoothAdapter.setEnabled(false);
        when(mBluetoothAdapter.isEnabled()).thenReturn(false);
        mPreConnectedDeviceController.updatePreferenceVisibility();

        verify(mSeeAllPreference).setSummary(
                mContext.getString(R.string.connected_device_see_all_summary));
    }

    @Test
    public void updatePreferenceGroup_bluetoothIsEnable_shouldOrderByMostRecentlyConnected() {
        when(mBluetoothAdapter.isEnabled()).thenReturn(true);
        final BluetoothDevicePreference preference4 =
                new BluetoothDevicePreference(
                        mContext,
                        mCachedDevice4,
                        true,
                        BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final BluetoothDevicePreference preference3 =
                new BluetoothDevicePreference(
                        mContext,
                        mCachedDevice3,
                        true,
                        BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final BluetoothDevicePreference preference2 =
                new BluetoothDevicePreference(
                        mContext,
                        mCachedDevice2,
                        true,
                        BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        mPreConnectedDeviceController.onDeviceAdded(preference4);
        mPreConnectedDeviceController.onDeviceAdded(preference3);
        mPreConnectedDeviceController.onDeviceAdded(preference2);

        mPreConnectedDeviceController.updatePreferenceGroup();
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        // Refer to the order of {@link #mMostRecentlyConnectedDevices}, the first one is see all
        // preference
        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4);
        assertThat(preference2.getOrder()).isEqualTo(0);
        assertThat(preference4.getOrder()).isEqualTo(1);
        assertThat(preference3.getOrder()).isEqualTo(2);
    }

    @Test
    public void updatePreferenceGroup_bluetoothIsDisable_shouldShowOnlySeeAllPreference() {
        when(mBluetoothAdapter.isEnabled()).thenReturn(false);
        final BluetoothDevicePreference preference4 =
                new BluetoothDevicePreference(
                        mContext,
                        mCachedDevice4,
                        true,
                        BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final BluetoothDevicePreference preference3 =
                new BluetoothDevicePreference(
                        mContext,
                        mCachedDevice3,
                        true,
                        BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        final BluetoothDevicePreference preference2 =
                new BluetoothDevicePreference(
                        mContext,
                        mCachedDevice2,
                        true,
                        BluetoothDevicePreference.SortType.TYPE_NO_SORT);
        mPreConnectedDeviceController.onDeviceAdded(preference4);
        mPreConnectedDeviceController.onDeviceAdded(preference3);
        mPreConnectedDeviceController.onDeviceAdded(preference2);

        mPreConnectedDeviceController.updatePreferenceGroup();
        shadowOf(Looper.getMainLooper()).runToEndOfTasks();

        // 1 see all preference
        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
    }
}