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

Commit bfb006aa authored by Fan Zhang's avatar Fan Zhang
Browse files

Use framework support to customize dividers between prefs.

Bug: 33579296
Test: make RunSettingsRoboTests
Change-Id: I1bb3b82b88dc727cda05b00058e6f40564f0e5db
parent 427b99cb
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -21,35 +21,44 @@

    <dimen name="preference_no_icon_padding_start">72dp</dimen>

    <style name="ApnPreference">
        <item name="android:layout">@layout/apn_preference_layout</item>
    <!-- Fragment style -->
    <style name="PreferenceFragmentStyle" parent="@*android:style/PreferenceFragment.Material">
        <item name="android:layout">@layout/preference_list_fragment</item>
        <item name="allowDividerAfterLastItem">false</item>
    </style>

    <style name="EditTextPreference"
           parent="@style/Preference.DialogPreference.EditTextPreference.Material">
    <!-- Preferences -->
    <style name="SettingsPreference">
        <item name="allowDividerAbove">false</item>
        <item name="allowDividerBelow">true</item>
        <item name="android:layout">@layout/preference_material_settings</item>
        <item name="android:dialogLayout">@layout/preference_dialog_edittext</item>
    </style>

    <style name="PreferenceFragmentStyle" parent="@*android:style/PreferenceFragment.Material">
        <item name="android:layout">@layout/preference_list_fragment</item>
    <style name="ApnPreference" parent="SettingsPreference">
        <item name="android:layout">@layout/apn_preference_layout</item>
    </style>

    <style name="SettingsPreference">
    <style name="EditTextPreference"
           parent="@style/Preference.DialogPreference.EditTextPreference.Material">
        <item name="allowDividerAbove">false</item>
        <item name="allowDividerBelow">true</item>
        <item name="android:layout">@layout/preference_material_settings</item>
        <item name="android:dialogLayout">@layout/preference_dialog_edittext</item>
    </style>

    <style name="SettingsDropdownPreference">
    <style name="SettingsDropdownPreference" parent="SettingsPreference">
        <item name="android:layout">@layout/preference_dropdown_material_settings</item>
    </style>

    <style name="SettingsDialogPreference" parent="SettingsPreference" />

    <style name="SettingsPreferenceCategory" parent="@style/Preference.Category.Material">
        <item name="allowDividerAbove">true</item>
        <item name="allowDividerBelow">true</item>
        <item name="android:layout">@layout/preference_category_material_settings</item>
    </style>

    <style name="SettingsSeekBarPreference">
    <style name="SettingsSeekBarPreference" parent="SettingsPreference">
        <item name="android:layout">@layout/preference_widget_seekbar_settings</item>
    </style>

+0 −24
Original line number Diff line number Diff line
@@ -17,13 +17,7 @@
package com.android.settings.core;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.android.settings.core.instrumentation.Instrumentable;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
@@ -31,7 +25,6 @@ import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.core.lifecycle.ObservablePreferenceFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.survey.SurveyMixin;
import com.android.settings.widget.PreferenceDividerDecoration;

/**
 * Instrumented fragment that logs visibility state.
@@ -44,9 +37,6 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
    // metrics placeholder value. Only use this for development.
    protected final int PLACEHOLDER_METRIC = 10000;

    private final PreferenceDividerDecoration mDividerDecoration =
            new PreferenceDividerDecoration();

    private final VisibilityLoggerMixin mVisibilityLoggerMixin;

    public InstrumentedPreferenceFragment() {
@@ -62,14 +52,6 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View view = super.onCreateView(inflater, container, savedInstanceState);
        getListView().addItemDecoration(mDividerDecoration);
        return view;
    }

    @Override
    public void onResume() {
        mVisibilityLoggerMixin.setSourceMetricsCategory(getActivity());
@@ -80,12 +62,6 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    }

    @Override
    public void setDivider(Drawable divider) {
        mDividerDecoration.setDivider(divider);
        super.setDivider(new ColorDrawable(Color.TRANSPARENT));
    }

    protected final Context getPrefContext() {
        return getPreferenceManager().getContext();
    }
+6 −3
Original line number Diff line number Diff line
@@ -59,15 +59,18 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
    }

    public VolumeSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
        super(context, attrs, defStyleAttr);
        setLayoutResource(R.layout.preference_volume_slider);
    }

    public VolumeSeekBarPreference(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        super(context, attrs);
        setLayoutResource(R.layout.preference_volume_slider);
    }

    public VolumeSeekBarPreference(Context context) {
        this(context, null);
        super(context);
        setLayoutResource(R.layout.preference_volume_slider);
    }

    public void setStream(int stream) {
+0 −79
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v4.view.ViewCompat;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceGroupAdapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;

public class PreferenceDividerDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;
    private int mDividerHeight;

    public void setDivider(Drawable divider) {
        if (divider != null) {
            mDividerHeight = divider.getIntrinsicHeight();
        } else {
            mDividerHeight = 0;
        }
        mDivider = divider;
    }

    public void setDividerHeight(int dividerHeight) {
        mDividerHeight = dividerHeight;
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (mDivider == null) {
            return;
        }
        final int childCount = parent.getChildCount();
        final int width = parent.getWidth();
        for (int childViewIndex = 0; childViewIndex < childCount; childViewIndex++) {
            final View view = parent.getChildAt(childViewIndex);
            if (shouldDrawDividerAbove(view, parent)) {
                int top = (int) ViewCompat.getY(view);
                mDivider.setBounds(0, top, width, top + mDividerHeight);
                mDivider.draw(c);
            }
        }
    }

    private boolean shouldDrawDividerAbove(View view, RecyclerView parent) {
        final RecyclerView.Adapter adapter = parent.getAdapter();
        if (adapter == null || !(adapter instanceof PreferenceGroupAdapter)) {
            return false;
        }
        final PreferenceGroupAdapter prefAdapter = (PreferenceGroupAdapter) adapter;
        final int adapterPosition = parent.getChildAdapterPosition(view);
        if (adapterPosition == RecyclerView.NO_POSITION) {
            return false;
        }
        final Preference pref = prefAdapter.getItem(adapterPosition);
        if (pref instanceof PreferenceCategory) {
            return adapterPosition != 0;
        }
        return pref instanceof FooterPreference;
    }
}
+2 −10
Original line number Diff line number Diff line
@@ -19,10 +19,6 @@ package com.android.settings;
import android.content.Context;
import android.os.UserManager;
import android.support.v7.preference.PreferenceScreen;
import android.test.AndroidTestCase;

import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.DeviceInfoUtils;

import org.junit.Before;
import org.junit.Test;
@@ -33,14 +29,13 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;

import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DeviceInfoSettingsTest extends AndroidTestCase {
public class DeviceInfoSettingsTest {

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Context mContext;
@@ -49,21 +44,18 @@ public class DeviceInfoSettingsTest extends AndroidTestCase {
    @Mock
    private UserManager mUserManager;

    private FakeFeatureFactory mFeatureFactory;
    private DeviceInfoSettings mSettings;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        FakeFeatureFactory.setupForTest(mContext);
        mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
        mSettings = spy(new DeviceInfoSettings());
        doReturn(mScreen).when(mSettings).getPreferenceScreen();
    }

    @Test
    public void getPrefXml_shoudlReturnDeviceInfoXml() {
    public void getPrefXml_shouldReturnDeviceInfoXml() {
        assertThat(mSettings.getPreferenceScreenResId()).isEqualTo(R.xml.device_info_settings);
    }
}
Loading