| /* |
| * Copyright (C) 2013 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.statusbar.phone; |
| |
| import android.graphics.Rect; |
| import android.graphics.drawable.Icon; |
| import android.os.Bundle; |
| import android.os.UserHandle; |
| import android.util.Log; |
| import android.view.Gravity; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.LinearLayout; |
| |
| import com.android.internal.statusbar.StatusBarIcon; |
| import com.android.systemui.DemoMode; |
| import com.android.systemui.R; |
| import com.android.systemui.plugins.DarkIconDispatcher; |
| import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; |
| import com.android.systemui.statusbar.StatusBarIconView; |
| import com.android.systemui.statusbar.StatusBarMobileView; |
| import com.android.systemui.statusbar.StatusBarWifiView; |
| import com.android.systemui.statusbar.StatusIconDisplayable; |
| import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState; |
| import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; |
| |
| import java.util.ArrayList; |
| |
| public class DemoStatusIcons extends StatusIconContainer implements DemoMode, DarkReceiver { |
| private static final String TAG = "DemoStatusIcons"; |
| |
| private final LinearLayout mStatusIcons; |
| private final ArrayList<StatusBarMobileView> mMobileViews = new ArrayList<>(); |
| private final int mIconSize; |
| |
| private StatusBarWifiView mWifiView; |
| private boolean mDemoMode; |
| private int mColor; |
| |
| public DemoStatusIcons(LinearLayout statusIcons, int iconSize) { |
| super(statusIcons.getContext()); |
| mStatusIcons = statusIcons; |
| mIconSize = iconSize; |
| mColor = DarkIconDispatcher.DEFAULT_ICON_TINT; |
| |
| if (statusIcons instanceof StatusIconContainer) { |
| setShouldRestrictIcons(((StatusIconContainer) statusIcons).isRestrictingIcons()); |
| } else { |
| setShouldRestrictIcons(false); |
| } |
| setLayoutParams(mStatusIcons.getLayoutParams()); |
| setPadding(mStatusIcons.getPaddingLeft(),mStatusIcons.getPaddingTop(), |
| mStatusIcons.getPaddingRight(), mStatusIcons.getPaddingBottom()); |
| setOrientation(mStatusIcons.getOrientation()); |
| setGravity(Gravity.CENTER_VERTICAL); // no LL.getGravity() |
| ViewGroup p = (ViewGroup) mStatusIcons.getParent(); |
| p.addView(this, p.indexOfChild(mStatusIcons)); |
| } |
| |
| public void remove() { |
| mMobileViews.clear(); |
| ((ViewGroup) getParent()).removeView(this); |
| } |
| |
| public void setColor(int color) { |
| mColor = color; |
| updateColors(); |
| } |
| |
| private void updateColors() { |
| for (int i = 0; i < getChildCount(); i++) { |
| StatusIconDisplayable child = (StatusIconDisplayable) getChildAt(i); |
| child.setStaticDrawableColor(mColor); |
| child.setDecorColor(mColor); |
| } |
| } |
| |
| @Override |
| public void dispatchDemoCommand(String command, Bundle args) { |
| if (!mDemoMode && command.equals(COMMAND_ENTER)) { |
| mDemoMode = true; |
| mStatusIcons.setVisibility(View.GONE); |
| setVisibility(View.VISIBLE); |
| } else if (mDemoMode && command.equals(COMMAND_EXIT)) { |
| mDemoMode = false; |
| mStatusIcons.setVisibility(View.VISIBLE); |
| setVisibility(View.GONE); |
| } else if (mDemoMode && command.equals(COMMAND_STATUS)) { |
| String volume = args.getString("volume"); |
| if (volume != null) { |
| int iconId = volume.equals("vibrate") ? R.drawable.stat_sys_ringer_vibrate |
| : 0; |
| updateSlot("volume", null, iconId); |
| } |
| String zen = args.getString("zen"); |
| if (zen != null) { |
| int iconId = zen.equals("dnd") ? R.drawable.stat_sys_dnd : 0; |
| updateSlot("zen", null, iconId); |
| } |
| String bt = args.getString("bluetooth"); |
| if (bt != null) { |
| int iconId = bt.equals("connected") |
| ? R.drawable.stat_sys_data_bluetooth_connected : 0; |
| updateSlot("bluetooth", null, iconId); |
| } |
| String location = args.getString("location"); |
| if (location != null) { |
| int iconId = location.equals("show") ? PhoneStatusBarPolicy.LOCATION_STATUS_ICON_ID |
| : 0; |
| updateSlot("location", null, iconId); |
| } |
| String alarm = args.getString("alarm"); |
| if (alarm != null) { |
| int iconId = alarm.equals("show") ? R.drawable.stat_sys_alarm |
| : 0; |
| updateSlot("alarm_clock", null, iconId); |
| } |
| String tty = args.getString("tty"); |
| if (tty != null) { |
| int iconId = tty.equals("show") ? R.drawable.stat_sys_tty_mode |
| : 0; |
| updateSlot("tty", null, iconId); |
| } |
| String mute = args.getString("mute"); |
| if (mute != null) { |
| int iconId = mute.equals("show") ? android.R.drawable.stat_notify_call_mute |
| : 0; |
| updateSlot("mute", null, iconId); |
| } |
| String speakerphone = args.getString("speakerphone"); |
| if (speakerphone != null) { |
| int iconId = speakerphone.equals("show") ? android.R.drawable.stat_sys_speakerphone |
| : 0; |
| updateSlot("speakerphone", null, iconId); |
| } |
| String cast = args.getString("cast"); |
| if (cast != null) { |
| int iconId = cast.equals("show") ? R.drawable.stat_sys_cast : 0; |
| updateSlot("cast", null, iconId); |
| } |
| String hotspot = args.getString("hotspot"); |
| if (hotspot != null) { |
| int iconId = hotspot.equals("show") ? R.drawable.stat_sys_hotspot : 0; |
| updateSlot("hotspot", null, iconId); |
| } |
| } |
| } |
| |
| /// Can only be used to update non-signal related slots |
| private void updateSlot(String slot, String iconPkg, int iconId) { |
| if (!mDemoMode) return; |
| if (iconPkg == null) { |
| iconPkg = mContext.getPackageName(); |
| } |
| int removeIndex = -1; |
| for (int i = 0; i < getChildCount(); i++) { |
| View child = getChildAt(i); |
| if (!(child instanceof StatusBarIconView)) { |
| continue; |
| } |
| StatusBarIconView v = (StatusBarIconView) child; |
| if (slot.equals(v.getTag())) { |
| if (iconId == 0) { |
| removeIndex = i; |
| break; |
| } else { |
| StatusBarIcon icon = v.getStatusBarIcon(); |
| icon.visible = true; |
| icon.icon = Icon.createWithResource(icon.icon.getResPackage(), iconId); |
| v.set(icon); |
| v.updateDrawable(); |
| return; |
| } |
| } |
| } |
| if (iconId == 0) { |
| if (removeIndex != -1) { |
| removeViewAt(removeIndex); |
| } |
| return; |
| } |
| StatusBarIcon icon = new StatusBarIcon(iconPkg, UserHandle.SYSTEM, iconId, 0, 0, "Demo"); |
| icon.visible = true; |
| StatusBarIconView v = new StatusBarIconView(getContext(), slot, null, false); |
| v.setTag(slot); |
| v.set(icon); |
| v.setStaticDrawableColor(mColor); |
| v.setDecorColor(mColor); |
| addView(v, 0, createLayoutParams()); |
| } |
| |
| public void addDemoWifiView(WifiIconState state) { |
| Log.d(TAG, "addDemoWifiView: "); |
| StatusBarWifiView view = StatusBarWifiView.fromContext(mContext, state.slot); |
| |
| int viewIndex = getChildCount(); |
| // If we have mobile views, put wifi before them |
| for (int i = 0; i < getChildCount(); i++) { |
| View child = getChildAt(i); |
| if (child instanceof StatusBarMobileView) { |
| viewIndex = i; |
| break; |
| } |
| } |
| |
| mWifiView = view; |
| mWifiView.applyWifiState(state); |
| mWifiView.setStaticDrawableColor(mColor); |
| addView(view, viewIndex, createLayoutParams()); |
| } |
| |
| public void updateWifiState(WifiIconState state) { |
| Log.d(TAG, "updateWifiState: "); |
| if (mWifiView == null) { |
| addDemoWifiView(state); |
| } else { |
| mWifiView.applyWifiState(state); |
| } |
| } |
| |
| public void addMobileView(MobileIconState state) { |
| Log.d(TAG, "addMobileView: "); |
| StatusBarMobileView view = StatusBarMobileView.fromContext(mContext, state.slot); |
| |
| view.applyMobileState(state); |
| view.setStaticDrawableColor(mColor); |
| |
| // mobile always goes at the end |
| mMobileViews.add(view); |
| addView(view, getChildCount(), createLayoutParams()); |
| } |
| |
| public void updateMobileState(MobileIconState state) { |
| Log.d(TAG, "updateMobileState: "); |
| // If the view for this subId exists already, use it |
| for (int i = 0; i < mMobileViews.size(); i++) { |
| StatusBarMobileView view = mMobileViews.get(i); |
| if (view.getState().subId == state.subId) { |
| view.applyMobileState(state); |
| return; |
| } |
| } |
| |
| // Else we have to add it |
| addMobileView(state); |
| } |
| |
| public void onRemoveIcon(StatusIconDisplayable view) { |
| if (view.getSlot().equals("wifi")) { |
| removeView(mWifiView); |
| mWifiView = null; |
| } else { |
| StatusBarMobileView mobileView = matchingMobileView(view); |
| if (mobileView != null) { |
| removeView(mobileView); |
| mMobileViews.remove(mobileView); |
| } |
| } |
| } |
| |
| private StatusBarMobileView matchingMobileView(StatusIconDisplayable otherView) { |
| if (!(otherView instanceof StatusBarMobileView)) { |
| return null; |
| } |
| |
| StatusBarMobileView v = (StatusBarMobileView) otherView; |
| for (StatusBarMobileView view : mMobileViews) { |
| if (view.getState().subId == v.getState().subId) { |
| return view; |
| } |
| } |
| |
| return null; |
| } |
| |
| private LayoutParams createLayoutParams() { |
| return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize); |
| } |
| |
| @Override |
| public void onDarkChanged(Rect area, float darkIntensity, int tint) { |
| setColor(DarkIconDispatcher.getTint(area, mStatusIcons, tint)); |
| |
| if (mWifiView != null) { |
| mWifiView.onDarkChanged(area, darkIntensity, tint); |
| } |
| for (StatusBarMobileView view : mMobileViews) { |
| view.onDarkChanged(area, darkIntensity, tint); |
| } |
| } |
| } |