Home Controls: Add a new Controls tile for prototyping

Must edit the QS area to add the new Controls tile and have set:

adb shell settings put system qs_controls_tile_enabled 1

Test: visual
Change-Id: I7359d394d6d0a5eb408de7049bf0b3051c83e361
This commit is contained in:
Matt Pietal
2019-10-15 09:44:12 -04:00
parent e522501adf
commit b6da00e69a
7 changed files with 237 additions and 13 deletions

View File

@@ -33,4 +33,9 @@ public interface HomeControlsPlugin extends Plugin {
* will add home controls to this space.
*/
void sendParentGroup(ViewGroup group);
/**
* When visible, will poll for updates.
*/
void setVisible(boolean visible);
}

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M9,21c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-1L9,20v1zM12,2C8.14,2 5,5.14 5,9c0,2.38 1.19,4.47 3,5.74L8,17c0,0.55 0.45,1 1,1h6c0.55,0 1,-0.45 1,-1v-2.26c1.81,-1.27 3,-3.36 3,-5.74 0,-3.86 -3.14,-7 -7,-7zM14.85,13.1l-0.85,0.6L14,16h-4v-2.3l-0.85,-0.6C7.8,12.16 7,10.63 7,9c0,-2.76 2.24,-5 5,-5s5,2.24 5,5c0,1.63 -0.8,3.16 -2.15,4.1z"/>
</vector>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/home_controls_layout"
android:layout_width="match_parent"
android:layout_height="125dp"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:visibility="gone"
android:padding="8dp"
android:layout_margin="5dp"
android:background="?android:attr/colorBackgroundFloating"
android:orientation="vertical">
</LinearLayout>

View File

@@ -51,17 +51,7 @@
systemui:viewType="com.android.systemui.plugins.qs.QS" />
<!-- Temporary area to test out home controls -->
<LinearLayout
android:id="@+id/home_controls_layout"
android:layout_width="match_parent"
android:layout_height="125dp"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:visibility="gone"
android:padding="8dp"
android:layout_margin="5dp"
android:background="?android:attr/colorBackgroundFloating"
android:orientation="vertical">
</LinearLayout>
<include layout="@layout/home_controls" />
<com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
android:id="@+id/notification_stack_scroller"
@@ -107,4 +97,4 @@
android:background="@drawable/qs_navbar_scrim" />
<include layout="@layout/status_bar_expanded_plugin_frame"/>
</merge>
</merge>

View File

@@ -117,7 +117,7 @@
<!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
<string name="quick_settings_tiles_stock" translatable="false">
wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night
wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,controls
</string>
<!-- The tiles to display in QuickSettings -->

View File

@@ -16,6 +16,7 @@ package com.android.systemui.qs.tileimpl;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import android.view.ContextThemeWrapper;
@@ -32,6 +33,7 @@ import com.android.systemui.qs.tiles.BluetoothTile;
import com.android.systemui.qs.tiles.CastTile;
import com.android.systemui.qs.tiles.CellularTile;
import com.android.systemui.qs.tiles.ColorInversionTile;
import com.android.systemui.qs.tiles.ControlsTile;
import com.android.systemui.qs.tiles.DataSaverTile;
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.qs.tiles.FlashlightTile;
@@ -58,6 +60,7 @@ public class QSFactoryImpl implements QSFactory {
private final Provider<WifiTile> mWifiTileProvider;
private final Provider<BluetoothTile> mBluetoothTileProvider;
private final Provider<ControlsTile> mControlsTileProvider;
private final Provider<CellularTile> mCellularTileProvider;
private final Provider<DndTile> mDndTileProvider;
private final Provider<ColorInversionTile> mColorInversionTileProvider;
@@ -81,6 +84,7 @@ public class QSFactoryImpl implements QSFactory {
@Inject
public QSFactoryImpl(Provider<WifiTile> wifiTileProvider,
Provider<BluetoothTile> bluetoothTileProvider,
Provider<ControlsTile> controlsTileProvider,
Provider<CellularTile> cellularTileProvider,
Provider<DndTile> dndTileProvider,
Provider<ColorInversionTile> colorInversionTileProvider,
@@ -100,6 +104,7 @@ public class QSFactoryImpl implements QSFactory {
Provider<UiModeNightTile> uiModeNightTileProvider) {
mWifiTileProvider = wifiTileProvider;
mBluetoothTileProvider = bluetoothTileProvider;
mControlsTileProvider = controlsTileProvider;
mCellularTileProvider = cellularTileProvider;
mDndTileProvider = dndTileProvider;
mColorInversionTileProvider = colorInversionTileProvider;
@@ -138,6 +143,11 @@ public class QSFactoryImpl implements QSFactory {
return mWifiTileProvider.get();
case "bt":
return mBluetoothTileProvider.get();
case "controls":
if (Settings.System.getInt(mHost.getContext().getContentResolver(),
"qs_controls_tile_enabled", 0) == 1) {
return mControlsTileProvider.get();
} else return null;
case "cell":
return mCellularTileProvider.get();
case "dnd":

View File

@@ -0,0 +1,197 @@
/*
* Copyright (C) 2014 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.systemui.qs.tiles;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.HomeControlsPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.shared.plugins.PluginManager;
import javax.inject.Inject;
/**
* Temporary control test for prototyping
*/
public class ControlsTile extends QSTileImpl<BooleanState> {
private ControlsDetailAdapter mDetailAdapter;
private final ActivityStarter mActivityStarter;
private PluginManager mPluginManager;
private HomeControlsPlugin mPlugin;
private Intent mHomeAppIntent;
@Inject
public ControlsTile(QSHost host,
ActivityStarter activityStarter,
PluginManager pluginManager) {
super(host);
mActivityStarter = activityStarter;
mPluginManager = pluginManager;
mDetailAdapter = (ControlsDetailAdapter) createDetailAdapter();
mHomeAppIntent = new Intent(Intent.ACTION_VIEW);
mHomeAppIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mHomeAppIntent.setComponent(new ComponentName("com.google.android.apps.chromecast.app",
"com.google.android.apps.chromecast.app.DiscoveryActivity"));
}
@Override
public DetailAdapter getDetailAdapter() {
return mDetailAdapter;
}
@Override
public BooleanState newTileState() {
return new BooleanState();
}
@Override
public void handleSetListening(boolean listening) {
}
@Override
public void setDetailListening(boolean listening) {
if (mPlugin == null) return;
mPlugin.setVisible(listening);
}
@Override
protected void handleClick() {
showDetail(true);
}
@Override
public Intent getLongClickIntent() {
return mHomeAppIntent;
}
@Override
protected void handleSecondaryClick() {
showDetail(true);
}
@Override
public CharSequence getTileLabel() {
return "Controls";
}
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
state.icon = ResourceIcon.get(R.drawable.ic_lightbulb_outline_gm2_24px);
state.label = "Controls";
}
@Override
public boolean supportsDetailView() {
return getDetailAdapter() != null && mQSSettingsPanelOption == QSSettingsPanel.OPEN_CLICK;
}
@Override
public int getMetricsCategory() {
return -1;
}
@Override
protected String composeChangeAnnouncement() {
if (mState.value) {
return "On";
} else {
return "Off";
}
}
@Override
public boolean isAvailable() {
return true;
}
@Override
protected DetailAdapter createDetailAdapter() {
mDetailAdapter = new ControlsDetailAdapter();
return mDetailAdapter;
}
private class ControlsDetailAdapter implements DetailAdapter {
private View mDetailView;
protected LinearLayout mHomeControlsLayout;
public CharSequence getTitle() {
return "Controls";
}
public Boolean getToggleState() {
return null;
}
public boolean getToggleEnabled() {
return false;
}
public View createDetailView(Context context, View convertView, final ViewGroup parent) {
mHomeControlsLayout = (LinearLayout) LayoutInflater.from(context).inflate(
R.layout.home_controls, parent, false);
mHomeControlsLayout.setVisibility(View.VISIBLE);
mPluginManager.addPluginListener(
new PluginListener<HomeControlsPlugin>() {
@Override
public void onPluginConnected(HomeControlsPlugin plugin,
Context pluginContext) {
mPlugin = plugin;
mPlugin.sendParentGroup(mHomeControlsLayout);
mPlugin.setVisible(true);
}
@Override
public void onPluginDisconnected(HomeControlsPlugin plugin) {
}
}, HomeControlsPlugin.class, false);
return mHomeControlsLayout;
}
public Intent getSettingsIntent() {
return mHomeAppIntent;
}
public void setToggleState(boolean state) {
}
public int getMetricsCategory() {
return -1;
}
public boolean hasHeader() {
return false;
}
}
}