package com.android.systemui.statusbar.toggles; import java.util.ArrayList; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.os.Handler; import android.provider.Settings; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; public class TogglesView extends LinearLayout { private static final String TAG = "ToggleView"; ArrayList<LinearLayout> rows = new ArrayList<LinearLayout>(); ArrayList<Toggle> toggles = new ArrayList<Toggle>(); private static final String TOGGLE_DELIMITER = "|"; public static final int STYLE_NONE = 1; public static final int STYLE_ICON = 2; public static final int STYLE_TEXT = 3; public static final int STYLE_TEXT_AND_ICON = 4; private int mToggleStyle = STYLE_TEXT; public static final int BRIGHTNESS_LOC_TOP = 1; public static final int BRIGHTNESS_LOC_BOTTOM = 2; public static final int BRIGHTNESS_LOC_NONE = 3; private int mBrightnessLocation = BRIGHTNESS_LOC_TOP; private static final String TOGGLE_AUTOROTATE = "ROTATE"; private static final String TOGGLE_BLUETOOTH = "BT"; private static final String TOGGLE_GPS = "GPS"; private static final String TOGGLE_LTE = "LTE"; private static final String TOGGLE_DATA = "DATA"; private static final String TOGGLE_WIFI = "WIFI"; private static final String TOGGLE_2G = "2G"; private static final String TOGGLE_WIFI_AP = "AP"; private static final String TOGGLE_AIRPLANE = "AIRPLANE_MODE"; private static final String TOGGLE_VIBRATE = "VIBRATE"; private static final String TOGGLE_SILENT = "SILENT"; private static final String TOGGLE_TORCH = "TORCH"; private static final String TOGGLE_SYNC = "SYNC"; private static final String TOGGLE_SWAGGER = "SWAGGER"; private static final String TOGGLE_FCHARGE = "FCHARGE"; private static final String TOGGLE_TETHER = "TETHER"; private static final String TOGGLE_NFC = "NFC"; private int mWidgetsPerRow = 2; private boolean useAltButtonLayout = false; private BaseStatusBar sb; public static final String STOCK_TOGGLES = TOGGLE_WIFI + TOGGLE_DELIMITER + TOGGLE_BLUETOOTH + TOGGLE_DELIMITER + TOGGLE_GPS + TOGGLE_DELIMITER + TOGGLE_AUTOROTATE + TOGGLE_DELIMITER + TOGGLE_SWAGGER + TOGGLE_DELIMITER + TOGGLE_VIBRATE + TOGGLE_DELIMITER + TOGGLE_SYNC + TOGGLE_DELIMITER + TOGGLE_SILENT; View mBrightnessSlider; LinearLayout mToggleSpacer; private static final LinearLayout.LayoutParams PARAMS_BRIGHTNESS = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, 90); private static final LinearLayout.LayoutParams PARAMS_TOGGLE = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f); private static final LinearLayout.LayoutParams PARAMS_TOGGLE_SCROLL = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f); public TogglesView(Context context) { this(context, null); } public TogglesView(Context context, AttributeSet attrs) { super(context, attrs); new SettingsObserver(new Handler()).observe(); } private void addToggles(String userToggles) { if (userToggles == null) userToggles = STOCK_TOGGLES; Log.e(TAG, userToggles); String[] split = userToggles.split("\\" + TOGGLE_DELIMITER); toggles.clear(); for (String splitToggle : split) { Log.e(TAG, "split: " + splitToggle); Toggle newToggle = null; if (splitToggle.equals(TOGGLE_AUTOROTATE)) newToggle = new AutoRotateToggle(mContext); else if (splitToggle.equals(TOGGLE_BLUETOOTH)) newToggle = new BluetoothToggle(mContext); else if (splitToggle.equals(TOGGLE_DATA)) newToggle = new NetworkToggle(mContext); else if (splitToggle.equals(TOGGLE_GPS)) newToggle = new GpsToggle(mContext); else if (splitToggle.equals(TOGGLE_LTE)) newToggle = new LteToggle(mContext); else if (splitToggle.equals(TOGGLE_WIFI)) newToggle = new WifiToggle(mContext); else if (splitToggle.equals(TOGGLE_2G)) newToggle = new TwoGToggle(mContext); else if (splitToggle.equals(TOGGLE_WIFI_AP)) newToggle = new WifiAPToggle(mContext); else if (splitToggle.equals(TOGGLE_AIRPLANE)) newToggle = new AirplaneModeToggle(mContext); else if (splitToggle.equals(TOGGLE_VIBRATE)) newToggle = new VibrateToggle(mContext); else if (splitToggle.equals(TOGGLE_SILENT)) newToggle = new SilentToggle(mContext); else if (splitToggle.equals(TOGGLE_TORCH)) newToggle = new TorchToggle(mContext); else if (splitToggle.equals(TOGGLE_SYNC)) newToggle = new SyncToggle(mContext); else if (splitToggle.equals(TOGGLE_SWAGGER)) newToggle = new SwaggerToggle(mContext); else if (splitToggle.equals(TOGGLE_FCHARGE)) newToggle = new FChargeToggle(mContext); else if (splitToggle.equals(TOGGLE_TETHER)) newToggle = new USBTetherToggle(mContext); else if (splitToggle.equals(TOGGLE_NFC)) newToggle = new NFCToggle(mContext); if (newToggle != null) toggles.add(newToggle); } } private void addBrightness() { rows.add(new LinearLayout(mContext)); rows.get(rows.size() - 1).addView( new BrightnessSlider(mContext).getView(), PARAMS_BRIGHTNESS); } private void addViews() { removeViews(); rows = new ArrayList<LinearLayout>(); if (!useAltButtonLayout) { DisplayMetrics metrics = getContext().getResources() .getDisplayMetrics(); float dp = 10f; int pixels = (int) (metrics.density * dp + 0.5f); this.setPadding(getPaddingLeft(), pixels, getPaddingRight(), getPaddingBottom()); } if (mBrightnessLocation == BRIGHTNESS_LOC_TOP) addBrightness(); for (int i = 0; i < toggles.size(); i++) { if (i % mWidgetsPerRow == 0) { // new row rows.add(new LinearLayout(mContext)); } rows.get(rows.size() - 1) .addView( toggles.get(i).getView(), (useAltButtonLayout ? PARAMS_TOGGLE_SCROLL : PARAMS_TOGGLE)); } if (!useAltButtonLayout && (toggles.size() % 2 != 0)) { // we are using switches, and have an uneven number - let's add a // spacer mToggleSpacer = new LinearLayout(mContext); rows.get(rows.size() - 1).addView(mToggleSpacer, PARAMS_TOGGLE); } if (useAltButtonLayout) { LinearLayout togglesRowLayout; HorizontalScrollView toggleScrollView = new HorizontalScrollView( mContext); // ToggleScrollView.setFillViewport(true); try { togglesRowLayout = rows.get(rows.size() - 1); } catch (ArrayIndexOutOfBoundsException e) { // happens when brightness bar is below buttons togglesRowLayout = new LinearLayout(mContext); rows.add(togglesRowLayout); } togglesRowLayout.setGravity(Gravity.CENTER_HORIZONTAL); toggleScrollView.setHorizontalFadingEdgeEnabled(true); toggleScrollView.addView(togglesRowLayout, PARAMS_TOGGLE); LinearLayout ll = new LinearLayout(mContext); ll.setOrientation(LinearLayout.VERTICAL); ll.setGravity(Gravity.CENTER_HORIZONTAL); ll.addView(toggleScrollView, PARAMS_TOGGLE_SCROLL); rows.remove(rows.size() - 1); rows.add(ll); } if (mBrightnessLocation == BRIGHTNESS_LOC_BOTTOM) addBrightness(); final int layout_type = Settings.System.getInt( mContext.getContentResolver(), Settings.System.STATUS_BAR_LAYOUT, 0); if (sb != null && !sb.isTablet() && layout_type != 2) addSeparator(); for (LinearLayout row : rows) this.addView(row); } private void removeViews() { for (LinearLayout row : rows) { this.removeView(row); } } private void addSeparator() { View sep = new View(mContext); sep.setBackgroundResource(R.drawable.status_bar_hr); DisplayMetrics metrics = getContext().getResources() .getDisplayMetrics(); float dp = 2f; float fpixels = metrics.density * dp; int pixels = (int) (metrics.density * dp + 0.5f); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, pixels); sep.setLayoutParams(params); rows.add(new LinearLayout(mContext)); rows.get(rows.size() - 1).addView(sep); } class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_STYLE), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_BRIGHTNESS_LOC), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_NUMBER_PER_ROW), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_USE_BUTTONS), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_ENABLED_COLOR), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_DISABLED_COLOR), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_ALPHA), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_BACKGROUND), false, this); resolver.registerContentObserver(Settings.System .getUriFor(Settings.System.STATUSBAR_TOGGLES_TEXT_COLOR), false, this); updateSettings(); } @Override public void onChange(boolean selfChange) { updateSettings(); } } protected void updateSettings() { ContentResolver resolver = mContext.getContentResolver(); addToggles(Settings.System.getString(resolver, Settings.System.STATUSBAR_TOGGLES)); mToggleStyle = Settings.System.getInt(resolver, Settings.System.STATUSBAR_TOGGLES_STYLE, STYLE_ICON); mBrightnessLocation = Settings.System.getInt(resolver, Settings.System.STATUSBAR_TOGGLES_BRIGHTNESS_LOC, BRIGHTNESS_LOC_NONE); useAltButtonLayout = Settings.System.getInt( mContext.getContentResolver(), Settings.System.STATUSBAR_TOGGLES_USE_BUTTONS, 1) == 1; // mWidgetsPerRow = Settings.System.getInt(resolver, // Settings.System.STATUSBAR_TOGGLES_NUMBER_PER_ROW, // 2); // use 2 for regular layout, 6 for buttons // TODO: make buttons scrollable so we can have more than 6 // ZB Edit - Temp make mWidgetsPerRow 100 for altWidgetLayout. A more // elegant solution // will need to be implemented in the main loop. mWidgetsPerRow = useAltButtonLayout ? 100 : 2; boolean addText = false; boolean addIcon = false; switch (mToggleStyle) { case STYLE_NONE: break; case STYLE_ICON: addIcon = true; break; case STYLE_TEXT: addText = true; break; case STYLE_TEXT_AND_ICON: addText = true; addIcon = true; break; } for (Toggle t : toggles) t.setupInfo(addIcon, addText); addViews(); } public void onStatusbarExpanded() { for (Toggle t : toggles) t.onStatusbarExpanded(); } public void setBar(BaseStatusBar statusBar) { sb = statusBar; SettingsObserver settingsObserver = new SettingsObserver(new Handler()); settingsObserver.observe(); } }