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

Commit 832212ec authored by Danny Baumann's avatar Danny Baumann Committed by Bruno Martins
Browse files

LineageParts: Convert profile settings list to RecyclerView

Change-Id: Idd13baa4c08f04807c2cd096af2576db1f426251
parent 9253b011
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -12,17 +12,8 @@
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
        android:layout_weight="1"
    android:layout_width="match_parent"
        android:layout_height="0dp" />

    <View style="@style/settingSeparator" />

</LinearLayout>
    android:layout_height="match_parent"
    android:orientation="vertical" />
+0 −2
Original line number Diff line number Diff line
@@ -41,6 +41,4 @@
                android:paddingEnd="@dimen/pager_tabs_padding"/>
    </androidx.viewpager.widget.ViewPager>

    <View style="@style/settingSeparator" />

</LinearLayout>
+0 −8
Original line number Diff line number Diff line
@@ -133,14 +133,6 @@
        <item name="android:widgetLayout">@layout/preference_profiles_widget</item>
    </style>

    <style name="settingSeparator">
        <item name="android:paddingTop">2dp</item>
        <item name="android:paddingBottom">2dp</item>
        <item name="android:background">@android:drawable/divider_horizontal_dark</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">1dp</item>
    </style>

    <style name="OnBoardingStyle" parent="Theme.AppCompat.DayNight">
        <item name="colorAccent">#167c80</item>
        <item name="windowActionBar">false</item>
+45 −42
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The CyanogenMod Project
 *               2017 The LineageOS Project
 *               2017-2020 The LineageOS Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -37,6 +37,8 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.SeekBarVolumizer;
import android.provider.Settings;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -50,11 +52,9 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;

@@ -100,7 +100,7 @@ import static lineageos.profiles.ConnectionSettings.PROFILE_CONNECTION_WIFI;
import static lineageos.profiles.ConnectionSettings.PROFILE_CONNECTION_WIFIAP;

public class SetupActionsFragment extends SettingsPreferenceFragment
        implements AdapterView.OnItemClickListener {
        implements ItemListAdapter.OnItemClickListener {

    private static final int RINGTONE_REQUEST_CODE = 1000;
    private static final int NEW_TRIGGER_REQUEST_CODE = 1001;
@@ -132,7 +132,7 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
    Profile mProfile;
    ItemListAdapter mAdapter;
    ProfileManager mProfileManager;
    ListView mListView;
    RecyclerView mRecyclerView;

    boolean mNewProfileMode;

@@ -179,7 +179,7 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
        }

        mProfileManager = ProfileManager.getInstance(getActivity());
        mAdapter = new ItemListAdapter(getActivity(), mItems);
        mAdapter = new ItemListAdapter(getActivity(), mItems, this);
        rebuildItemList();

        setHasOptionsMenu(true);
@@ -189,31 +189,37 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
        } else if (savedInstanceState != null) {
            mLastSelectedPosition = savedInstanceState.getInt("last_selected_position", -1);
            if (mLastSelectedPosition != -1) {
                mSelectedItem = mAdapter.getItem(mLastSelectedPosition);
                mSelectedItem = mItems.get(mLastSelectedPosition);
            }
        }
    }

    private void rebuildItemList() {
        final Context context = getActivity();
        if (context == null) {
            return;
        }

        mItems.clear();

        // general prefs
        mItems.add(new Header(getString(R.string.profile_name_title)));
        mItems.add(new Header(R.string.profile_name_title));
        mItems.add(new ProfileNameItem(mProfile));

        if (!mNewProfileMode) {
            // triggers
            mItems.add(new Header(getString(R.string.profile_triggers_header)));
            mItems.add(new Header(R.string.profile_triggers_header));
            mItems.add(generateTriggerItem(TriggerItem.WIFI));
            if (DeviceUtils.deviceSupportsBluetooth()) {
                mItems.add(generateTriggerItem(TriggerItem.BLUETOOTH));
            }
            if (DeviceUtils.deviceSupportsNfc(getActivity())) {
            if (DeviceUtils.deviceSupportsNfc(context)) {
                mItems.add(generateTriggerItem(TriggerItem.NFC));
            }
        }

        // connection overrides
        mItems.add(new Header(getString(R.string.wireless_networks_settings_title)));
        mItems.add(new Header(R.string.wireless_networks_settings_title));
        if (DeviceUtils.deviceSupportsBluetooth()) {
            mItems.add(new ConnectionOverrideItem(PROFILE_CONNECTION_BLUETOOTH,
                    mProfile.getSettingsForConnection(PROFILE_CONNECTION_BLUETOOTH)));
@@ -233,14 +239,14 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
        }

        // add volume streams
        mItems.add(new Header(getString(R.string.profile_volumeoverrides_title)));
        mItems.add(new Header(R.string.profile_volumeoverrides_title));
        mItems.add(generateVolumeStreamItem(AudioManager.STREAM_ALARM));
        mItems.add(generateVolumeStreamItem(AudioManager.STREAM_MUSIC));
        mItems.add(generateVolumeStreamItem(AudioManager.STREAM_RING));
        mItems.add(generateVolumeStreamItem(AudioManager.STREAM_NOTIFICATION));

        // system settings
        mItems.add(new Header(getString(R.string.profile_system_settings_title)));
        mItems.add(new Header(R.string.profile_system_settings_title));
        mItems.add(new RingModeItem(mProfile.getRingMode()));
        mItems.add(new AirplaneModeItem(mProfile.getAirplaneMode()));
        DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(
@@ -253,8 +259,7 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
        }
        mItems.add(new BrightnessItem(mProfile.getBrightness()));

        final Activity activity = getActivity();
        if (DeviceUtils.isDozeAvailable(activity)) {
        if (DeviceUtils.isDozeAvailable(context)) {
            mItems.add(new DozeModeItem(mProfile));
        }

@@ -264,7 +269,7 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
        }

        // app groups
        mItems.add(new Header(getString(R.string.profile_app_group_category_title)));
        mItems.add(new Header(R.string.profile_app_group_category_title));

        int groupsAdded = 0;
        ProfileGroup[] profileGroups = mProfile.getProfileGroups();
@@ -276,8 +281,7 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
                        && !mProfile.getDefaultGroup().getUuid().equals(
                        profileGroup.getUuid())) {
                    mItems.add(new AppGroupItem(mProfile, profileGroup,
                            mProfileManager.getNotificationGroup(
                                    profileGroup.getUuid())));
                            mProfileManager.getNotificationGroup(profileGroup.getUuid())));
                    groupsAdded++;
                }
            }
@@ -357,6 +361,10 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mRecyclerView = view.findViewById(android.R.id.list);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecyclerView.setAdapter(mAdapter);

        if (mNewProfileMode) {
            TextView desc = new TextView(getActivity());
            int descPadding = getResources().getDimensionPixelSize(
@@ -374,7 +382,6 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mListView.setAdapter(mAdapter);
        final ActionBar actionBar = getActivity().getActionBar();
        if (actionBar != null) {
            if (mNewProfileMode) {
@@ -808,7 +815,7 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
            }
        }

        builder.setTitle(ConnectionOverrideItem.getConnectionTitle(getContext(), setting));
        builder.setTitle(ConnectionOverrideItem.getConnectionTitleResId(setting));
        builder.setSingleChoiceItems(connectionNames, defaultIndex,
                new DialogInterface.OnClickListener() {
                    @Override
@@ -1014,8 +1021,6 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_setup_actions, container, false);

        mListView = (ListView) view.findViewById(android.R.id.list);
        mListView.setOnItemClickListener(this);
        if (mNewProfileMode) {
            showButtonBar(true);

@@ -1039,38 +1044,36 @@ public class SetupActionsFragment extends SettingsPreferenceFragment
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        final Item itemAtPosition = (Item) parent.getItemAtPosition(position);
        mSelectedItem = itemAtPosition;
        mLastSelectedPosition = mAdapter.getPosition(itemAtPosition);
    public void onItemClick(Item item, int position) {
        mSelectedItem = item;
        mLastSelectedPosition = position;

        if (itemAtPosition instanceof AirplaneModeItem) {
        if (item instanceof AirplaneModeItem) {
            showDialog(DIALOG_AIRPLANE_MODE);
        } else if (itemAtPosition instanceof BrightnessItem) {
        } else if (item instanceof BrightnessItem) {
            showDialog(DIALOG_BRIGHTNESS);
        } else if (itemAtPosition instanceof LockModeItem) {
        } else if (item instanceof LockModeItem) {
            showDialog(DIALOG_LOCK_MODE);
        } else if (itemAtPosition instanceof DozeModeItem) {
        } else if (item instanceof DozeModeItem) {
            showDialog(DIALOG_DOZE_MODE);
        } else if (itemAtPosition instanceof NotificationLightModeItem) {
        } else if (item instanceof NotificationLightModeItem) {
            showDialog(DIALOG_NOTIFICATION_LIGHT_MODE);
        } else if (itemAtPosition instanceof RingModeItem) {
        } else if (item instanceof RingModeItem) {
            showDialog(DIALOG_RING_MODE);
        } else if (itemAtPosition instanceof ConnectionOverrideItem) {
        } else if (item instanceof ConnectionOverrideItem) {
            showDialog(DIALOG_CONNECTION_OVERRIDE);
        } else if (itemAtPosition instanceof VolumeStreamItem) {
        } else if (item instanceof VolumeStreamItem) {
            showDialog(DIALOG_VOLUME_STREAM);
        } else if (itemAtPosition instanceof ProfileNameItem) {
        } else if (item instanceof ProfileNameItem) {
            showDialog(DIALOG_PROFILE_NAME);
        } else if (itemAtPosition instanceof TriggerItem) {
            TriggerItem item = (TriggerItem) itemAtPosition;
            openTriggersFragment(item.getTriggerType());
        } else if (itemAtPosition instanceof AppGroupItem) {
            AppGroupItem item = (AppGroupItem) itemAtPosition;
            if (item.getGroupUuid() == null) {
        } else if (item instanceof TriggerItem) {
            openTriggersFragment(((TriggerItem) item).getTriggerType());
        } else if (item instanceof AppGroupItem) {
            AppGroupItem agi = (AppGroupItem) item;
            if (agi.getGroupUuid() == null) {
                requestActiveAppGroupsDialog();
            } else {
                startProfileGroupActivity(item);
                startProfileGroupActivity(agi);
            }
        }
    }
+83 −28
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The CyanogenMod Project
 *               2020 The LineageOS Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -16,62 +17,116 @@
package org.lineageos.lineageparts.profiles.actions;

import android.content.Context;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import org.lineageos.lineageparts.R;
import org.lineageos.lineageparts.profiles.actions.item.Item;

import java.util.List;

public class ItemListAdapter extends ArrayAdapter<Item> {
public class ItemListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
        implements View.OnClickListener {
    private LayoutInflater mInflater;
    private List<Item> mItems;
    private OnItemClickListener mItemClickListener;

    public enum RowType {
        HEADER_ITEM,
        DISABLED_ITEM,
        CONNECTION_ITEM,
        VOLUME_STREAM_ITEM,
        NAME_ITEM,
        RINGMODE_ITEM,
        AIRPLANEMODE_ITEM,
        LOCKSCREENMODE_ITEM,
        TRIGGER_ITEM,
        APP_GROUP_ITEM,
        BRIGHTNESS_ITEM,
        DOZEMODE_ITEM,
        NOTIFICATIONLIGHTMODE_ITEM
    }

    public ItemListAdapter(Context context, List<Item> items) {
        super(context, 0, items);
    public interface OnItemClickListener {
        void onItemClick(Item item, int position);
    }

    private static final int VIEW_TYPE_HEADER = 0;
    private static final int VIEW_TYPE_ITEM = 1;

    public ItemListAdapter(Context context, List<Item> items, OnItemClickListener clickListener) {
        super();
        mInflater = LayoutInflater.from(context);
        mItems = items;
        mItemClickListener = clickListener;
    }

    @Override
    public int getViewTypeCount() {
        return RowType.values().length;

    public int getItemCount() {
        return mItems.size();
    }

    @Override
    public int getItemViewType(int position) {
        return getItem(position).getRowType().ordinal();
        return mItems.get(position).isHeader() ? VIEW_TYPE_HEADER : VIEW_TYPE_ITEM;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getItem(position).getView(mInflater, convertView, parent);
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final RecyclerView.ViewHolder holder;
        if (viewType == VIEW_TYPE_HEADER) {
            holder = new HeaderViewHolder(
                    mInflater.inflate(R.layout.profiles_header, parent, false));
        } else {
            final View view = mInflater.inflate(
                    androidx.preference.R.layout.preference_material, parent, false);
            holder = new ItemViewHolder(view);
        }
        holder.itemView.setOnClickListener(this);
        return holder;
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final Item item = mItems.get(position);
        if (holder instanceof HeaderViewHolder) {
            ((HeaderViewHolder) holder).bind(item);
        } else {
            ((ItemViewHolder) holder).bind(item);
        }
        holder.itemView.setTag(holder);
    }

    @Override
    public boolean isEnabled(int position) {
        return getItem(position).isEnabled();
    public void onClick(View view) {
        RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder) view.getTag();
        int position = holder.getAdapterPosition();
        if (position != RecyclerView.NO_POSITION) {
            mItemClickListener.onItemClick(mItems.get(position), position);
        }
    }

    private static class HeaderViewHolder extends RecyclerView.ViewHolder {
        private final TextView mTitleView;

        private HeaderViewHolder(View view) {
            super(view);
            mTitleView = view.findViewById(android.R.id.title);
        }

        private void bind(Item item) {
            mTitleView.setText(item.getTitle(itemView.getContext()));
        }
    }

    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        private TextView mTitleView;
        private TextView mSummaryView;

        private ItemViewHolder(View view) {
            super(view);
            mTitleView = view.findViewById(android.R.id.title);
            mSummaryView = view.findViewById(android.R.id.summary);
        }

        private void bind(Item item) {
            String title = item.getTitle(itemView.getContext());
            String summary = item.getSummary(itemView.getContext());
            boolean enabled = item.isEnabled(itemView.getContext());

            mTitleView.setText(title);
            mTitleView.setVisibility(title != null ? View.VISIBLE : View.GONE);
            mTitleView.setEnabled(enabled);
            mSummaryView.setText(summary);
            mSummaryView.setVisibility(summary != null ? View.VISIBLE : View.GONE);
            mSummaryView.setEnabled(enabled);
        }
    }
}
Loading