diff options
7 files changed, 237 insertions, 13 deletions
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/HomeControlsPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/HomeControlsPlugin.java index cac673fdbf0b..c1d4b03b6620 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/HomeControlsPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/HomeControlsPlugin.java @@ -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); } diff --git a/packages/SystemUI/res/drawable/ic_lightbulb_outline_gm2_24px.xml b/packages/SystemUI/res/drawable/ic_lightbulb_outline_gm2_24px.xml new file mode 100644 index 000000000000..87684a32e016 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_lightbulb_outline_gm2_24px.xml @@ -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> diff --git a/packages/SystemUI/res/layout/home_controls.xml b/packages/SystemUI/res/layout/home_controls.xml new file mode 100644 index 000000000000..bb971c206e5c --- /dev/null +++ b/packages/SystemUI/res/layout/home_controls.xml @@ -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> diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 0e59a41a8e2c..4869be11a906 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -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>
\ No newline at end of file +</merge> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 105b27eb7e1b..efcc2c44ba94 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -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 --> diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java index daaee4cd5336..1c8e451e52f7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java @@ -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": diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ControlsTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ControlsTile.java new file mode 100644 index 000000000000..0a59618b59a1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ControlsTile.java @@ -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; + } + } +} |