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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
13
packages/SystemUI/res/layout/home_controls.xml
Normal file
13
packages/SystemUI/res/layout/home_controls.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user