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

Commit 53af4840 authored by Roman Birg's avatar Roman Birg
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 9bcd68bb
Loading
Loading
Loading
Loading
+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;
        }
    }
}
+41 −21
Original line number Diff line number Diff line
@@ -23,13 +23,18 @@ import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;

import android.widget.AdapterView;
import android.widget.ListView;
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 com.android.systemui.statusbar.policy.BluetoothController.PairedDevice;

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

/** Quick settings tile: Bluetooth **/
@@ -164,8 +169,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() {
@@ -190,28 +198,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 Set<PairedDevice> devices = mController.getPairedDevices();
            if (devices != null) {
                items = new Item[devices.size()];
                mBluetoothItems.clear();
                int i = 0;
                for (PairedDevice device : devices) {
                    final Item item = new Item();
@@ -226,19 +240,15 @@ 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();
        }

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

        @Override
@@ -249,5 +259,15 @@ 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 PairedDevice device = (PairedDevice) item.tag;
            if (device != null && device.state == PairedDevice.STATE_DISCONNECTED) {
                mController.connect(device);
            }
        }
    }
}
+49 −40
Original line number Diff line number Diff line
@@ -24,18 +24,22 @@ import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import android.widget.AdapterView;
import android.widget.ListView;
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;
import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.AccessPointController;
import com.android.systemui.statusbar.policy.NetworkController.AccessPointController.AccessPoint;
import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;

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

/** Quick settings tile: Wifi **/
public class WifiTile extends QSTile<QSTile.SignalState> {
    private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS);
@@ -249,10 +253,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() {
@@ -281,58 +287,48 @@ 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 AccessPoint[] accessPoints) {
        public void onAccessPointsChanged(final List<AccessPoint> accessPoints) {
            mAccessPoints = accessPoints;
            updateItems();
            if (accessPoints != null && accessPoints.length > 0) {
            if (accessPoints != null && accessPoints.size() > 0) {
                fireScanStateChanged(false);
            }
        }

        public void onSettingsActivityTriggered(Intent settingsIntent) {
            mHost.startSettingsActivity(settingsIntent);
        }

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

        @Override
        public void onDetailItemDisconnect(Item item) {
            // noop
        public void onSettingsActivityTriggered(Intent intent) {
            mHost.startSettingsActivity(intent);
        }

        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 = ap.iconId;
@@ -347,10 +343,23 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
                    item.overlay = ap.hasSecurity
                            ? mContext.getDrawable(R.drawable.qs_ic_wifi_lock)
                            : null;
                    items[i] = item;
                    mDisplayedAccessPoints.add(item);
                }
            }
            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.isConnected) {
                if (mWifiController.connect(ap)) {
                    mHost.collapsePanels();
                }
            }
            mItems.setItems(items);
            showDetail(false);
        }
    };
}
+3 −3
Original line number Diff line number Diff line
@@ -141,11 +141,11 @@ public class AccessPointControllerImpl implements NetworkController.AccessPointC

    private void fireSettingsIntentCallback(Intent intent) {
        for (AccessPointCallback callback : mCallbacks) {
            //callback.onSettingsActivityTriggered(intent);
            callback.onSettingsActivityTriggered(intent);
        }
    }

    private void fireAcccessPointsCallback(AccessPoint[] aps) {
    private void fireAcccessPointsCallback(List<AccessPoint> aps) {
        for (AccessPointCallback callback : mCallbacks) {
            callback.onAccessPointsChanged(aps);
        }
@@ -214,7 +214,7 @@ public class AccessPointControllerImpl implements NetworkController.AccessPointC
            aps.add(ap);
        }
        Collections.sort(aps, mByStrength);
        fireAcccessPointsCallback(aps.toArray(new AccessPoint[aps.size()]));
        fireAcccessPointsCallback(aps);
    }

    private final ActionListener mConnectListener = new ActionListener() {
+7 −2
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.systemui.statusbar.policy;

import android.content.Intent;

import java.util.List;

public interface NetworkController {

    boolean hasMobileDataFeature();
@@ -51,7 +55,8 @@ public interface NetworkController {
        boolean canConfigWifi();

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

        public static class AccessPoint {
@@ -74,7 +79,7 @@ public interface NetworkController {
    DataUsageInfo getDataUsageInfo();

    public interface AccessPointCallback {
        void onAccessPointsChanged(AccessPoint[] accessPoints);
        void onAccessPointsChanged(List<AccessPoint> accessPoints);
    }

    public static class AccessPoint {