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

Commit 542cd442 authored by Edgar Wang's avatar Edgar Wang
Browse files

Apply round corner group background for large screen

Bug: 340510477
Test: manual

Change-Id: I53ea81cee3b6bf543a71237030a61df6aef0e967
parent d0a35f61
Loading
Loading
Loading
Loading
+0 −29
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  Copyright (C) 2024 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.
  -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="@*android:color/ripple_material_light">
    <item
        android:left="?android:attr/listPreferredItemPaddingStart"
        android:right="?android:attr/listPreferredItemPaddingEnd">
        <shape android:shape="rectangle">
            <solid
                android:color="@color/settingslib_materialColorPrimaryContainer" />
            <corners
                android:radius="?android:attr/dialogCornerRadius" />
        </shape>
    </item>
</ripple>
 No newline at end of file
+0 −29
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  Copyright (C) 2024 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.
  -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:attr/colorControlHighlight">
    <item android:id="@android:id/mask"
        android:left="?android:attr/listPreferredItemPaddingStart"
        android:right="?android:attr/listPreferredItemPaddingEnd">
        <shape android:shape="rectangle">
            <solid
                android:color="@android:color/white" />
            <corners
                android:radius="?android:attr/dialogCornerRadius" />
        </shape>
    </item>
</ripple>
+40 −23
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.os.Handler;
import android.os.Looper;
import android.view.View;

import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -27,6 +28,7 @@ import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceGroupAdapter;
import androidx.preference.PreferenceViewHolder;

import com.android.settings.flags.Flags;
import com.android.settingslib.widget.theme.R;

import java.util.ArrayList;
@@ -68,14 +70,47 @@ public class RoundCornerPreferenceAdapter extends PreferenceGroupAdapter {
    @Override
    public void onBindViewHolder(@NonNull PreferenceViewHolder holder, int position) {
        super.onBindViewHolder(holder, position);
        if (Flags.homepageRevamp()) {
            updateBackground(holder, position);
        }
    }

    protected @DrawableRes int getRoundCornerDrawableRes(int position, boolean isSelected) {
        int CornerType = mRoundCornerMappingList.get(position);

        if ((CornerType & ROUND_CORNER_CENTER) == 0) {
            return 0;
        }

        if (((CornerType & ROUND_CORNER_TOP) != 0) && ((CornerType & ROUND_CORNER_BOTTOM) == 0)) {
            // the first
            return isSelected ? R.drawable.settingslib_round_background_top_selected
                    : R.drawable.settingslib_round_background_top;
        } else if (((CornerType & ROUND_CORNER_BOTTOM) != 0)
                && ((CornerType & ROUND_CORNER_TOP) == 0)) {
            // the last
            return isSelected ? R.drawable.settingslib_round_background_bottom_selected
                    : R.drawable.settingslib_round_background_bottom;
        } else if (((CornerType & ROUND_CORNER_TOP) != 0)
                && ((CornerType & ROUND_CORNER_BOTTOM) != 0)) {
            // the only one preference
            return isSelected ? R.drawable.settingslib_round_background_selected
                    : R.drawable.settingslib_round_background;
        } else {
            // in the center
            return isSelected ? R.drawable.settingslib_round_background_center_selected
                    : R.drawable.settingslib_round_background_center;
        }
    }

    @SuppressWarnings("WeakerAccess") /* synthetic access */
    private void updatePreferences() {
        if (Flags.homepageRevamp()) {
            mRoundCornerMappingList = new ArrayList<>();
            mappingPreferenceGroup(mRoundCornerMappingList, mPreferenceGroup);
        }
    }

    private void mappingPreferenceGroup(List<Integer> visibleList, PreferenceGroup group) {
        int groupSize = group.getPreferenceCount();
        int firstVisible = 0;
@@ -125,27 +160,9 @@ public class RoundCornerPreferenceAdapter extends PreferenceGroupAdapter {

    /** handle roundCorner background */
    private void updateBackground(PreferenceViewHolder holder, int position) {
        int CornerType = mRoundCornerMappingList.get(position);

        if ((CornerType & ROUND_CORNER_CENTER) == 0) {
            return;
        }
        @DrawableRes int backgroundRes = getRoundCornerDrawableRes(position, false /* isSelected*/);

        View v = holder.itemView;
        if (((CornerType & ROUND_CORNER_TOP) != 0) && ((CornerType & ROUND_CORNER_BOTTOM) == 0)) {
            // the first
            v.setBackgroundResource(R.drawable.settingslib_round_background_top);
        } else if (((CornerType & ROUND_CORNER_BOTTOM) != 0)
                && ((CornerType & ROUND_CORNER_TOP) == 0)) {
            // the last
            v.setBackgroundResource(R.drawable.settingslib_round_background_bottom);
        } else if (((CornerType & ROUND_CORNER_TOP) != 0)
                && ((CornerType & ROUND_CORNER_BOTTOM) != 0)) {
            // the only one preference
            v.setBackgroundResource(R.drawable.settingslib_round_background);
        } else {
            // in the center
            v.setBackgroundResource(R.drawable.settingslib_round_background_center);
        }
        v.setBackgroundResource(backgroundRes);
    }
}
+33 −26
Original line number Diff line number Diff line
@@ -25,35 +25,32 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.DrawableRes;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceGroupAdapter;
import androidx.preference.PreferenceViewHolder;
import androidx.recyclerview.widget.RecyclerView;
import androidx.window.embedding.ActivityEmbeddingController;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.RoundCornerPreferenceAdapter;
import com.android.settings.flags.Flags;
import com.android.settings.homepage.SettingsHomepageActivity;

/**
 *  Adapter for highlighting top level preferences
 */
public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapter implements
public class HighlightableTopLevelPreferenceAdapter extends RoundCornerPreferenceAdapter implements
        SettingsHomepageActivity.HomepageLoadedListener {

    private static final String TAG = "HighlightableTopLevelAdapter";

    static final long DELAY_HIGHLIGHT_DURATION_MILLIS = 100L;
    private static final int RES_NORMAL_BACKGROUND =
            Flags.homepageRevamp()
                    ? R.drawable.homepage_selectable_item_background_v2
                    : R.drawable.homepage_selectable_item_background;
            R.drawable.homepage_selectable_item_background;
    private static final int RES_HIGHLIGHTED_BACKGROUND =
            Flags.homepageRevamp()
                    ? R.drawable.homepage_highlighted_item_background_v2
                    : R.drawable.homepage_highlighted_item_background;
            R.drawable.homepage_highlighted_item_background;

    private final int mTitleColorNormal;
    private final int mTitleColorHighlight;
@@ -101,7 +98,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
    @VisibleForTesting
    void updateBackground(PreferenceViewHolder holder, int position) {
        if (!isHighlightNeeded()) {
            removeHighlightBackground(holder);
            removeHighlightBackground(holder, position);
            return;
        }

@@ -109,9 +106,9 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
                && mHighlightKey != null
                && TextUtils.equals(mHighlightKey, getItem(position).getKey())) {
            // This position should be highlighted.
            addHighlightBackground(holder);
            addHighlightBackground(holder, position);
        } else {
            removeHighlightBackground(holder);
            removeHighlightBackground(holder, position);
        }
    }

@@ -226,14 +223,18 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
            // De-highlight the existing preference view holder at an early stage
            final PreferenceViewHolder holder = mViewHolders.get(position);
            if (holder != null) {
                removeHighlightBackground(holder);
                removeHighlightBackground(holder, position);
            }
            notifyItemChanged(position);
        }
    }

    private void addHighlightBackground(PreferenceViewHolder holder) {
    private void addHighlightBackground(PreferenceViewHolder holder, int position) {
        final View v = holder.itemView;
        if (Flags.homepageRevamp()) {
            @DrawableRes int bgRes = getRoundCornerDrawableRes(position, true /*isSelected*/);
            v.setBackgroundResource(bgRes);
        } else {
            v.setBackgroundResource(RES_HIGHLIGHTED_BACKGROUND);
            ((TextView) v.findViewById(android.R.id.title)).setTextColor(mTitleColorHighlight);
            ((TextView) v.findViewById(android.R.id.summary)).setTextColor(mSummaryColorHighlight);
@@ -242,9 +243,14 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
                drawable.setTint(mIconColorHighlight);
            }
        }
    }

    private void removeHighlightBackground(PreferenceViewHolder holder) {
    private void removeHighlightBackground(PreferenceViewHolder holder, int position) {
        final View v = holder.itemView;
        if (Flags.homepageRevamp()) {
            @DrawableRes int bgRes = getRoundCornerDrawableRes(position, false /*isSelected*/);
            v.setBackgroundResource(bgRes);
        } else {
            v.setBackgroundResource(RES_NORMAL_BACKGROUND);
            ((TextView) v.findViewById(android.R.id.title)).setTextColor(mTitleColorNormal);
            ((TextView) v.findViewById(android.R.id.summary)).setTextColor(mSummaryColorNormal);
@@ -253,6 +259,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
                drawable.setTint(mIconColorNormal);
            }
        }
    }

    private boolean isHighlightNeeded() {
        return ActivityEmbeddingController.getInstance(mHomepageActivity)