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

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

Merge "Remove divider lines from new IA fragments."

parents 62b397d3 cdc1135e
Loading
Loading
Loading
Loading
+0 −92
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.dashboard;

import android.content.Context;
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.PreferenceGroupAdapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.android.settings.overlay.FeatureFactory;

public class DashboardDividerDecoration extends RecyclerView.ItemDecoration {

    private final DashboardFeatureProvider mDashboardFeatureProvider;

    private Drawable mDivider;
    private int mDividerHeight;

    public DashboardDividerDecoration(Context context) {
        mDashboardFeatureProvider = FeatureFactory.getFactory(context)
                .getDashboardFeatureProvider(context);
    }

    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 - 1; childViewIndex++) {
            final View view = parent.getChildAt(childViewIndex);
            if (shouldDrawDividerBelow(view, parent)) {
                int top = (int) ViewCompat.getY(view) + view.getHeight();
                mDivider.setBounds(0, top, width, top + mDividerHeight);
                mDivider.draw(c);
            }
        }
    }

    private boolean shouldDrawDividerBelow(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);
        final Preference nextPref = prefAdapter.getItem(adapterPosition + 1);
        if (nextPref == null) {
            return false;
        }

        return mDashboardFeatureProvider.getPriorityGroup(pref)
                != mDashboardFeatureProvider.getPriorityGroup(nextPref);
    }

}
+0 −7
Original line number Diff line number Diff line
@@ -58,7 +58,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
    private final Map<Class, PreferenceController> mPreferenceControllers =
            new ArrayMap<>();
    private final Set<String> mDashboardTilePrefKeys = new ArraySet<>();
    private DashboardDividerDecoration mDividerDecoration;

    protected ProgressiveDisclosureMixin mProgressiveDisclosureMixin;
    protected DashboardFeatureProvider mDashboardFeatureProvider;
@@ -99,9 +98,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View view = super.onCreateView(inflater, container, savedInstanceState);
        if (mDashboardFeatureProvider.isEnabled()) {
            getListView().addItemDecoration(mDividerDecoration);
        }
        return view;
    }

@@ -118,7 +114,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        super.onCreatePreferences(savedInstanceState, rootKey);
        mDividerDecoration = new DashboardDividerDecoration(getContext());
        refreshAllPreferences(getLogTag());
    }

@@ -126,8 +121,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
    public void setDivider(Drawable divider) {
        if (mDashboardFeatureProvider.isEnabled()) {
            // Intercept divider and set it transparent so system divider decoration is disabled.
            // We will use our decoration to draw divider more intelligently.
            mDividerDecoration.setDivider(divider);
            super.setDivider(new ColorDrawable(Color.TRANSPARENT));
        } else {
            super.setDivider(divider);
+0 −107
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.dashboard;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroupAdapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

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

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Context mContext;
    @Mock
    private Drawable mDrawable;
    @Mock
    private Canvas mCanvas;
    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private RecyclerView mRecyclerView;
    @Mock
    private PreferenceGroupAdapter mAdapter;
    @Mock
    private Preference pref1;
    @Mock
    private Preference pref2;
    private DashboardDividerDecoration mDecoration;
    private FakeFeatureFactory mFactory;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        FakeFeatureFactory.setupForTest(mContext);
        mFactory = (FakeFeatureFactory) FeatureFactory.getFactory(mContext);
        mDecoration = new DashboardDividerDecoration(mContext);
        mDecoration.setDivider(mDrawable);
        mDecoration.setDividerHeight(3);
    }

    @Test
    public void drawOver_differentPriorityGroup_shouldDrawDivider() {
        when(mRecyclerView.getAdapter()).thenReturn(mAdapter);
        when(mRecyclerView.getChildCount()).thenReturn(2);
        when(mRecyclerView.getChildAdapterPosition(any(View.class)))
                .thenReturn(0)
                .thenReturn(1);
        when(mAdapter.getItem(0)).thenReturn(pref1);
        when(mAdapter.getItem(1)).thenReturn(pref2);
        when(mFactory.dashboardFeatureProvider.getPriorityGroup(pref1)).thenReturn(1);
        when(mFactory.dashboardFeatureProvider.getPriorityGroup(pref2)).thenReturn(2);

        mDecoration.onDrawOver(mCanvas, mRecyclerView, null /* state */);

        verify(mDrawable).draw(mCanvas);
    }


    @Test
    public void drawOver_samePriorityGroup_doNotDrawDivider() {
        when(mRecyclerView.getAdapter()).thenReturn(mAdapter);
        when(mRecyclerView.getChildCount()).thenReturn(2);
        when(mRecyclerView.getChildAdapterPosition(any(View.class)))
                .thenReturn(0)
                .thenReturn(1);
        when(mAdapter.getItem(0)).thenReturn(pref1);
        when(mAdapter.getItem(1)).thenReturn(pref2);

        mDecoration.onDrawOver(mCanvas, mRecyclerView, null /* state */);

        verify(mDrawable, never()).draw(mCanvas);
    }
}