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

Commit d0199cf8 authored by Roman Birg's avatar Roman Birg Committed by Adnan Begovic
Browse files

SystemUI: allow WiFi & Bluetooth tile details to scroll



We can now show all WiFi/Bluetooth devices in the lists

Change-Id: Ie71971842902cb6ba9f0757f3893a7a7214ad789
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 80d3e0aa
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -45,4 +45,6 @@
    <dimen name="phone_bottom_padding">40dp</dimen>
    <dimen name="phone_width">320dp</dimen>
    <dimen name="phone_height">420dp</dimen>

    <dimen name="qs_detail_item_height_twoline">72dp</dimen>
</resources>
+57 −0
Original line number Diff line number Diff line
@@ -17,11 +17,13 @@
package com.android.systemui.qs;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
@@ -30,6 +32,8 @@ import android.widget.ListView;
import android.widget.TextView;
import com.android.systemui.R;

import java.util.List;

/**
 * Quick settings common detail list view with line items.
 */
@@ -88,4 +92,57 @@ public class QSDetailItemsList extends LinearLayout {
        mEmptyIcon = (ImageView) mEmpty.findViewById(android.R.id.icon);
        mListView.setEmptyView(mEmpty);
    }

    public static class QSDetailListAdapter extends ArrayAdapter<QSDetailItems.Item> {
        private QSDetailItems.Callback mCallback;

        public QSDetailListAdapter(Context context, List<QSDetailItems.Item> objects) {
            super(context, R.layout.qs_detail_item, objects);
        }

        public void setCallback(QSDetailItems.Callback cb) {
            mCallback = cb;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            LinearLayout view = (LinearLayout) inflater.inflate(
                    R.layout.qs_detail_item, parent, false);

            view.setClickable(false); // let list view handle this

            final QSDetailItems.Item item = getItem(position);

            final ImageView iv = (ImageView) view.findViewById(android.R.id.icon);
            iv.setImageResource(item.icon);
            iv.getOverlay().clear();
            if (item.overlay != null) {
                item.overlay.setBounds(0, 0, item.overlay.getIntrinsicWidth(),
                        item.overlay.getIntrinsicHeight());
                iv.getOverlay().add(item.overlay);
            }
            final TextView title = (TextView) view.findViewById(android.R.id.title);
            title.setText(item.line1);
            final TextView summary = (TextView) view.findViewById(android.R.id.summary);
            final boolean twoLines = !TextUtils.isEmpty(item.line2);
            title.setMaxLines(twoLines ? 1 : 2);
            summary.setVisibility(twoLines ? VISIBLE : GONE);
            summary.setText(twoLines ? item.line2 : null);
            view.setMinimumHeight(getContext().getResources().getDimensionPixelSize(
                    twoLines ? R.dimen.qs_detail_item_height_twoline : R.dimen.qs_detail_item_height));

            final ImageView disconnect = (ImageView) view.findViewById(android.R.id.icon2);
            disconnect.setVisibility(item.canDisconnect ? VISIBLE : GONE);
            disconnect.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mCallback != null) {
                        mCallback.onDetailItemDisconnect(item);
                    }
                }
            });
            return view;
        }
    }
}
+46 −25
Original line number Diff line number Diff line
@@ -25,18 +25,25 @@ import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;

import com.android.internal.logging.MetricsLogger;

import com.android.settingslib.bluetooth.CachedBluetoothDevice;

import com.android.systemui.R;
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSDetailItemsList;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.BluetoothController;

import cyanogenmod.app.StatusBarPanelCustomTile;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
import java.util.List;

/** Quick settings tile: Bluetooth **/
public class BluetoothTile extends QSTile<QSTile.BooleanState>  {
@@ -172,8 +179,11 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> {
        }
    };

    private final class BluetoothDetailAdapter implements DetailAdapter, QSDetailItems.Callback {
        private QSDetailItems mItems;
    private final class BluetoothDetailAdapter implements DetailAdapter,
            QSDetailItems.Callback, AdapterView.OnItemClickListener {
        private QSDetailItemsList mItemsList;
        private QSDetailItemsList.QSDetailListAdapter mAdapter;
        private List<Item> mBluetoothItems = new ArrayList<>();

        @Override
        public int getTitle() {
@@ -209,29 +219,34 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> {

        @Override
        public View createDetailView(Context context, View convertView, ViewGroup parent) {
            mItems = QSDetailItems.convertOrInflate(context, convertView, parent);
            mItems.setTagSuffix("Bluetooth");
            mItems.setEmptyState(R.drawable.ic_qs_bluetooth_detail_empty,
            mItemsList = QSDetailItemsList.convertOrInflate(context, convertView, parent);
            ListView listView = mItemsList.getListView();
            listView.setDivider(null);
            listView.setOnItemClickListener(this);
            listView.setAdapter(mAdapter =
                    new QSDetailItemsList.QSDetailListAdapter(context, mBluetoothItems));
            mItemsList.setEmptyState(R.drawable.ic_qs_bluetooth_detail_empty,
                    R.string.quick_settings_bluetooth_detail_empty_text);
            mItems.setCallback(this);
            mItems.setMinHeightInItems(0);

            updateItems();
            setItemsVisible(mState.value);
            return mItems;
            return mItemsList;
        }

        public void setItemsVisible(boolean visible) {
            if (mItems == null) return;
            mItems.setItemsVisible(visible);
            if (mAdapter == null) return;
            if (visible) {
                updateItems();
            } else {
                mBluetoothItems.clear();
            }
            mAdapter.notifyDataSetChanged();
        }

        private void updateItems() {
            if (mItems == null) return;
            Item[] items = null;
            if (mAdapter == null) return;
                final Collection<CachedBluetoothDevice> devices = mController.getDevices();
            if (devices != null) {
                items = new Item[getBondedCount(devices)];
                int i = 0;
                mBluetoothItems.clear();
                for (CachedBluetoothDevice device : devices) {
                    if (device.getBondState() == BluetoothDevice.BOND_NONE) continue;
                    final Item item = new Item();
@@ -247,10 +262,10 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> {
                        item.line2 = mContext.getString(R.string.quick_settings_connecting);
                    }
                    item.tag = device;
                    items[i++] = item;
                    mBluetoothItems.add(item);
                }
            }
            mItems.setItems(items);
            mAdapter.notifyDataSetChanged();
        }

        private int getBondedCount(Collection<CachedBluetoothDevice> devices) {
@@ -265,12 +280,7 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> {

        @Override
        public void onDetailItemClick(Item item) {
            if (item == null || item.tag == null) return;
            final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag;
            if (device != null && device.getMaxConnectionState()
                    == BluetoothProfile.STATE_DISCONNECTED) {
                mController.connect(device);
            }
            // noop
        }

        @Override
@@ -281,5 +291,16 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> {
                mController.disconnect(device);
            }
        }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Item item = (Item) parent.getItemAtPosition(position);
            if (item == null || item.tag == null) return;
            final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag;
            if (device != null && device.getMaxConnectionState()
                    == BluetoothProfile.STATE_DISCONNECTED) {
                mController.connect(device);
            }
        }
    }
}
+46 −37
Original line number Diff line number Diff line
@@ -24,12 +24,15 @@ import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;

import com.android.internal.logging.MetricsLogger;
import com.android.settingslib.wifi.AccessPoint;

import com.android.systemui.R;
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSDetailItemsList;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTileView;
import com.android.systemui.qs.SignalTileView;
@@ -37,8 +40,10 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.AccessPointController;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.SignalCallbackAdapter;

import cyanogenmod.app.StatusBarPanelCustomTile;

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

/** Quick settings tile: Wifi **/
@@ -242,10 +247,12 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
    };

    private final class WifiDetailAdapter implements DetailAdapter,
            NetworkController.AccessPointController.AccessPointCallback, QSDetailItems.Callback {
            AccessPointController.AccessPointCallback, AdapterView.OnItemClickListener {

        private QSDetailItems mItems;
        private AccessPoint[] mAccessPoints;
        private QSDetailItemsList mItemsList;
        private List<AccessPoint> mAccessPoints;
        private List<Item> mDisplayedAccessPoints = new ArrayList<>();
        private QSDetailItemsList.QSDetailListAdapter mAdapter;

        @Override
        public int getTitle() {
@@ -285,19 +292,21 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
            mAccessPoints = null;
            mWifiController.scanForAccessPoints();
            fireScanStateChanged(true);
            mItems = QSDetailItems.convertOrInflate(context, convertView, parent);
            mItems.setTagSuffix("Wifi");
            mItems.setCallback(this);
            mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
            mItemsList = QSDetailItemsList.convertOrInflate(context, convertView, parent);
            ListView listView = mItemsList.getListView();
            listView.setDivider(null);
            listView.setOnItemClickListener(this);
            listView.setAdapter(mAdapter =
                    new QSDetailItemsList.QSDetailListAdapter(context, mDisplayedAccessPoints));
            mItemsList.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
                    R.string.quick_settings_wifi_detail_empty_text);
            updateItems();
            setItemsVisible(mState.enabled);
            return mItems;
            return mItemsList;
        }

        @Override
        public void onAccessPointsChanged(final List<AccessPoint> accessPoints) {
            mAccessPoints = accessPoints.toArray(new AccessPoint[accessPoints.size()]);
            mAccessPoints = accessPoints;
            updateItems();
            if (accessPoints != null && accessPoints.size() > 0) {
                fireScanStateChanged(false);
@@ -309,35 +318,22 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
            mHost.startActivityDismissingKeyguard(settingsIntent);
        }

        @Override
        public void onDetailItemClick(Item item) {
            if (item == null || item.tag == null) return;
            final AccessPoint ap = (AccessPoint) item.tag;
            if (!ap.isActive()) {
                if (mWifiController.connect(ap)) {
                    mHost.collapsePanels();
                }
            }
            showDetail(false);
        }

        @Override
        public void onDetailItemDisconnect(Item item) {
            // noop
        }

        public void setItemsVisible(boolean visible) {
            if (mItems == null) return;
            mItems.setItemsVisible(visible);
            if (mAdapter == null) return;
            if (visible) {
                updateItems();
            } else {
                mDisplayedAccessPoints.clear();
            }
            mAdapter.notifyDataSetChanged();
        }

        private void updateItems() {
            if (mItems == null) return;
            Item[] items = null;
            if (mAdapter == null) return;
            if (mAccessPoints != null) {
                items = new Item[mAccessPoints.length];
                for (int i = 0; i < mAccessPoints.length; i++) {
                    final AccessPoint ap = mAccessPoints[i];
                mDisplayedAccessPoints.clear();
                for (int i = 0; i < mAccessPoints.size(); i++) {
                    final AccessPoint ap = mAccessPoints.get(i);
                    final Item item = new Item();
                    item.tag = ap;
                    item.icon = mWifiController.getIcon(ap);
@@ -346,10 +342,23 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
                    item.overlay = ap.getSecurity() != AccessPoint.SECURITY_NONE
                            ? mContext.getDrawable(R.drawable.qs_ic_wifi_lock)
                            : null;
                    items[i] = item;
                    mDisplayedAccessPoints.add(item);
                }
            }
            mItems.setItems(items);
            mAdapter.notifyDataSetChanged();
        }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Item item = (Item) parent.getItemAtPosition(position);
            if (item == null || item.tag == null) return;
            final AccessPoint ap = (AccessPoint) item.tag;
            if (!ap.isActive()) {
                if (mWifiController.connect(ap)) {
                    mHost.collapsePanels();
                }
            }
            showDetail(false);
        }
    };
}
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ public interface NetworkController {

        public interface AccessPointCallback {
            void onAccessPointsChanged(List<AccessPoint> accessPoints);
            void onSettingsActivityTriggered(Intent settingsIntent);
            void onSettingsActivityTriggered(Intent intent);
        }
    }