diff --git a/packages/SystemUI/res/layout/system_bar.xml b/packages/SystemUI/res/layout/system_bar.xml deleted file mode 100644 index 28c9dc0e0b821..0000000000000 --- a/packages/SystemUI/res/layout/system_bar.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_compat_mode_panel.xml b/packages/SystemUI/res/layout/system_bar_compat_mode_panel.xml deleted file mode 100644 index 9ad9e05b97e85..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_compat_mode_panel.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_input_methods_item.xml b/packages/SystemUI/res/layout/system_bar_input_methods_item.xml deleted file mode 100644 index 1a95ec1172f7d..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_input_methods_item.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_input_methods_panel.xml b/packages/SystemUI/res/layout/system_bar_input_methods_panel.xml deleted file mode 100644 index 547f937dfb6b0..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_input_methods_panel.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_no_recent_apps.xml b/packages/SystemUI/res/layout/system_bar_no_recent_apps.xml deleted file mode 100644 index c023ef78a52a8..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_no_recent_apps.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_notification_area.xml b/packages/SystemUI/res/layout/system_bar_notification_area.xml deleted file mode 100644 index 2fd91ef7396ff..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_notification_area.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_notification_panel.xml b/packages/SystemUI/res/layout/system_bar_notification_panel.xml deleted file mode 100644 index 58a6de36fc589..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_notification_panel.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_notification_panel_title.xml b/packages/SystemUI/res/layout/system_bar_notification_panel_title.xml deleted file mode 100644 index d08fbcedeed52..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_notification_panel_title.xml +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_notification_peek.xml b/packages/SystemUI/res/layout/system_bar_notification_peek.xml deleted file mode 100644 index 3cff47b91ad9a..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_notification_peek.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_pocket_panel.xml b/packages/SystemUI/res/layout/system_bar_pocket_panel.xml deleted file mode 100644 index e4a6da4733742..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_pocket_panel.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_recent_item.xml b/packages/SystemUI/res/layout/system_bar_recent_item.xml deleted file mode 100644 index 34f60b217c2fe..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_recent_item.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_recent_panel.xml b/packages/SystemUI/res/layout/system_bar_recent_panel.xml deleted file mode 100644 index 3d15d9b96d578..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_recent_panel.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_recent_panel_footer.xml b/packages/SystemUI/res/layout/system_bar_recent_panel_footer.xml deleted file mode 100644 index 4d14d1fb9fe29..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_recent_panel_footer.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_settings_view.xml b/packages/SystemUI/res/layout/system_bar_settings_view.xml deleted file mode 100644 index 4987dd98fd332..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_settings_view.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_ticker_compat.xml b/packages/SystemUI/res/layout/system_bar_ticker_compat.xml deleted file mode 100644 index 14cdc40048954..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_ticker_compat.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/layout/system_bar_ticker_panel.xml b/packages/SystemUI/res/layout/system_bar_ticker_panel.xml deleted file mode 100644 index 49d0405dec2b9..0000000000000 --- a/packages/SystemUI/res/layout/system_bar_ticker_panel.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - diff --git a/packages/SystemUI/res/values-sw720dp/dimens.xml b/packages/SystemUI/res/values-sw720dp/dimens.xml index e42855c155789..b1fc00ac4a299 100644 --- a/packages/SystemUI/res/values-sw720dp/dimens.xml +++ b/packages/SystemUI/res/values-sw720dp/dimens.xml @@ -16,22 +16,10 @@ */ --> - - 24dip - - - 100% - - - 80dip - - - 80dip + be situations where they don't sync up perfectly with PhoneStatusBar. --> diff --git a/packages/SystemUI/res/values-sw720dp/styles.xml b/packages/SystemUI/res/values-sw720dp/styles.xml deleted file mode 100644 index 5009395199065..0000000000000 --- a/packages/SystemUI/res/values-sw720dp/styles.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index acb192d8319b9..ca6e06df232ad 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -29,10 +29,5 @@ #ffaaaaaa #ff33B5E5 #FF000000 - - - #ff000000 - - #aa000000 #B0000000 diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 4c81c886cb7d6..6661a63e9c6a0 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -37,10 +37,6 @@ interface. This name is in the ComponentName flattened format (package/class) --> com.android.systemui.statusbar.phone.PhoneStatusBar - - com.android.systemui.statusbar.tablet.TabletStatusBar - false diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java index 7eec8f2c14891..c32f741b2ffac 100644 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java @@ -43,24 +43,21 @@ import android.widget.FrameLayout; import com.android.internal.widget.multiwaveview.GlowPadView; import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; -import com.android.systemui.recent.StatusBarTouchProxy; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.StatusBarPanel; import com.android.systemui.statusbar.phone.PhoneStatusBar; -import com.android.systemui.statusbar.tablet.StatusBarPanel; -import com.android.systemui.statusbar.tablet.TabletStatusBar; public class SearchPanelView extends FrameLayout implements StatusBarPanel, ActivityOptions.OnAnimationStartedListener { private static final int SEARCH_PANEL_HOLD_DURATION = 0; static final String TAG = "SearchPanelView"; - static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false; + static final boolean DEBUG = PhoneStatusBar.DEBUG || false; public static final boolean DEBUG_GESTURES = true; private static final String ASSIST_ICON_METADATA_NAME = "com.android.systemui.action_assist_icon"; private final Context mContext; private BaseStatusBar mBar; - private StatusBarTouchProxy mStatusBarTouchProxy; private boolean mShowing; private View mSearchTargetsContainer; @@ -169,7 +166,6 @@ public class SearchPanelView extends FrameLayout implements super.onFinishInflate(); mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mSearchTargetsContainer = findViewById(R.id.search_panel_container); - mStatusBarTouchProxy = (StatusBarTouchProxy) findViewById(R.id.status_bar_touch_proxy); // TODO: fetch views mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); mGlowPadView.setOnTriggerListener(mGlowPadViewListener); @@ -197,14 +193,7 @@ public class SearchPanelView extends FrameLayout implements } public boolean isInContentArea(int x, int y) { - if (pointInside(x, y, mSearchTargetsContainer)) { - return true; - } else if (mStatusBarTouchProxy != null && - pointInside(x, y, mStatusBarTouchProxy)) { - return true; - } else { - return false; - } + return pointInside(x, y, mSearchTargetsContainer); } private final OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { @@ -294,17 +283,6 @@ public class SearchPanelView extends FrameLayout implements mBar = bar; } - public void setStatusBarView(final View statusBarView) { - if (mStatusBarTouchProxy != null) { - mStatusBarTouchProxy.setStatusBar(statusBarView); -// mGlowPadView.setOnTouchListener(new OnTouchListener() { -// public boolean onTouch(View v, MotionEvent event) { -// return statusBarView.onTouchEvent(event); -// } -// }); - } - } - @Override public boolean onTouchEvent(MotionEvent event) { if (DEBUG_GESTURES) { diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java index 447161d4a07f1..043b64c778624 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIService.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java @@ -20,10 +20,10 @@ import android.app.Service; import android.content.Intent; import android.content.res.Configuration; import android.os.IBinder; -import android.os.RemoteException; import android.util.Log; -import android.view.IWindowManager; -import android.view.WindowManagerGlobal; + +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -35,7 +35,7 @@ public class SystemUIService extends Service { * The class names of the stuff to start. */ final Object[] SERVICES = new Object[] { - 0, // system bar or status bar, filled in below. + R.string.config_statusBarComponent, com.android.systemui.power.PowerUI.class, com.android.systemui.media.RingtonePlayer.class, com.android.systemui.settings.SettingsUI.class, @@ -63,16 +63,6 @@ public class SystemUIService extends Service { @Override public void onCreate() { - // Pick status bar or system bar. - IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); - try { - SERVICES[0] = wm.hasSystemNavBar() - ? R.string.config_systemBarComponent - : R.string.config_statusBarComponent; - } catch (RemoteException e) { - Log.w(TAG, "Failing checking whether status bar can hide", e); - } - final int N = SERVICES.length; mServices = new SystemUI[N]; for (int i=0; i= 0 && x < getWidth() && y >= 0 && y < getHeight()) { - return super.dispatchHoverEvent(event); - } - return true; - } - - public void setTrigger(View v) { - mTrigger = v; - } - - public void openPanel() { - setVisibility(View.VISIBLE); - if (mTrigger != null) mTrigger.setSelected(true); - refresh(); - } - - public void closePanel() { - setVisibility(View.GONE); - if (mTrigger != null) mTrigger.setSelected(false); - } - - private void refresh() { - int mode = mAM.getFrontActivityScreenCompatMode(); - if (mode == ActivityManager.COMPAT_MODE_ALWAYS - || mode == ActivityManager.COMPAT_MODE_NEVER) { - // No longer have something to switch. - closePanel(); - return; - } - final boolean on = (mode == ActivityManager.COMPAT_MODE_ENABLED); - mOnButton.setChecked(on); - mOffButton.setChecked(!on); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java deleted file mode 100644 index aead2427caf7c..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.content.Context; -import android.os.IBinder; -import android.provider.Settings; -import android.util.AttributeSet; -import android.view.View; -import android.view.inputmethod.InputMethodInfo; -import android.view.inputmethod.InputMethodManager; -import android.view.inputmethod.InputMethodSubtype; -import android.widget.ImageView; - -import com.android.systemui.R; - -import java.util.List; - -public class InputMethodButton extends ImageView { - - private static final String TAG = "StatusBar/InputMethodButton"; - private static final boolean DEBUG = false; - - // These values are defined in Settings application. - private static final int ID_IME_BUTTON_VISIBILITY_AUTO = 0; - private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW = 1; - private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE = 2; - - // other services we wish to talk to - private final InputMethodManager mImm; - private final int mId; - private ImageView mIcon; - private IBinder mToken; - private boolean mShowButton = false; - private boolean mScreenLocked = false; - private boolean mHardKeyboardAvailable; - - // Please refer to InputMethodManagerService.TAG_TRY_SUPPRESSING_IME_SWITCHER - private static final String TAG_TRY_SUPPRESSING_IME_SWITCHER = "TrySuppressingImeSwitcher"; - - public InputMethodButton(Context context, AttributeSet attrs) { - super(context, attrs); - - // Resource Id of the input method button. This id is defined in status_bar.xml - mId = getId(); - // IME hookup - mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - } - - @Override - protected void onAttachedToWindow() { - mIcon = (ImageView) findViewById(mId); - - refreshStatusIcon(); - } - - // Refer to InputMethodManagerService.needsToShowImeSwitchOngoingNotification() - private boolean needsToShowIMEButtonWhenVisibilityAuto() { - List imis = mImm.getEnabledInputMethodList(); - final int N = imis.size(); - if (N > 2) return true; - if (N < 1) return false; - int nonAuxCount = 0; - int auxCount = 0; - InputMethodSubtype nonAuxSubtype = null; - InputMethodSubtype auxSubtype = null; - for(int i = 0; i < N; ++i) { - final InputMethodInfo imi = imis.get(i); - final List subtypes = mImm.getEnabledInputMethodSubtypeList( - imi, true); - final int subtypeCount = subtypes.size(); - if (subtypeCount == 0) { - ++nonAuxCount; - } else { - for (int j = 0; j < subtypeCount; ++j) { - final InputMethodSubtype subtype = subtypes.get(j); - if (!subtype.isAuxiliary()) { - ++nonAuxCount; - nonAuxSubtype = subtype; - } else { - ++auxCount; - auxSubtype = subtype; - } - } - } - } - if (nonAuxCount > 1 || auxCount > 1) { - return true; - } else if (nonAuxCount == 1 && auxCount == 1) { - if (nonAuxSubtype != null && auxSubtype != null - && (nonAuxSubtype.getLocale().equals(auxSubtype.getLocale()) - || auxSubtype.overridesImplicitlyEnabledSubtype() - || nonAuxSubtype.overridesImplicitlyEnabledSubtype()) - && nonAuxSubtype.containsExtraValueKey(TAG_TRY_SUPPRESSING_IME_SWITCHER)) { - return false; - } - return true; - } - return false; - } - - private boolean needsToShowIMEButton() { - if (!mShowButton || mScreenLocked) return false; - - if (mHardKeyboardAvailable) { - return true; - } - - final int visibility = loadInputMethodSelectorVisibility(); - switch (visibility) { - case ID_IME_BUTTON_VISIBILITY_AUTO: - return needsToShowIMEButtonWhenVisibilityAuto(); - case ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW: - return true; - case ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE: - return false; - } - return false; - } - - private void refreshStatusIcon() { - if (mIcon == null) { - return; - } - if (!needsToShowIMEButton()) { - setVisibility(View.GONE); - return; - } else { - setVisibility(View.VISIBLE); - } - mIcon.setImageResource(R.drawable.ic_sysbar_ime); - } - - private int loadInputMethodSelectorVisibility() { - return Settings.Secure.getInt(getContext().getContentResolver(), - Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, ID_IME_BUTTON_VISIBILITY_AUTO); - } - - public void setIconImage(int resId) { - if (mIcon != null) { - mIcon.setImageResource(resId); - } - } - - public void setImeWindowStatus(IBinder token, boolean showButton) { - mToken = token; - mShowButton = showButton; - refreshStatusIcon(); - } - - public void setHardKeyboardStatus(boolean available) { - if (mHardKeyboardAvailable != available) { - mHardKeyboardAvailable = available; - refreshStatusIcon(); - } - } - - public void setScreenLocked(boolean locked) { - mScreenLocked = locked; - refreshStatusIcon(); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java deleted file mode 100644 index 6699379b8dbd6..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java +++ /dev/null @@ -1,487 +0,0 @@ -/* - * Copyright (C) 2011 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.tablet; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; -import android.os.IBinder; -import android.provider.Settings; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.Log; -import android.util.Pair; -import android.view.MotionEvent; -import android.view.View; -import android.view.inputmethod.InputMethodInfo; -import android.view.inputmethod.InputMethodManager; -import android.view.inputmethod.InputMethodSubtype; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RadioButton; -import android.widget.Switch; -import android.widget.TextView; - -import com.android.systemui.R; - -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; - -public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, - View.OnClickListener { - private static final boolean DEBUG = TabletStatusBar.DEBUG; - private static final String TAG = "InputMethodsPanel"; - - private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - onPackageChanged(); - } - }; - - private final InputMethodManager mImm; - private final IntentFilter mIntentFilter = new IntentFilter(); - private final HashMap> mRadioViewAndImiMap = - new HashMap>(); - private final TreeMap> - mEnabledInputMethodAndSubtypesCache = - new TreeMap>( - new InputMethodComparator()); - - private boolean mAttached = false; - private boolean mPackageChanged = false; - private Context mContext; - private IBinder mToken; - private InputMethodButton mInputMethodSwitchButton; - private LinearLayout mInputMethodMenuList; - private boolean mHardKeyboardAvailable; - private boolean mHardKeyboardEnabled; - private OnHardKeyboardEnabledChangeListener mHardKeyboardEnabledChangeListener; - private LinearLayout mHardKeyboardSection; - private Switch mHardKeyboardSwitch; - private PackageManager mPackageManager; - private String mEnabledInputMethodAndSubtypesCacheStr; - private String mLastSystemLocaleString; - private View mConfigureImeShortcut; - - private class InputMethodComparator implements Comparator { - @Override - public int compare(InputMethodInfo imi1, InputMethodInfo imi2) { - if (imi2 == null) return 0; - if (imi1 == null) return 1; - if (mPackageManager == null) { - return imi1.getId().compareTo(imi2.getId()); - } - CharSequence imiId1 = imi1.loadLabel(mPackageManager) + "/" + imi1.getId(); - CharSequence imiId2 = imi2.loadLabel(mPackageManager) + "/" + imi2.getId(); - return imiId1.toString().compareTo(imiId2.toString()); - } - } - - public InputMethodsPanel(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public InputMethodsPanel(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mContext = context; - mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - mIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED); - mIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); - mIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); - mIntentFilter.addDataScheme("package"); - } - - public void setHardKeyboardEnabledChangeListener( - OnHardKeyboardEnabledChangeListener listener) { - mHardKeyboardEnabledChangeListener = listener; - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - if (mAttached) { - getContext().unregisterReceiver(mBroadcastReceiver); - mAttached = false; - } - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - if (!mAttached) { - getContext().registerReceiver(mBroadcastReceiver, mIntentFilter); - mAttached = true; - } - } - - @Override - public void onFinishInflate() { - mInputMethodMenuList = (LinearLayout) findViewById(R.id.input_method_menu_list); - mHardKeyboardSection = (LinearLayout) findViewById(R.id.hard_keyboard_section); - mHardKeyboardSwitch = (Switch) findViewById(R.id.hard_keyboard_switch); - mConfigureImeShortcut = findViewById(R.id.ime_settings_shortcut); - mConfigureImeShortcut.setOnClickListener(this); - // TODO: If configurations for IME are not changed, do not update - // by checking onConfigurationChanged. - updateUiElements(); - } - - @Override - public boolean isInContentArea(int x, int y) { - return false; - } - - @Override - public void onClick(View view) { - if (view == mConfigureImeShortcut) { - showConfigureInputMethods(); - closePanel(true); - } - } - - @Override - public boolean dispatchHoverEvent(MotionEvent event) { - // Ignore hover events outside of this panel bounds since such events - // generate spurious accessibility events with the panel content when - // tapping outside of it, thus confusing the user. - final int x = (int) event.getX(); - final int y = (int) event.getY(); - if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) { - return super.dispatchHoverEvent(event); - } - return true; - } - - private void updateHardKeyboardEnabled() { - if (mHardKeyboardAvailable) { - final boolean checked = mHardKeyboardSwitch.isChecked(); - if (mHardKeyboardEnabled != checked) { - mHardKeyboardEnabled = checked; - if (mHardKeyboardEnabledChangeListener != null) - mHardKeyboardEnabledChangeListener.onHardKeyboardEnabledChange(checked); - } - } - } - - public void openPanel() { - setVisibility(View.VISIBLE); - updateUiElements(); - if (mInputMethodSwitchButton != null) { - mInputMethodSwitchButton.setIconImage(R.drawable.ic_sysbar_ime_pressed); - } - } - - public void closePanel(boolean closeKeyboard) { - setVisibility(View.GONE); - if (mInputMethodSwitchButton != null) { - mInputMethodSwitchButton.setIconImage(R.drawable.ic_sysbar_ime); - } - if (closeKeyboard) { - mImm.hideSoftInputFromWindow(getWindowToken(), 0); - } - } - - private void startActivity(Intent intent) { - mContext.startActivity(intent); - } - - private void showConfigureInputMethods() { - Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED - | Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - } - - private View createInputMethodItem( - final InputMethodInfo imi, final InputMethodSubtype subtype) { - final CharSequence subtypeName; - if (subtype == null || subtype.overridesImplicitlyEnabledSubtype()) { - subtypeName = null; - } else { - subtypeName = getSubtypeName(imi, subtype); - } - final CharSequence imiName = getIMIName(imi); - final Drawable icon = getSubtypeIcon(imi, subtype); - final View view = View.inflate(mContext, R.layout.system_bar_input_methods_item, null); - final ImageView subtypeIcon = (ImageView)view.findViewById(R.id.item_icon); - final TextView itemTitle = (TextView)view.findViewById(R.id.item_title); - final TextView itemSubtitle = (TextView)view.findViewById(R.id.item_subtitle); - final ImageView settingsIcon = (ImageView)view.findViewById(R.id.item_settings_icon); - final View subtypeView = view.findViewById(R.id.item_subtype); - if (subtypeName == null) { - itemTitle.setText(imiName); - itemSubtitle.setVisibility(View.GONE); - } else { - itemTitle.setText(subtypeName); - itemSubtitle.setVisibility(View.VISIBLE); - itemSubtitle.setText(imiName); - } - subtypeIcon.setImageDrawable(icon); - subtypeIcon.setContentDescription(itemTitle.getText()); - final String settingsActivity = imi.getSettingsActivity(); - if (!TextUtils.isEmpty(settingsActivity)) { - settingsIcon.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View arg0) { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClassName(imi.getPackageName(), settingsActivity); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED - | Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - closePanel(true); - } - }); - } else { - // Do not show the settings icon if the IME does not have a settings preference - view.findViewById(R.id.item_vertical_separator).setVisibility(View.GONE); - settingsIcon.setVisibility(View.GONE); - } - mRadioViewAndImiMap.put( - subtypeView, new Pair (imi, subtype)); - subtypeView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Pair imiAndSubtype = - updateRadioButtonsByView(v); - closePanel(false); - setInputMethodAndSubtype(imiAndSubtype.first, imiAndSubtype.second); - } - }); - return view; - } - - private void updateUiElements() { - updateHardKeyboardSection(); - - // TODO: Reuse subtype views. - mInputMethodMenuList.removeAllViews(); - mRadioViewAndImiMap.clear(); - mPackageManager = mContext.getPackageManager(); - - Map> enabledIMIs = - getEnabledInputMethodAndSubtypeList(); - Set cachedImiSet = enabledIMIs.keySet(); - for (InputMethodInfo imi: cachedImiSet) { - List subtypes = enabledIMIs.get(imi); - if (subtypes == null || subtypes.size() == 0) { - mInputMethodMenuList.addView( - createInputMethodItem(imi, null)); - continue; - } - for (InputMethodSubtype subtype: subtypes) { - mInputMethodMenuList.addView(createInputMethodItem(imi, subtype)); - } - } - updateRadioButtons(); - } - - public void setImeToken(IBinder token) { - mToken = token; - } - - public void setImeSwitchButton(InputMethodButton imb) { - mInputMethodSwitchButton = imb; - } - - private void setInputMethodAndSubtype(InputMethodInfo imi, InputMethodSubtype subtype) { - if (mToken != null) { - mImm.setInputMethodAndSubtype(mToken, imi.getId(), subtype); - } else { - Log.w(TAG, "IME Token is not set yet."); - } - } - - public void setHardKeyboardStatus(boolean available, boolean enabled) { - if (mHardKeyboardAvailable != available || mHardKeyboardEnabled != enabled) { - mHardKeyboardAvailable = available; - mHardKeyboardEnabled = enabled; - updateHardKeyboardSection(); - } - } - - private void updateHardKeyboardSection() { - if (mHardKeyboardAvailable) { - mHardKeyboardSection.setVisibility(View.VISIBLE); - if (mHardKeyboardSwitch.isChecked() != mHardKeyboardEnabled) { - mHardKeyboardSwitch.setChecked(mHardKeyboardEnabled); - updateHardKeyboardEnabled(); - } - } else { - mHardKeyboardSection.setVisibility(View.GONE); - } - } - - // Turn on the selected radio button when the user chooses the item - private Pair updateRadioButtonsByView(View selectedView) { - Pair selectedImiAndSubtype = null; - if (mRadioViewAndImiMap.containsKey(selectedView)) { - for (View radioView: mRadioViewAndImiMap.keySet()) { - RadioButton subtypeRadioButton = - (RadioButton) radioView.findViewById(R.id.item_radio); - if (subtypeRadioButton == null) { - Log.w(TAG, "RadioButton was not found in the selected subtype view"); - return null; - } - if (radioView == selectedView) { - Pair imiAndSubtype = - mRadioViewAndImiMap.get(radioView); - selectedImiAndSubtype = imiAndSubtype; - subtypeRadioButton.setChecked(true); - } else { - subtypeRadioButton.setChecked(false); - } - } - } - return selectedImiAndSubtype; - } - - private void updateRadioButtons() { - updateRadioButtonsByImiAndSubtype( - getCurrentInputMethodInfo(), mImm.getCurrentInputMethodSubtype()); - } - - // Turn on the selected radio button at startup - private void updateRadioButtonsByImiAndSubtype( - InputMethodInfo imi, InputMethodSubtype subtype) { - if (imi == null) return; - if (DEBUG) { - Log.d(TAG, "Update radio buttons by " + imi.getId() + ", " + subtype); - } - for (View radioView: mRadioViewAndImiMap.keySet()) { - RadioButton subtypeRadioButton = - (RadioButton) radioView.findViewById(R.id.item_radio); - if (subtypeRadioButton == null) { - Log.w(TAG, "RadioButton was not found in the selected subtype view"); - return; - } - Pair imiAndSubtype = - mRadioViewAndImiMap.get(radioView); - if (imiAndSubtype.first.getId().equals(imi.getId()) - && (imiAndSubtype.second == null || imiAndSubtype.second.equals(subtype))) { - subtypeRadioButton.setChecked(true); - } else { - subtypeRadioButton.setChecked(false); - } - } - } - - private TreeMap> - getEnabledInputMethodAndSubtypeList() { - String newEnabledIMIs = Settings.Secure.getString( - mContext.getContentResolver(), Settings.Secure.ENABLED_INPUT_METHODS); - String currentSystemLocaleString = - mContext.getResources().getConfiguration().locale.toString(); - if (!TextUtils.equals(mEnabledInputMethodAndSubtypesCacheStr, newEnabledIMIs) - || !TextUtils.equals(mLastSystemLocaleString, currentSystemLocaleString) - || mPackageChanged) { - mEnabledInputMethodAndSubtypesCache.clear(); - final List imis = mImm.getEnabledInputMethodList(); - for (InputMethodInfo imi: imis) { - mEnabledInputMethodAndSubtypesCache.put(imi, - mImm.getEnabledInputMethodSubtypeList(imi, true)); - } - mEnabledInputMethodAndSubtypesCacheStr = newEnabledIMIs; - mPackageChanged = false; - mLastSystemLocaleString = currentSystemLocaleString; - } - return mEnabledInputMethodAndSubtypesCache; - } - - private InputMethodInfo getCurrentInputMethodInfo() { - String curInputMethodId = Settings.Secure.getString(getContext() - .getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); - Set cachedImiSet = mEnabledInputMethodAndSubtypesCache.keySet(); - // 1. Search IMI in cache - for (InputMethodInfo imi: cachedImiSet) { - if (imi.getId().equals(curInputMethodId)) { - return imi; - } - } - // 2. Get current enabled IMEs and search IMI - cachedImiSet = getEnabledInputMethodAndSubtypeList().keySet(); - for (InputMethodInfo imi: cachedImiSet) { - if (imi.getId().equals(curInputMethodId)) { - return imi; - } - } - return null; - } - - private CharSequence getIMIName(InputMethodInfo imi) { - if (imi == null) return null; - return imi.loadLabel(mPackageManager); - } - - private CharSequence getSubtypeName(InputMethodInfo imi, InputMethodSubtype subtype) { - if (imi == null || subtype == null) return null; - if (DEBUG) { - Log.d(TAG, "Get text from: " + imi.getPackageName() + subtype.getNameResId() - + imi.getServiceInfo().applicationInfo); - } - return subtype.getDisplayName( - mContext, imi.getPackageName(), imi.getServiceInfo().applicationInfo); - } - - private Drawable getSubtypeIcon(InputMethodInfo imi, InputMethodSubtype subtype) { - if (imi != null) { - if (DEBUG) { - Log.d(TAG, "Update icons of IME: " + imi.getPackageName()); - if (subtype != null) { - Log.d(TAG, "subtype =" + subtype.getLocale() + "," + subtype.getMode()); - } - } - if (subtype != null) { - return mPackageManager.getDrawable(imi.getPackageName(), subtype.getIconResId(), - imi.getServiceInfo().applicationInfo); - } else if (imi.getSubtypeCount() > 0) { - return mPackageManager.getDrawable(imi.getPackageName(), - imi.getSubtypeAt(0).getIconResId(), - imi.getServiceInfo().applicationInfo); - } else { - try { - return mPackageManager.getApplicationInfo( - imi.getPackageName(), 0).loadIcon(mPackageManager); - } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, "IME can't be found: " + imi.getPackageName()); - } - } - } - return null; - } - - private void onPackageChanged() { - if (DEBUG) { - Log.d(TAG, "onPackageChanged."); - } - mPackageChanged = true; - } - - public interface OnHardKeyboardEnabledChangeListener { - public void onHardKeyboardEnabledChange(boolean enabled); - } - -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationArea.java deleted file mode 100644 index 42bdf3d925e38..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationArea.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2011 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.tablet; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.view.accessibility.AccessibilityEvent; -import android.widget.LinearLayout; - -public class NotificationArea extends LinearLayout { - - public NotificationArea(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { - if (super.onRequestSendAccessibilityEvent(child, event)) { - // The event is coming from a descendant like battery but append - // the content of the entire notification area so accessibility - // services can choose how to present the content to the user. - AccessibilityEvent record = AccessibilityEvent.obtain(); - onInitializeAccessibilityEvent(record); - dispatchPopulateAccessibilityEvent(record); - event.appendRecord(record); - return true; - } - return false; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java deleted file mode 100644 index 6e93cee2b15ad..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; - -import com.android.systemui.R; - - -public class NotificationIconArea extends RelativeLayout { - private static final String TAG = "NotificationIconArea"; - - IconLayout mIconLayout; - - public NotificationIconArea(Context context, AttributeSet attrs) { - super(context, attrs); - - mIconLayout = (IconLayout)findViewById(R.id.icons); - } - - static class IconLayout extends LinearLayout { - public IconLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public boolean onInterceptTouchEvent(MotionEvent e) { - return true; - } - } -} - - - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationLinearLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationLinearLayout.java deleted file mode 100644 index 6d15e87e71945..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationLinearLayout.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.View; -import android.widget.LinearLayout; - -import com.android.systemui.R; - -public class NotificationLinearLayout extends LinearLayout { - private static final String TAG = "NotificationLinearLayout"; - - Drawable mItemGlow; - int mInsetLeft; - Rect mTmp = new Rect(); - - public NotificationLinearLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public NotificationLinearLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - final Resources res = context.getResources(); - - mItemGlow = res.getDrawable(R.drawable.notify_item_glow_bottom); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NotificationLinearLayout, - defStyle, 0); - mInsetLeft = a.getDimensionPixelSize(R.styleable.NotificationLinearLayout_insetLeft, 0); - a.recycle(); - } - - @Override - public void onFinishInflate() { - super.onFinishInflate(); - setWillNotDraw(false); - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - - final Rect padding = mTmp; - final Drawable glow = mItemGlow; - glow.getPadding(padding); - final int glowHeight = glow.getIntrinsicHeight(); - final int insetLeft = mInsetLeft; - - final int N = getChildCount(); - for (int i=0; i= 0 && x < getWidth() && y >= 0 && y < getHeight()) { - return super.dispatchHoverEvent(event); - } - return true; - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - final int keyCode = event.getKeyCode(); - switch (keyCode) { - // We exclusively handle the back key by hiding this panel. - case KeyEvent.KEYCODE_BACK: { - if (event.getAction() == KeyEvent.ACTION_UP) { - mBar.animateCollapsePanels(); - } - return true; - } - // We react to the home key but let the system handle it. - case KeyEvent.KEYCODE_HOME: { - if (event.getAction() == KeyEvent.ACTION_UP) { - mBar.animateCollapsePanels(); - } - } break; - } - return super.dispatchKeyEvent(event); - } - - /* - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - super.onLayout(changed, l, t, r, b); - - if (DEBUG) Log.d(TAG, String.format("PANEL: onLayout: (%d, %d, %d, %d)", l, t, r, b)); - } - - @Override - public void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - if (DEBUG) { - Log.d(TAG, String.format("PANEL: onSizeChanged: (%d -> %d, %d -> %d)", - oldw, w, oldh, h)); - } - } - */ - - public void onClick(View v) { - if (mSettingsButton.isEnabled() && v == mTitleArea) { - swapPanels(); - } - } - - public void setNotificationCount(int n) { - mNotificationCount = n; - } - - public void setContentFrameVisible(final boolean showing, boolean animate) { - } - - public void swapPanels() { - final View toShow, toHide; - if (mSettingsView == null) { - addSettingsView(); - toShow = mSettingsView; - toHide = mNotificationScroller; - } else { - toShow = mNotificationScroller; - toHide = mSettingsView; - } - Animator a = ObjectAnimator.ofFloat(toHide, "alpha", 1f, 0f) - .setDuration(PANEL_FADE_DURATION); - a.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator _a) { - toHide.setVisibility(View.GONE); - if (toShow != null) { - toShow.setVisibility(View.VISIBLE); - if (toShow == mSettingsView || mNotificationCount > 0) { - ObjectAnimator.ofFloat(toShow, "alpha", 0f, 1f) - .setDuration(PANEL_FADE_DURATION) - .start(); - } - - if (toHide == mSettingsView) { - removeSettingsView(); - } - } - updateClearButton(); - updatePanelModeButtons(); - } - }); - a.start(); - } - - public void updateClearButton() { - if (mBar != null) { - final boolean showX - = (isShowing() - && mHasClearableNotifications - && mNotificationScroller.getVisibility() == View.VISIBLE); - getClearButton().setVisibility(showX ? View.VISIBLE : View.INVISIBLE); - } - } - - public void setClearable(boolean clearable) { - mHasClearableNotifications = clearable; - } - - public void updatePanelModeButtons() { - final boolean settingsVisible = (mSettingsView != null); - mSettingsButton.setVisibility(!settingsVisible && mSettingsButton.isEnabled() ? View.VISIBLE : View.GONE); - mNotificationButton.setVisibility(settingsVisible ? View.VISIBLE : View.GONE); - } - - public boolean isInContentArea(int x, int y) { - mContentArea.left = mContentFrame.getLeft() + mContentFrame.getPaddingLeft(); - mContentArea.top = mContentFrame.getTop() + mContentFrame.getPaddingTop() - + (int)mContentParent.getTranslationY(); // account for any adjustment - mContentArea.right = mContentFrame.getRight() - mContentFrame.getPaddingRight(); - mContentArea.bottom = mContentFrame.getBottom() - mContentFrame.getPaddingBottom(); - - offsetDescendantRectToMyCoords(mContentParent, mContentArea); - return mContentArea.contains(x, y); - } - - void removeSettingsView() { - if (mSettingsView != null) { - mContentFrame.removeView(mSettingsView); - mSettingsView = null; - } - } - - // NB: it will be invisible until you show it - void addSettingsView() { - LayoutInflater infl = LayoutInflater.from(getContext()); - mSettingsView = infl.inflate(R.layout.system_bar_settings_view, mContentFrame, false); - mSettingsView.setVisibility(View.GONE); - mContentFrame.addView(mSettingsView); - } - - private class Choreographer implements Animator.AnimatorListener { - boolean mVisible; - int mPanelHeight; - AnimatorSet mContentAnim; - - // should group this into a multi-property animation - final static int OPEN_DURATION = 250; - final static int CLOSE_DURATION = 250; - - // the panel will start to appear this many px from the end - final int HYPERSPACE_OFFRAMP = 200; - - Choreographer() { - } - - void createAnimation(boolean appearing) { - // mVisible: previous state; appearing: new state - - float start, end; - - // 0: on-screen - // height: off-screen - float y = mContentParent.getTranslationY(); - if (appearing) { - // we want to go from near-the-top to the top, unless we're half-open in the right - // general vicinity - end = 0; - if (mNotificationCount == 0) { - end += mContentFrameMissingTranslation; - } - start = HYPERSPACE_OFFRAMP+end; - } else { - start = y; - end = y + HYPERSPACE_OFFRAMP; - } - - Animator posAnim = ObjectAnimator.ofFloat(mContentParent, "translationY", - start, end); - posAnim.setInterpolator(appearing ? sDecelerateInterpolator : sAccelerateInterpolator); - - if (mContentAnim != null && mContentAnim.isRunning()) { - mContentAnim.cancel(); - } - - Animator fadeAnim = ObjectAnimator.ofFloat(mContentParent, "alpha", - appearing ? 1.0f : 0.0f); - fadeAnim.setInterpolator(appearing ? sAccelerateInterpolator : sDecelerateInterpolator); - - mContentAnim = new AnimatorSet(); - mContentAnim - .play(fadeAnim) - .with(posAnim) - ; - mContentAnim.setDuration((DEBUG?10:1)*(appearing ? OPEN_DURATION : CLOSE_DURATION)); - mContentAnim.addListener(this); - } - - void startAnimation(boolean appearing) { - if (DEBUG) Log.d(TAG, "startAnimation(appearing=" + appearing + ")"); - - createAnimation(appearing); - mContentAnim.start(); - - mVisible = appearing; - - // we want to start disappearing promptly - if (!mVisible) updateClearButton(); - } - - public void onAnimationCancel(Animator animation) { - if (DEBUG) Log.d(TAG, "onAnimationCancel"); - } - - public void onAnimationEnd(Animator animation) { - if (DEBUG) Log.d(TAG, "onAnimationEnd"); - if (! mVisible) { - setVisibility(View.GONE); - } - mContentParent.setLayerType(View.LAYER_TYPE_NONE, null); - mContentAnim = null; - - // we want to show the X lazily - if (mVisible) updateClearButton(); - } - - public void onAnimationRepeat(Animator animation) { - } - - public void onAnimationStart(Animator animation) { - } - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - MotionEvent cancellation = MotionEvent.obtain(ev); - cancellation.setAction(MotionEvent.ACTION_CANCEL); - - boolean intercept = mExpandHelper.onInterceptTouchEvent(ev) || - super.onInterceptTouchEvent(ev); - if (intercept) { - latestItems.onInterceptTouchEvent(cancellation); - } - return intercept; - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - boolean handled = mExpandHelper.onTouchEvent(ev) || - super.onTouchEvent(ev); - return handled; - } - - public void setSettingsEnabled(boolean settingsEnabled) { - if (mSettingsButton != null) { - mSettingsButton.setEnabled(settingsEnabled); - mSettingsButton.setVisibility(settingsEnabled ? View.VISIBLE : View.GONE); - } - } - - public void refreshLayout(int layoutDirection) { - // Force asset reloading - mSettingsButton.setImageDrawable(null); - mSettingsButton.setImageResource(R.drawable.ic_notify_settings); - - // Force asset reloading - mNotificationButton.setImageDrawable(null); - mNotificationButton.setImageResource(R.drawable.ic_notifications); - } -} - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanelTitle.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanelTitle.java deleted file mode 100644 index 8eeeb1420618e..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanelTitle.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2011 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.tablet; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.SoundEffectConstants; -import android.view.View; -import android.view.accessibility.AccessibilityEvent; -import android.widget.RelativeLayout; - -import com.android.systemui.R; - -import java.util.ArrayList; - - -public class NotificationPanelTitle extends RelativeLayout implements View.OnClickListener { - private NotificationPanel mPanel; - private ArrayList buttons; - private View mSettingsButton; - - public NotificationPanelTitle(Context context, AttributeSet attrs) { - super(context, attrs); - buttons = new ArrayList(); - setOnClickListener(this); - } - - public void setPanel(NotificationPanel p) { - mPanel = p; - } - - @Override - public void onFinishInflate() { - super.onFinishInflate(); - buttons.add(mSettingsButton = findViewById(R.id.settings_button)); - buttons.add(findViewById(R.id.notification_button)); - } - - @Override - public void setPressed(boolean pressed) { - super.setPressed(pressed); - for (View button : buttons) { - if (button != null) { - button.setPressed(pressed); - } - } - } - - @Override - public boolean onTouchEvent(MotionEvent e) { - if (!mSettingsButton.isEnabled()) - return false; - switch (e.getAction()) { - case MotionEvent.ACTION_DOWN: - setPressed(true); - break; - case MotionEvent.ACTION_MOVE: - final int x = (int) e.getX(); - final int y = (int) e.getY(); - setPressed(x > 0 && x < getWidth() && y > 0 && y < getHeight()); - break; - case MotionEvent.ACTION_UP: - if (isPressed()) { - playSoundEffect(SoundEffectConstants.CLICK); - mPanel.swapPanels(); - setPressed(false); - } - break; - case MotionEvent.ACTION_CANCEL: - setPressed(false); - break; - } - return true; - } - - @Override - public void onClick(View v) { - if (mSettingsButton.isEnabled() && v == this) { - mPanel.swapPanels(); - } - } - - @Override - public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { - if (super.onRequestSendAccessibilityEvent(child, event)) { - AccessibilityEvent record = AccessibilityEvent.obtain(); - onInitializeAccessibilityEvent(record); - dispatchPopulateAccessibilityEvent(record); - event.appendRecord(record); - return true; - } - return false; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPeekPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPeekPanel.java deleted file mode 100644 index ba2830605fcef..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPeekPanel.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.widget.RelativeLayout; - -public class NotificationPeekPanel extends RelativeLayout implements StatusBarPanel { - TabletStatusBar mBar; - - public NotificationPeekPanel(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public NotificationPeekPanel(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public boolean isInContentArea(int x, int y) { - final int l = getPaddingLeft(); - final int r = getWidth() - getPaddingRight(); - final int t = getPaddingTop(); - final int b = getHeight() - getPaddingBottom(); - return x >= l && x < r && y >= t && y < b; - } - - public void setBar(TabletStatusBar bar) { - mBar = bar; - } - - // We don't really want to intercept the touch event, but we *do* want to reset the fade timer - // in case the user is interacting with some custom controls or something. - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - mBar.resetNotificationPeekFadeTimer(); - return false; - } - - @Override - public boolean dispatchHoverEvent(MotionEvent event) { - // Ignore hover events outside of this panel bounds since such events - // generate spurious accessibility events with the panel content when - // tapping outside of it, thus confusing the user. - final int x = (int) event.getX(); - final int y = (int) event.getY(); - if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) { - return super.dispatchHoverEvent(event); - } - return true; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java deleted file mode 100644 index 9ac933f3721ab..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2008 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.tablet; - -import android.content.Context; -import android.graphics.Canvas; -import android.util.AttributeSet; -import android.view.View; - -public class PanelBackgroundView extends View { - /* - private Bitmap mTexture; - private Paint mPaint; - private int mTextureWidth; - private int mTextureHeight; - */ - - public PanelBackgroundView(Context context, AttributeSet attrs) { - super(context, attrs); - /* - mTexture = BitmapFactory.decodeResource(getResources(), - com.android.internal.R.drawable.status_bar_background); - mTextureWidth = mTexture.getWidth(); - mTextureHeight = mTexture.getHeight(); - - mPaint = new Paint(); - mPaint.setDither(false); - */ - } - - @Override - public void onDraw(Canvas canvas) { - /* - final Bitmap texture = mTexture; - final Paint paint = mPaint; - - final int width = getWidth(); - final int height = getHeight(); - - final int textureWidth = mTextureWidth; - final int textureHeight = mTextureHeight; - - int x = 0; - int y; - - while (x < width) { - y = 0; - while (y < height) { - canvas.drawBitmap(texture, x, y, paint); - y += textureHeight; - } - x += textureWidth; - } - */ - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java deleted file mode 100644 index a55cc9d563667..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.app.StatusBarManager; -import android.content.Context; -import android.content.Intent; -import android.os.UserHandle; -import android.provider.Settings; -import android.util.AttributeSet; -import android.view.View; -import android.widget.CompoundButton; -import android.widget.ImageView; -import android.widget.LinearLayout; - -import com.android.systemui.R; -import com.android.systemui.settings.BrightnessController; -import com.android.systemui.settings.ToggleSlider; -import com.android.systemui.statusbar.policy.AirplaneModeController; -import com.android.systemui.statusbar.policy.DoNotDisturbController; -import com.android.systemui.statusbar.policy.RotationLockController; - -public class SettingsView extends LinearLayout implements View.OnClickListener { - static final String TAG = "SettingsView"; - - AirplaneModeController mAirplane; - RotationLockController mRotationController; - BrightnessController mBrightness; - DoNotDisturbController mDoNotDisturb; - View mRotationLockContainer; - View mRotationLockSeparator; - - public SettingsView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SettingsView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - final Context context = getContext(); - - mAirplane = new AirplaneModeController(context, - (CompoundButton)findViewById(R.id.airplane_checkbox)); - findViewById(R.id.network).setOnClickListener(this); - - mRotationLockContainer = findViewById(R.id.rotate); - mRotationLockSeparator = findViewById(R.id.rotate_separator); - mRotationController = new RotationLockController(context); - mRotationController.addRotationLockControllerCallback( - new RotationLockController.RotationLockControllerCallback() { - @Override - public void onRotationLockStateChanged(boolean locked, boolean visible) { - mRotationLockContainer.setVisibility(visible ? View.VISIBLE : View.GONE); - mRotationLockSeparator.setVisibility(visible ? View.VISIBLE : View.GONE); - } - }); - CompoundButton rotateCheckbox = (CompoundButton) findViewById(R.id.rotate_checkbox); - rotateCheckbox.setChecked(!mRotationController.isRotationLocked()); - rotateCheckbox.setVisibility(mRotationController.isRotationLockAffordanceVisible() - ? View.VISIBLE : View.GONE); - rotateCheckbox.setOnCheckedChangeListener(new CompoundButton. OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - mRotationController.setRotationLocked(!buttonView.isChecked()); - } - }); - - mBrightness = new BrightnessController(context, - (ImageView)findViewById(R.id.brightness_icon), - (ToggleSlider)findViewById(R.id.brightness)); - mDoNotDisturb = new DoNotDisturbController(context, - (CompoundButton)findViewById(R.id.do_not_disturb_checkbox)); - findViewById(R.id.settings).setOnClickListener(this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mAirplane.release(); - mDoNotDisturb.release(); - mRotationController.release(); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.network: - onClickNetwork(); - break; - case R.id.settings: - onClickSettings(); - break; - } - } - - private StatusBarManager getStatusBarManager() { - return (StatusBarManager)getContext().getSystemService(Context.STATUS_BAR_SERVICE); - } - - // Network - // ---------------------------- - private void onClickNetwork() { - getContext().startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - getStatusBarManager().collapsePanels(); - } - - // Settings - // ---------------------------- - private void onClickSettings() { - getContext().startActivityAsUser(new Intent(Settings.ACTION_SETTINGS) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), - new UserHandle(UserHandle.USER_CURRENT)); - getStatusBarManager().collapsePanels(); - } -} - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java deleted file mode 100644 index 7ac4fd695a93d..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.content.ClipData; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Point; -import android.util.AttributeSet; -import android.util.Log; -import android.view.DragEvent; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; - -public class ShirtPocket extends ImageView { - private static final boolean DEBUG = false; - private static final String TAG = "StatusBar/ShirtPocket"; - - private ClipData mClipping = null; - - private ImageView mPreviewIcon; - - public static class DropZone extends View { - ShirtPocket mPocket; - public DropZone(Context context, AttributeSet attrs) { - super(context, attrs); - } - public void setPocket(ShirtPocket p) { - mPocket = p; - } - - public void onAttachedToWindow() { - super.onAttachedToWindow(); - if (mPocket.holding()) { - show(false); - } else { - hide(false); - } - } - - // Drag API notes: we must be visible to receive drag events - private void show(boolean animate) { - setTranslationY(0f); - if (animate) { - setAlpha(0f); - ObjectAnimator.ofFloat(this, "alpha", 0f, 1f).start(); - } else { - setAlpha(1f); - } - } - - private void hide(boolean animate) { - AnimatorListenerAdapter onEnd = new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator _a) { - DropZone.this.setTranslationY(getHeight() + 2); - DropZone.this.setAlpha(0f); - } - }; - if (animate) { - Animator a = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), 0f); - a.addListener(onEnd); - a.start(); - } else { - onEnd.onAnimationEnd(null); - } - } - - @Override - public boolean onDragEvent(DragEvent event) { - if (DEBUG) Log.d(TAG, "onDragEvent: " + event); - switch (event.getAction()) { - // We want to appear whenever a potential drag takes off from anywhere in the UI. - case DragEvent.ACTION_DRAG_STARTED: - show(true); - break; - case DragEvent.ACTION_DRAG_ENTERED: - if (DEBUG) Log.d(TAG, "entered!"); - // XXX: TODO - break; - case DragEvent.ACTION_DRAG_EXITED: - if (DEBUG) Log.d(TAG, "exited!"); - break; - case DragEvent.ACTION_DROP: - if (DEBUG) Log.d(TAG, "dropped!"); - mPocket.stash(event.getClipData()); - break; - case DragEvent.ACTION_DRAG_ENDED: - hide(true); - break; - } - return true; // we want everything, thank you - } - } - - public ShirtPocket(Context context, AttributeSet attrs) { - super(context, attrs); - } - - // TODO: "pin area" panel, dragging things out - ObjectAnimator mAnimHide, mAnimShow; - - protected void onAttachedToWindow() { - } - - public boolean holding() { - return (mClipping != null); - } - - private void stash(ClipData clipping) { - mClipping = clipping; - if (mClipping != null) { - setVisibility(View.VISIBLE); - Bitmap icon = mClipping.getIcon(); -// mDescription.setText(mClipping.getDescription().getLabel()); - if (icon != null) { - setImageBitmap(icon); - } else { - if (mClipping.getItemCount() > 0) { - // TODO: figure out how to visualize every kind of ClipData! - //mAltText.setText(mClipping.getItemAt(0).coerceToText(getContext())); - } - } - } else { - setVisibility(View.GONE); - } - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - final int action = ev.getAction(); - if (action == MotionEvent.ACTION_DOWN) { - final ClipData clip = mClipping; - if (clip != null) { - final Bitmap icon = clip.getIcon(); - DragShadowBuilder shadow; - if (icon != null) { - shadow = new DragShadowBuilder(this) { - public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { - shadowSize.set(icon.getWidth(), icon.getHeight()); - shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2); - } - public void onDrawShadow(Canvas canvas) { - canvas.drawBitmap(icon, 0, 0, new Paint()); - } - }; - } else { - // uhhh, what now? - shadow = new DragShadowBuilder(this); - } - - startDrag(clip, shadow, null, 0); - - // TODO: only discard the clipping if it was accepted - stash(null); - - return true; - } - } - return false; - } - - /* - private boolean isInViewContentArea(View v, int x, int y) { - final int l = v.getPaddingLeft(); - final int r = v.getWidth() - v.getPaddingRight(); - final int t = v.getPaddingTop(); - final int b = v.getHeight() - v.getPaddingBottom(); - return x >= l && x < r && y >= t && y < b; - } - - View.OnTouchListener mWindowTouchListener = new View.OnTouchListener() { - public boolean onTouch(View v, MotionEvent ev) { - final int action = ev.getAction(); - if (action == MotionEvent.ACTION_OUTSIDE - || (action == MotionEvent.ACTION_DOWN - && !isInViewContentArea(mWindow, (int)ev.getX(), (int)ev.getY()))) { - hideWindow(); - return true; - } else if (action == MotionEvent.ACTION_DOWN) { - final ClipData clip = mClipping; - if (clip != null) { - final Bitmap icon = clip.getIcon(); - DragShadowBuilder shadow; - if (icon != null) { - shadow = new DragShadowBuilder(v) { - public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { - shadowSize.set(icon.getWidth(), icon.getHeight()); - shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2); - } - public void onDrawShadow(Canvas canvas) { - canvas.drawBitmap(icon, 0, 0, new Paint()); - } - }; - } else { - // uhhh, what now? - shadow = new DragShadowBuilder(mWindow.findViewById(R.id.preview)); - } - - v.startDrag(clip, shadow, null, 0); - - // TODO: only discard the clipping if it was accepted - stash(null); - - return true; - } - } - return false; - } - }; - */ -} - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java deleted file mode 100644 index b938716ed9a13..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ /dev/null @@ -1,1545 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.animation.LayoutTransition; -import android.animation.ObjectAnimator; -import android.app.ActivityManager; -import android.app.ActivityManagerNative; -import android.app.Notification; -import android.app.PendingIntent; -import android.app.StatusBarManager; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.PixelFormat; -import android.graphics.Point; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; -import android.inputmethodservice.InputMethodService; -import android.os.IBinder; -import android.os.Message; -import android.os.RemoteException; -import android.service.notification.StatusBarNotification; -import android.text.TextUtils; -import android.util.Log; -import android.view.Display; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.SoundEffectConstants; -import android.view.VelocityTracker; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.view.WindowManager; -import android.view.accessibility.AccessibilityEvent; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ScrollView; -import android.widget.TextView; - -import com.android.internal.statusbar.StatusBarIcon; -import com.android.systemui.R; -import com.android.systemui.statusbar.BaseStatusBar; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.DoNotDisturb; -import com.android.systemui.statusbar.NotificationData; -import com.android.systemui.statusbar.NotificationData.Entry; -import com.android.systemui.statusbar.SignalClusterView; -import com.android.systemui.statusbar.StatusBarIconView; -import com.android.systemui.statusbar.policy.BatteryController; -import com.android.systemui.statusbar.policy.BluetoothController; -import com.android.systemui.statusbar.policy.CompatModeButton; -import com.android.systemui.statusbar.policy.LocationController; -import com.android.systemui.statusbar.policy.NetworkController; -import com.android.systemui.statusbar.policy.NotificationRowLayout; -import com.android.systemui.statusbar.policy.Prefs; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.ArrayList; - -public class TabletStatusBar extends BaseStatusBar implements - InputMethodsPanel.OnHardKeyboardEnabledChangeListener { - public static final boolean DEBUG = false; - public static final boolean DEBUG_COMPAT_HELP = false; - public static final String TAG = "TabletStatusBar"; - - - public static final int MSG_OPEN_NOTIFICATION_PANEL = 1000; - public static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001; - public static final int MSG_OPEN_NOTIFICATION_PEEK = 1002; - public static final int MSG_CLOSE_NOTIFICATION_PEEK = 1003; - // 1020-1029 reserved for BaseStatusBar - public static final int MSG_SHOW_CHROME = 1030; - public static final int MSG_HIDE_CHROME = 1031; - public static final int MSG_OPEN_INPUT_METHODS_PANEL = 1040; - public static final int MSG_CLOSE_INPUT_METHODS_PANEL = 1041; - public static final int MSG_OPEN_COMPAT_MODE_PANEL = 1050; - public static final int MSG_CLOSE_COMPAT_MODE_PANEL = 1051; - public static final int MSG_STOP_TICKER = 2000; - - // Fitts' Law assistance for LatinIME; see policy.EventHole - private static final boolean FAKE_SPACE_BAR = true; - - // Notification "peeking" (flyover preview of individual notifications) - final static int NOTIFICATION_PEEK_HOLD_THRESH = 200; // ms - final static int NOTIFICATION_PEEK_FADE_DELAY = 3000; // ms - - private static final int NOTIFICATION_PRIORITY_MULTIPLIER = 10; // see NotificationManagerService - private static final int HIDE_ICONS_BELOW_SCORE = Notification.PRIORITY_LOW * NOTIFICATION_PRIORITY_MULTIPLIER; - - // The height of the bar, as definied by the build. It may be taller if we're plugged - // into hdmi. - int mNaturalBarHeight = -1; - int mIconSize = -1; - int mIconHPadding = -1; - int mNavIconWidth = -1; - int mMenuNavIconWidth = -1; - private int mMaxNotificationIcons = 5; - - TabletStatusBarView mStatusBarView; - View mNotificationArea; - View mNotificationTrigger; - NotificationIconArea mNotificationIconArea; - ViewGroup mNavigationArea; - - boolean mNotificationDNDMode; - NotificationData.Entry mNotificationDNDDummyEntry; - - ImageView mBackButton; - View mHomeButton; - View mMenuButton; - View mRecentButton; - private boolean mAltBackButtonEnabledForIme; - - ViewGroup mFeedbackIconArea; // notification icons, IME icon, compat icon - InputMethodButton mInputMethodSwitchButton; - CompatModeButton mCompatModeButton; - - NotificationPanel mNotificationPanel; - WindowManager.LayoutParams mNotificationPanelParams; - NotificationPeekPanel mNotificationPeekWindow; - ViewGroup mNotificationPeekRow; - int mNotificationPeekIndex; - IBinder mNotificationPeekKey; - LayoutTransition mNotificationPeekScrubLeft, mNotificationPeekScrubRight; - - int mNotificationPeekTapDuration; - int mNotificationFlingVelocity; - - BatteryController mBatteryController; - BluetoothController mBluetoothController; - LocationController mLocationController; - NetworkController mNetworkController; - DoNotDisturb mDoNotDisturb; - - ViewGroup mBarContents; - - // hide system chrome ("lights out") support - View mShadow; - - NotificationIconArea.IconLayout mIconLayout; - - TabletTicker mTicker; - - View mFakeSpaceBar; - KeyEvent mSpaceBarKeyEvent = null; - - View mCompatibilityHelpDialog = null; - - // for disabling the status bar - int mDisabled = 0; - - private InputMethodsPanel mInputMethodsPanel; - private CompatModePanel mCompatModePanel; - - private int mSystemUiVisibility = 0; - - private int mNavigationIconHints = 0; - - private int mShowSearchHoldoff = 0; - - public Context getContext() { return mContext; } - - private Runnable mShowSearchPanel = new Runnable() { - public void run() { - showSearchPanel(); - } - }; - - private View.OnTouchListener mHomeSearchActionListener = new View.OnTouchListener() { - public boolean onTouch(View v, MotionEvent event) { - switch(event.getAction()) { - case MotionEvent.ACTION_DOWN: - if (!shouldDisableNavbarGestures() && !inKeyguardRestrictedInputMode()) { - mHandler.removeCallbacks(mShowSearchPanel); - mHandler.postDelayed(mShowSearchPanel, mShowSearchHoldoff); - } - break; - - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - mHandler.removeCallbacks(mShowSearchPanel); - break; - } - return false; - } - }; - - @Override - protected void createAndAddWindows() { - addStatusBarWindow(); - addPanelWindows(); - } - - private void addStatusBarWindow() { - final View sb = makeStatusBarView(); - - final WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_NAVIGATION_BAR, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, - PixelFormat.OPAQUE); - - // We explicitly leave FLAG_HARDWARE_ACCELERATED out of the flags. The status bar occupies - // very little screen real-estate and is updated fairly frequently. By using CPU rendering - // for the status bar, we prevent the GPU from having to wake up just to do these small - // updates, which should help keep power consumption down. - - lp.gravity = getStatusBarGravity(); - lp.setTitle("SystemBar"); - lp.packageName = mContext.getPackageName(); - mWindowManager.addView(sb, lp); - } - - protected void addPanelWindows() { - final Context context = mContext; - final Resources res = mContext.getResources(); - - // Notification Panel - mNotificationPanel = (NotificationPanel)View.inflate(context, - R.layout.system_bar_notification_panel, null); - mNotificationPanel.setBar(this); - mNotificationPanel.show(false, false); - mNotificationPanel.setOnTouchListener( - new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PANEL, mNotificationPanel)); - - // the battery icon - mBatteryController.addIconView((ImageView)mNotificationPanel.findViewById(R.id.battery)); - mBatteryController.addLabelView( - (TextView)mNotificationPanel.findViewById(R.id.battery_text)); - - // Bt - mBluetoothController.addIconView( - (ImageView)mNotificationPanel.findViewById(R.id.bluetooth)); - - // network icons: either a combo icon that switches between mobile and data, or distinct - // mobile and data icons - final ImageView mobileRSSI = - (ImageView)mNotificationPanel.findViewById(R.id.mobile_signal); - if (mobileRSSI != null) { - mNetworkController.addPhoneSignalIconView(mobileRSSI); - } - final ImageView wifiRSSI = - (ImageView)mNotificationPanel.findViewById(R.id.wifi_signal); - if (wifiRSSI != null) { - mNetworkController.addWifiIconView(wifiRSSI); - } - mNetworkController.addWifiLabelView( - (TextView)mNotificationPanel.findViewById(R.id.wifi_text)); - - mNetworkController.addDataTypeIconView( - (ImageView)mNotificationPanel.findViewById(R.id.mobile_type)); - mNetworkController.addMobileLabelView( - (TextView)mNotificationPanel.findViewById(R.id.mobile_text)); - mNetworkController.addCombinedLabelView( - (TextView)mBarContents.findViewById(R.id.network_text)); - - mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel); - - WindowManager.LayoutParams lp = mNotificationPanelParams = new WindowManager.LayoutParams( - res.getDimensionPixelSize(R.dimen.notification_panel_width), - getNotificationPanelHeight(), - WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH - | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, - PixelFormat.TRANSLUCENT); - lp.gravity = Gravity.BOTTOM | Gravity.END; - lp.setTitle("NotificationPanel"); - lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; - lp.windowAnimations = com.android.internal.R.style.Animation; // == no animation -// lp.windowAnimations = com.android.internal.R.style.Animation_ZoomButtons; // simple fade - - mWindowManager.addView(mNotificationPanel, lp); - - // Search Panel - mStatusBarView.setBar(this); - mHomeButton.setOnTouchListener(mHomeSearchActionListener); - updateSearchPanel(); - - // Input methods Panel - mInputMethodsPanel = (InputMethodsPanel) View.inflate(context, - R.layout.system_bar_input_methods_panel, null); - mInputMethodsPanel.setHardKeyboardEnabledChangeListener(this); - mInputMethodsPanel.setOnTouchListener(new TouchOutsideListener( - MSG_CLOSE_INPUT_METHODS_PANEL, mInputMethodsPanel)); - mInputMethodsPanel.setImeSwitchButton(mInputMethodSwitchButton); - mStatusBarView.setIgnoreChildren(2, mInputMethodSwitchButton, mInputMethodsPanel); - lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH - | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, - PixelFormat.TRANSLUCENT); - lp.gravity = Gravity.BOTTOM | Gravity.END; - lp.setTitle("InputMethodsPanel"); - lp.windowAnimations = R.style.Animation_RecentPanel; - - mWindowManager.addView(mInputMethodsPanel, lp); - - // Compatibility mode selector panel - mCompatModePanel = (CompatModePanel) View.inflate(context, - R.layout.system_bar_compat_mode_panel, null); - mCompatModePanel.setOnTouchListener(new TouchOutsideListener( - MSG_CLOSE_COMPAT_MODE_PANEL, mCompatModePanel)); - mCompatModePanel.setTrigger(mCompatModeButton); - mCompatModePanel.setVisibility(View.GONE); - mStatusBarView.setIgnoreChildren(3, mCompatModeButton, mCompatModePanel); - lp = new WindowManager.LayoutParams( - 250, - ViewGroup.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH - | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, - PixelFormat.TRANSLUCENT); - lp.gravity = Gravity.BOTTOM | Gravity.END; - lp.setTitle("CompatModePanel"); - lp.windowAnimations = android.R.style.Animation_Dialog; - - mWindowManager.addView(mCompatModePanel, lp); - - mRecentButton.setOnTouchListener(mRecentsPreloadOnTouchListener); - - mPile = (NotificationRowLayout)mNotificationPanel.findViewById(R.id.content); - mPile.removeAllViews(); - mPile.setLongPressListener(getNotificationLongClicker()); - - ScrollView scroller = (ScrollView)mPile.getParent(); - scroller.setFillViewport(true); - } - - @Override - protected int getExpandedViewMaxHeight() { - return getNotificationPanelHeight(); - } - - private int getNotificationPanelHeight() { - final Resources res = mContext.getResources(); - final Display d = mWindowManager.getDefaultDisplay(); - final Point size = new Point(); - d.getRealSize(size); - return Math.max(res.getDimensionPixelSize(R.dimen.notification_panel_min_height), size.y); - } - - @Override - public void start() { - super.start(); // will add the main bar view - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - loadDimens(); - mNotificationPanelParams.height = getNotificationPanelHeight(); - mWindowManager.updateViewLayout(mNotificationPanel, mNotificationPanelParams); - mShowSearchHoldoff = mContext.getResources().getInteger( - R.integer.config_show_search_delay); - updateSearchPanel(); - } - - @Override - protected void refreshLayout(int layoutDirection) { - mNotificationPanel.refreshLayout(layoutDirection); - } - - protected void loadDimens() { - final Resources res = mContext.getResources(); - - mNaturalBarHeight = res.getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_height); - - int newIconSize = res.getDimensionPixelSize( - com.android.internal.R.dimen.system_bar_icon_size); - int newIconHPadding = res.getDimensionPixelSize( - R.dimen.status_bar_icon_padding); - int newNavIconWidth = res.getDimensionPixelSize(R.dimen.navigation_key_width); - int newMenuNavIconWidth = res.getDimensionPixelSize(R.dimen.navigation_menu_key_width); - - if (mNavigationArea != null && newNavIconWidth != mNavIconWidth) { - mNavIconWidth = newNavIconWidth; - - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( - mNavIconWidth, ViewGroup.LayoutParams.MATCH_PARENT); - mBackButton.setLayoutParams(lp); - mHomeButton.setLayoutParams(lp); - mRecentButton.setLayoutParams(lp); - } - - if (mNavigationArea != null && newMenuNavIconWidth != mMenuNavIconWidth) { - mMenuNavIconWidth = newMenuNavIconWidth; - - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( - mMenuNavIconWidth, ViewGroup.LayoutParams.MATCH_PARENT); - mMenuButton.setLayoutParams(lp); - } - - if (newIconHPadding != mIconHPadding || newIconSize != mIconSize) { -// Log.d(TAG, "size=" + newIconSize + " padding=" + newIconHPadding); - mIconHPadding = newIconHPadding; - mIconSize = newIconSize; - reloadAllNotificationIcons(); // reload the tray - } - - final int numIcons = res.getInteger(R.integer.config_maxNotificationIcons); - if (numIcons != mMaxNotificationIcons) { - mMaxNotificationIcons = numIcons; - if (DEBUG) Log.d(TAG, "max notification icons: " + mMaxNotificationIcons); - reloadAllNotificationIcons(); - } - } - - @Override - public View getStatusBarView() { - return mStatusBarView; - } - - protected View makeStatusBarView() { - final Context context = mContext; - - loadDimens(); - - final TabletStatusBarView sb = (TabletStatusBarView)View.inflate( - context, R.layout.system_bar, null); - mStatusBarView = sb; - - sb.setHandler(mHandler); - - try { - // Sanity-check that someone hasn't set up the config wrong and asked for a navigation - // bar on a tablet that has only the system bar - if (mWindowManagerService.hasNavigationBar()) { - Log.e(TAG, "Tablet device cannot show navigation bar and system bar"); - } - } catch (RemoteException ex) { - } - - mBarContents = (ViewGroup) sb.findViewById(R.id.bar_contents); - - // the whole right-hand side of the bar - mNotificationArea = sb.findViewById(R.id.notificationArea); - mNotificationArea.setOnTouchListener(new NotificationTriggerTouchListener()); - - // the button to open the notification area - mNotificationTrigger = sb.findViewById(R.id.notificationTrigger); - - // the more notifications icon - mNotificationIconArea = (NotificationIconArea)sb.findViewById(R.id.notificationIcons); - - // where the icons go - mIconLayout = (NotificationIconArea.IconLayout) sb.findViewById(R.id.icons); - - mNotificationPeekTapDuration = ViewConfiguration.getTapTimeout(); - mNotificationFlingVelocity = 300; // px/s - - mTicker = new TabletTicker(this); - - // The icons - mLocationController = new LocationController(mContext); // will post a notification - - // watch the PREF_DO_NOT_DISTURB and convert to appropriate disable() calls - mDoNotDisturb = new DoNotDisturb(mContext); - - mBatteryController = new BatteryController(mContext); - mBatteryController.addIconView((ImageView)sb.findViewById(R.id.battery)); - mBluetoothController = new BluetoothController(mContext); - mBluetoothController.addIconView((ImageView)sb.findViewById(R.id.bluetooth)); - - mNetworkController = new NetworkController(mContext); - final SignalClusterView signalCluster = - (SignalClusterView)sb.findViewById(R.id.signal_cluster); - mNetworkController.addSignalCluster(signalCluster); - - // The navigation buttons - mBackButton = (ImageView)sb.findViewById(R.id.back); - mNavigationArea = (ViewGroup) sb.findViewById(R.id.navigationArea); - mHomeButton = mNavigationArea.findViewById(R.id.home); - mMenuButton = mNavigationArea.findViewById(R.id.menu); - mRecentButton = mNavigationArea.findViewById(R.id.recent_apps); - mRecentButton.setOnClickListener(mOnClickListener); - - LayoutTransition lt = new LayoutTransition(); - lt.setDuration(250); - // don't wait for these transitions; we just want icons to fade in/out, not move around - lt.setDuration(LayoutTransition.CHANGE_APPEARING, 0); - lt.setDuration(LayoutTransition.CHANGE_DISAPPEARING, 0); - lt.addTransitionListener(new LayoutTransition.TransitionListener() { - public void endTransition(LayoutTransition transition, ViewGroup container, - View view, int transitionType) { - // ensure the menu button doesn't stick around on the status bar after it's been - // removed - mBarContents.invalidate(); - } - public void startTransition(LayoutTransition transition, ViewGroup container, - View view, int transitionType) {} - }); - mNavigationArea.setLayoutTransition(lt); - // no multi-touch on the nav buttons - mNavigationArea.setMotionEventSplittingEnabled(false); - - // The bar contents buttons - mFeedbackIconArea = (ViewGroup)sb.findViewById(R.id.feedbackIconArea); - mInputMethodSwitchButton = (InputMethodButton) sb.findViewById(R.id.imeSwitchButton); - // Overwrite the lister - mInputMethodSwitchButton.setOnClickListener(mOnClickListener); - - mCompatModeButton = (CompatModeButton) sb.findViewById(R.id.compatModeButton); - mCompatModeButton.setOnClickListener(mOnClickListener); - mCompatModeButton.setVisibility(View.GONE); - - // for redirecting errant bar taps to the IME - mFakeSpaceBar = sb.findViewById(R.id.fake_space_bar); - - // "shadows" of the status bar features, for lights-out mode - mShadow = sb.findViewById(R.id.bar_shadow); - mShadow.setOnTouchListener( - new View.OnTouchListener() { - public boolean onTouch(View v, MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { - // even though setting the systemUI visibility below will turn these views - // on, we need them to come up faster so that they can catch this motion - // event - mShadow.setVisibility(View.GONE); - mBarContents.setVisibility(View.VISIBLE); - - try { - mBarService.setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE); - } catch (RemoteException ex) { - // system process dead - } - } - return false; - } - }); - - // tuning parameters - final int LIGHTS_GOING_OUT_SYSBAR_DURATION = 750; - final int LIGHTS_GOING_OUT_SHADOW_DURATION = 750; - final int LIGHTS_GOING_OUT_SHADOW_DELAY = 0; - - final int LIGHTS_COMING_UP_SYSBAR_DURATION = 200; -// final int LIGHTS_COMING_UP_SYSBAR_DELAY = 50; - final int LIGHTS_COMING_UP_SHADOW_DURATION = 0; - - LayoutTransition xition = new LayoutTransition(); - xition.setAnimator(LayoutTransition.APPEARING, - ObjectAnimator.ofFloat(null, "alpha", 0.5f, 1f)); - xition.setDuration(LayoutTransition.APPEARING, LIGHTS_COMING_UP_SYSBAR_DURATION); - xition.setStartDelay(LayoutTransition.APPEARING, 0); - xition.setAnimator(LayoutTransition.DISAPPEARING, - ObjectAnimator.ofFloat(null, "alpha", 1f, 0f)); - xition.setDuration(LayoutTransition.DISAPPEARING, LIGHTS_GOING_OUT_SYSBAR_DURATION); - xition.setStartDelay(LayoutTransition.DISAPPEARING, 0); - ((ViewGroup)sb.findViewById(R.id.bar_contents_holder)).setLayoutTransition(xition); - - xition = new LayoutTransition(); - xition.setAnimator(LayoutTransition.APPEARING, - ObjectAnimator.ofFloat(null, "alpha", 0f, 1f)); - xition.setDuration(LayoutTransition.APPEARING, LIGHTS_GOING_OUT_SHADOW_DURATION); - xition.setStartDelay(LayoutTransition.APPEARING, LIGHTS_GOING_OUT_SHADOW_DELAY); - xition.setAnimator(LayoutTransition.DISAPPEARING, - ObjectAnimator.ofFloat(null, "alpha", 1f, 0f)); - xition.setDuration(LayoutTransition.DISAPPEARING, LIGHTS_COMING_UP_SHADOW_DURATION); - xition.setStartDelay(LayoutTransition.DISAPPEARING, 0); - ((ViewGroup)sb.findViewById(R.id.bar_shadow_holder)).setLayoutTransition(xition); - - // set the initial view visibility - setAreThereNotifications(); - - // receive broadcasts - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - filter.addAction(Intent.ACTION_SCREEN_OFF); - context.registerReceiver(mBroadcastReceiver, filter); - - return sb; - } - - @Override - protected WindowManager.LayoutParams getRecentsLayoutParams(LayoutParams layoutParams) { - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - (int) mContext.getResources().getDimension(R.dimen.status_bar_recents_width), - ViewGroup.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH - | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, - PixelFormat.TRANSLUCENT); - lp.gravity = Gravity.BOTTOM | Gravity.START; - lp.setTitle("RecentsPanel"); - lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications; - lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; - - return lp; - } - - @Override - protected WindowManager.LayoutParams getSearchLayoutParams(LayoutParams layoutParams) { - boolean opaque = false; - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, - (opaque ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT)); - if (ActivityManager.isHighEndGfx()) { - lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - } else { - lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND; - lp.dimAmount = 0.7f; - } - lp.gravity = Gravity.BOTTOM | Gravity.START; - lp.setTitle("SearchPanel"); - // TODO: Define custom animation for Search panel - lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications; - lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; - return lp; - } - - @Override - protected void updateSearchPanel() { - super.updateSearchPanel(); - mSearchPanelView.setStatusBarView(mStatusBarView); - mStatusBarView.setDelegateView(mSearchPanelView); - } - - @Override - public void showSearchPanel() { - super.showSearchPanel(); - WindowManager.LayoutParams lp = - (android.view.WindowManager.LayoutParams) mStatusBarView.getLayoutParams(); - lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; - mWindowManager.updateViewLayout(mStatusBarView, lp); - } - - @Override - public void hideSearchPanel() { - super.hideSearchPanel(); - WindowManager.LayoutParams lp = - (android.view.WindowManager.LayoutParams) mStatusBarView.getLayoutParams(); - lp.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; - mWindowManager.updateViewLayout(mStatusBarView, lp); - } - - public int getStatusBarHeight() { - return mStatusBarView != null ? mStatusBarView.getHeight() - : mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_height); - } - - protected int getStatusBarGravity() { - return Gravity.BOTTOM | Gravity.FILL_HORIZONTAL; - } - - public void onBarHeightChanged(int height) { - final WindowManager.LayoutParams lp - = (WindowManager.LayoutParams)mStatusBarView.getLayoutParams(); - if (lp == null) { - // haven't been added yet - return; - } - if (lp.height != height) { - lp.height = height; - mWindowManager.updateViewLayout(mStatusBarView, lp); - } - } - - @Override - protected BaseStatusBar.H createHandler() { - return new TabletStatusBar.H(); - } - - private class H extends BaseStatusBar.H { - public void handleMessage(Message m) { - super.handleMessage(m); - switch (m.what) { - case MSG_OPEN_NOTIFICATION_PEEK: - if (DEBUG) Log.d(TAG, "opening notification peek window; arg=" + m.arg1); - - if (m.arg1 >= 0) { - final int N = mNotificationData.size(); - - if (!mNotificationDNDMode) { - if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) { - NotificationData.Entry entry = mNotificationData.get(N-1-mNotificationPeekIndex); - entry.icon.setBackgroundColor(0); - mNotificationPeekIndex = -1; - mNotificationPeekKey = null; - } - } - - final int peekIndex = m.arg1; - if (peekIndex < N) { - //Log.d(TAG, "loading peek: " + peekIndex); - NotificationData.Entry entry = - mNotificationDNDMode - ? mNotificationDNDDummyEntry - : mNotificationData.get(N-1-peekIndex); - NotificationData.Entry copy = new NotificationData.Entry( - entry.key, - entry.notification, - entry.icon); - inflateViews(copy, mNotificationPeekRow); - - if (mNotificationDNDMode) { - copy.content.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - SharedPreferences.Editor editor = Prefs.edit(mContext); - editor.putBoolean(Prefs.DO_NOT_DISTURB_PREF, false); - editor.apply(); - animateCollapsePanels(); - visibilityChanged(false); - } - }); - } - - entry.icon.setBackgroundColor(0x20FFFFFF); - -// mNotificationPeekRow.setLayoutTransition( -// peekIndex < mNotificationPeekIndex -// ? mNotificationPeekScrubLeft -// : mNotificationPeekScrubRight); - - mNotificationPeekRow.removeAllViews(); - mNotificationPeekRow.addView(copy.row); - - mNotificationPeekWindow.setVisibility(View.VISIBLE); - mNotificationPanel.show(false, true); - - mNotificationPeekIndex = peekIndex; - mNotificationPeekKey = entry.key; - } - } - break; - case MSG_CLOSE_NOTIFICATION_PEEK: - if (DEBUG) Log.d(TAG, "closing notification peek window"); - mNotificationPeekWindow.setVisibility(View.GONE); - mNotificationPeekRow.removeAllViews(); - - final int N = mNotificationData.size(); - if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) { - NotificationData.Entry entry = - mNotificationDNDMode - ? mNotificationDNDDummyEntry - : mNotificationData.get(N-1-mNotificationPeekIndex); - entry.icon.setBackgroundColor(0); - } - - mNotificationPeekIndex = -1; - mNotificationPeekKey = null; - break; - case MSG_OPEN_NOTIFICATION_PANEL: - if (DEBUG) Log.d(TAG, "opening notifications panel"); - if (!mNotificationPanel.isShowing()) { - mNotificationPanel.show(true, true); - mNotificationArea.setVisibility(View.INVISIBLE); - mTicker.halt(); - } - break; - case MSG_CLOSE_NOTIFICATION_PANEL: - if (DEBUG) Log.d(TAG, "closing notifications panel"); - if (mNotificationPanel.isShowing()) { - mNotificationPanel.show(false, true); - mNotificationArea.setVisibility(View.VISIBLE); - } - break; - case MSG_OPEN_INPUT_METHODS_PANEL: - if (DEBUG) Log.d(TAG, "opening input methods panel"); - if (mInputMethodsPanel != null) mInputMethodsPanel.openPanel(); - break; - case MSG_CLOSE_INPUT_METHODS_PANEL: - if (DEBUG) Log.d(TAG, "closing input methods panel"); - if (mInputMethodsPanel != null) mInputMethodsPanel.closePanel(false); - break; - case MSG_OPEN_COMPAT_MODE_PANEL: - if (DEBUG) Log.d(TAG, "opening compat panel"); - if (mCompatModePanel != null) mCompatModePanel.openPanel(); - break; - case MSG_CLOSE_COMPAT_MODE_PANEL: - if (DEBUG) Log.d(TAG, "closing compat panel"); - if (mCompatModePanel != null) mCompatModePanel.closePanel(); - break; - case MSG_SHOW_CHROME: - if (DEBUG) Log.d(TAG, "hiding shadows (lights on)"); - mBarContents.setVisibility(View.VISIBLE); - mShadow.setVisibility(View.GONE); - mSystemUiVisibility &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; - notifyUiVisibilityChanged(); - break; - case MSG_HIDE_CHROME: - if (DEBUG) Log.d(TAG, "showing shadows (lights out)"); - animateCollapsePanels(); - visibilityChanged(false); - mBarContents.setVisibility(View.GONE); - mShadow.setVisibility(View.VISIBLE); - mSystemUiVisibility |= View.SYSTEM_UI_FLAG_LOW_PROFILE; - notifyUiVisibilityChanged(); - break; - case MSG_STOP_TICKER: - mTicker.halt(); - break; - } - } - } - - public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) { - if (DEBUG) Log.d(TAG, "addIcon(" + slot + ") -> " + icon); - } - - public void updateIcon(String slot, int index, int viewIndex, - StatusBarIcon old, StatusBarIcon icon) { - if (DEBUG) Log.d(TAG, "updateIcon(" + slot + ") -> " + icon); - } - - public void removeIcon(String slot, int index, int viewIndex) { - if (DEBUG) Log.d(TAG, "removeIcon(" + slot + ")"); - } - - public void addNotification(IBinder key, StatusBarNotification notification) { - if (DEBUG) Log.d(TAG, "addNotification(" + key + " -> " + notification + ")"); - addNotificationViews(key, notification); - - final boolean immersive = isImmersive(); - if (false && immersive) { - // TODO: immersive mode popups for tablet - } else if (notification.getNotification().fullScreenIntent != null) { - // not immersive & a full-screen alert should be shown - Log.w(TAG, "Notification has fullScreenIntent and activity is not immersive;" - + " sending fullScreenIntent"); - try { - notification.getNotification().fullScreenIntent.send(); - } catch (PendingIntent.CanceledException e) { - } - } else { - tick(key, notification, true); - } - - setAreThereNotifications(); - } - - public void removeNotification(IBinder key) { - if (DEBUG) Log.d(TAG, "removeNotification(" + key + ")"); - removeNotificationViews(key); - mTicker.remove(key); - setAreThereNotifications(); - } - - public void showClock(boolean show) { - View clock = mBarContents.findViewById(R.id.clock); - View network_text = mBarContents.findViewById(R.id.network_text); - if (clock != null) { - clock.setVisibility(show ? View.VISIBLE : View.GONE); - } - if (network_text != null) { - network_text.setVisibility((!show) ? View.VISIBLE : View.GONE); - } - } - - public void disable(int state) { - int old = mDisabled; - int diff = state ^ old; - mDisabled = state; - - // act accordingly - if ((diff & StatusBarManager.DISABLE_CLOCK) != 0) { - boolean show = (state & StatusBarManager.DISABLE_CLOCK) == 0; - Log.i(TAG, "DISABLE_CLOCK: " + (show ? "no" : "yes")); - showClock(show); - } - if ((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) { - boolean show = (state & StatusBarManager.DISABLE_SYSTEM_INFO) == 0; - Log.i(TAG, "DISABLE_SYSTEM_INFO: " + (show ? "no" : "yes")); - mNotificationTrigger.setVisibility(show ? View.VISIBLE : View.GONE); - } - if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) { - if ((state & StatusBarManager.DISABLE_EXPAND) != 0) { - Log.i(TAG, "DISABLE_EXPAND: yes"); - animateCollapsePanels(); - visibilityChanged(false); - } - } - if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { - mNotificationDNDMode = Prefs.read(mContext) - .getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT); - - if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { - Log.i(TAG, "DISABLE_NOTIFICATION_ICONS: yes" + (mNotificationDNDMode?" (DND)":"")); - mTicker.halt(); - } else { - Log.i(TAG, "DISABLE_NOTIFICATION_ICONS: no" + (mNotificationDNDMode?" (DND)":"")); - } - - // refresh icons to show either notifications or the DND message - reloadAllNotificationIcons(); - } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { - if ((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { - mTicker.halt(); - } - } - if ((diff & (StatusBarManager.DISABLE_RECENT - | StatusBarManager.DISABLE_BACK - | StatusBarManager.DISABLE_HOME)) != 0) { - setNavigationVisibility(state); - - if ((state & StatusBarManager.DISABLE_RECENT) != 0) { - // close recents if it's visible - mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL); - mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL); - } - } - } - - private void setNavigationVisibility(int visibility) { - boolean disableHome = ((visibility & StatusBarManager.DISABLE_HOME) != 0); - boolean disableRecent = ((visibility & StatusBarManager.DISABLE_RECENT) != 0); - boolean disableBack = ((visibility & StatusBarManager.DISABLE_BACK) != 0); - - mBackButton.setVisibility(disableBack ? View.INVISIBLE : View.VISIBLE); - mHomeButton.setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE); - mRecentButton.setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE); - - mInputMethodSwitchButton.setScreenLocked( - (visibility & StatusBarManager.DISABLE_SYSTEM_INFO) != 0); - } - - private boolean hasTicker(Notification n) { - return n.tickerView != null || !TextUtils.isEmpty(n.tickerText); - } - - @Override - protected void tick(IBinder key, StatusBarNotification n, boolean firstTime) { - // Don't show the ticker when the windowshade is open. - if (mNotificationPanel.isShowing()) { - return; - } - // If they asked for FLAG_ONLY_ALERT_ONCE, then only show this notification - // if it's a new notification. - if (!firstTime && (n.getNotification().flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) { - return; - } - // Show the ticker if one is requested. Also don't do this - // until status bar window is attached to the window manager, - // because... well, what's the point otherwise? And trying to - // run a ticker without being attached will crash! - if (hasTicker(n.getNotification()) && mStatusBarView.getWindowToken() != null) { - if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS - | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { - mTicker.add(key, n); - mFeedbackIconArea.setVisibility(View.GONE); - } - } - } - - // called by TabletTicker when it's done with all queued ticks - public void doneTicking() { - mFeedbackIconArea.setVisibility(View.VISIBLE); - } - - public void animateExpandNotificationsPanel() { - mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL); - mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL); - } - - public void animateCollapsePanels() { - animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE); - } - - public void animateCollapsePanels(int flags) { - if ((flags & CommandQueue.FLAG_EXCLUDE_NOTIFICATION_PANEL) == 0) { - mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PANEL); - mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PANEL); - } - if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) { - mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL); - mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL); - } - if ((flags & CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL) == 0) { - mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL); - mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL); - } - if ((flags & CommandQueue.FLAG_EXCLUDE_INPUT_METHODS_PANEL) == 0) { - mHandler.removeMessages(MSG_CLOSE_INPUT_METHODS_PANEL); - mHandler.sendEmptyMessage(MSG_CLOSE_INPUT_METHODS_PANEL); - } - if ((flags & CommandQueue.FLAG_EXCLUDE_COMPAT_MODE_PANEL) == 0) { - mHandler.removeMessages(MSG_CLOSE_COMPAT_MODE_PANEL); - mHandler.sendEmptyMessage(MSG_CLOSE_COMPAT_MODE_PANEL); - } - - } - - @Override - public void animateExpandSettingsPanel() { - // TODO: Implement when TabletStatusBar begins to be used. - } - - @Override // CommandQueue - public void setNavigationIconHints(int hints) { - if (hints == mNavigationIconHints) return; - - if (DEBUG) { - android.widget.Toast.makeText(mContext, - "Navigation icon hints = " + hints, - 500).show(); - } - - mNavigationIconHints = hints; - - mBackButton.setAlpha( - (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_NOP)) ? 0.5f : 1.0f); - mHomeButton.setAlpha( - (0 != (hints & StatusBarManager.NAVIGATION_HINT_HOME_NOP)) ? 0.5f : 1.0f); - mRecentButton.setAlpha( - (0 != (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP)) ? 0.5f : 1.0f); - - mBackButton.setImageResource( - (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT)) - ? R.drawable.ic_sysbar_back_ime - : R.drawable.ic_sysbar_back); - } - - private void notifyUiVisibilityChanged() { - try { - mWindowManagerService.statusBarVisibilityChanged(mSystemUiVisibility); - } catch (RemoteException ex) { - } - } - - @Override // CommandQueue - public void setSystemUiVisibility(int vis, int mask) { - final int oldVal = mSystemUiVisibility; - final int newVal = (oldVal&~mask) | (vis&mask); - final int diff = newVal ^ oldVal; - - if (diff != 0) { - mSystemUiVisibility = newVal; - - if (0 != (diff & View.SYSTEM_UI_FLAG_LOW_PROFILE)) { - mHandler.removeMessages(MSG_HIDE_CHROME); - mHandler.removeMessages(MSG_SHOW_CHROME); - mHandler.sendEmptyMessage(0 == (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) - ? MSG_SHOW_CHROME : MSG_HIDE_CHROME); - } - - notifyUiVisibilityChanged(); - } - } - - public void setLightsOn(boolean on) { - // Policy note: if the frontmost activity needs the menu key, we assume it is a legacy app - // that can't handle lights-out mode. - if (mMenuButton.getVisibility() == View.VISIBLE) { - on = true; - } - - Log.v(TAG, "setLightsOn(" + on + ")"); - if (on) { - setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE); - } else { - setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE, View.SYSTEM_UI_FLAG_LOW_PROFILE); - } - } - - public void topAppWindowChanged(boolean showMenu) { - if (DEBUG) { - Log.d(TAG, (showMenu?"showing":"hiding") + " the MENU button"); - } - mMenuButton.setVisibility(showMenu ? View.VISIBLE : View.GONE); - - // See above re: lights-out policy for legacy apps. - if (showMenu) setLightsOn(true); - - mCompatModeButton.refresh(); - if (mCompatModeButton.getVisibility() == View.VISIBLE) { - if (DEBUG_COMPAT_HELP - || ! Prefs.read(mContext).getBoolean(Prefs.SHOWN_COMPAT_MODE_HELP, false)) { - showCompatibilityHelp(); - } - } else { - hideCompatibilityHelp(); - mCompatModePanel.closePanel(); - } - } - - private void showCompatibilityHelp() { - if (mCompatibilityHelpDialog != null) { - return; - } - - mCompatibilityHelpDialog = View.inflate(mContext, R.layout.compat_mode_help, null); - View button = mCompatibilityHelpDialog.findViewById(R.id.button); - - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - hideCompatibilityHelp(); - SharedPreferences.Editor editor = Prefs.edit(mContext); - editor.putBoolean(Prefs.SHOWN_COMPAT_MODE_HELP, true); - editor.apply(); - } - }); - - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, - PixelFormat.TRANSLUCENT); - lp.setTitle("CompatibilityModeDialog"); - lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; - lp.windowAnimations = com.android.internal.R.style.Animation_ZoomButtons; // simple fade - - mWindowManager.addView(mCompatibilityHelpDialog, lp); - } - - private void hideCompatibilityHelp() { - if (mCompatibilityHelpDialog != null) { - mWindowManager.removeView(mCompatibilityHelpDialog); - mCompatibilityHelpDialog = null; - } - } - - public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { - mInputMethodSwitchButton.setImeWindowStatus(token, - (vis & InputMethodService.IME_ACTIVE) != 0); - updateNotificationIcons(); - mInputMethodsPanel.setImeToken(token); - - boolean altBack = (backDisposition == InputMethodService.BACK_DISPOSITION_WILL_DISMISS) - || ((vis & InputMethodService.IME_VISIBLE) != 0); - mAltBackButtonEnabledForIme = altBack; - - mCommandQueue.setNavigationIconHints( - altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT) - : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT)); - - if (FAKE_SPACE_BAR) { - mFakeSpaceBar.setVisibility(((vis & InputMethodService.IME_VISIBLE) != 0) - ? View.VISIBLE : View.GONE); - } - } - - @Override - public void setHardKeyboardStatus(boolean available, boolean enabled) { - if (DEBUG) { - Log.d(TAG, "Set hard keyboard status: available=" + available - + ", enabled=" + enabled); - } - mInputMethodSwitchButton.setHardKeyboardStatus(available); - updateNotificationIcons(); - mInputMethodsPanel.setHardKeyboardStatus(available, enabled); - } - - @Override - public void onHardKeyboardEnabledChange(boolean enabled) { - try { - mBarService.setHardKeyboardEnabled(enabled); - } catch (RemoteException ex) { - } - } - - private boolean isImmersive() { - try { - return ActivityManagerNative.getDefault().isTopActivityImmersive(); - //Log.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive")); - } catch (RemoteException ex) { - // the end is nigh - return false; - } - } - - @Override - protected void setAreThereNotifications() { - if (mNotificationPanel != null) { - mNotificationPanel.setClearable(isDeviceProvisioned() && mNotificationData.hasClearableItems()); - } - } - - private View.OnClickListener mOnClickListener = new View.OnClickListener() { - public void onClick(View v) { - if (v == mRecentButton) { - onClickRecentButton(); - } else if (v == mInputMethodSwitchButton) { - onClickInputMethodSwitchButton(); - } else if (v == mCompatModeButton) { - onClickCompatModeButton(); - } - } - }; - - public void onClickRecentButton() { - if (DEBUG) Log.d(TAG, "clicked recent apps; disabled=" + mDisabled); - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { - toggleRecentApps(); - } - } - - public void onClickInputMethodSwitchButton() { - if (DEBUG) Log.d(TAG, "clicked input methods panel; disabled=" + mDisabled); - int msg = (mInputMethodsPanel.getVisibility() == View.GONE) ? - MSG_OPEN_INPUT_METHODS_PANEL : MSG_CLOSE_INPUT_METHODS_PANEL; - mHandler.removeMessages(msg); - mHandler.sendEmptyMessage(msg); - } - - public void onClickCompatModeButton() { - int msg = (mCompatModePanel.getVisibility() == View.GONE) ? - MSG_OPEN_COMPAT_MODE_PANEL : MSG_CLOSE_COMPAT_MODE_PANEL; - mHandler.removeMessages(msg); - mHandler.sendEmptyMessage(msg); - } - - private class NotificationTriggerTouchListener implements View.OnTouchListener { - VelocityTracker mVT; - float mInitialTouchX, mInitialTouchY; - int mTouchSlop; - - public NotificationTriggerTouchListener() { - mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); - } - - private Runnable mHiliteOnR = new Runnable() { public void run() { - mNotificationArea.setBackgroundResource( - com.android.internal.R.drawable.list_selector_pressed_holo_dark); - }}; - public void hilite(final boolean on) { - if (on) { - mNotificationArea.postDelayed(mHiliteOnR, 100); - } else { - mNotificationArea.removeCallbacks(mHiliteOnR); - mNotificationArea.setBackground(null); - } - } - - public boolean onTouch(View v, MotionEvent event) { -// Log.d(TAG, String.format("touch: (%.1f, %.1f) initial: (%.1f, %.1f)", -// event.getX(), -// event.getY(), -// mInitialTouchX, -// mInitialTouchY)); - - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { - return true; - } - - final int action = event.getAction(); - switch (action) { - case MotionEvent.ACTION_DOWN: - mVT = VelocityTracker.obtain(); - mInitialTouchX = event.getX(); - mInitialTouchY = event.getY(); - hilite(true); - // fall through - case MotionEvent.ACTION_OUTSIDE: - case MotionEvent.ACTION_MOVE: - // check for fling - if (mVT != null) { - mVT.addMovement(event); - mVT.computeCurrentVelocity(1000); // pixels per second - // require a little more oomph once we're already in peekaboo mode - if (mVT.getYVelocity() < -mNotificationFlingVelocity) { - animateExpandNotificationsPanel(); - visibilityChanged(true); - hilite(false); - mVT.recycle(); - mVT = null; - } - } - return true; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - hilite(false); - if (mVT != null) { - if (action == MotionEvent.ACTION_UP - // was this a sloppy tap? - && Math.abs(event.getX() - mInitialTouchX) < mTouchSlop - && Math.abs(event.getY() - mInitialTouchY) < (mTouchSlop / 3) - // dragging off the bottom doesn't count - && (int)event.getY() < v.getBottom()) { - animateExpandNotificationsPanel(); - visibilityChanged(true); - v.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); - v.playSoundEffect(SoundEffectConstants.CLICK); - } - - mVT.recycle(); - mVT = null; - return true; - } - } - return false; - } - } - - public void resetNotificationPeekFadeTimer() { - if (DEBUG) { - Log.d(TAG, "setting peek fade timer for " + NOTIFICATION_PEEK_FADE_DELAY - + "ms from now"); - } - mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PEEK); - mHandler.sendEmptyMessageDelayed(MSG_CLOSE_NOTIFICATION_PEEK, - NOTIFICATION_PEEK_FADE_DELAY); - } - - private void reloadAllNotificationIcons() { - if (mIconLayout == null) return; - mIconLayout.removeAllViews(); - updateNotificationIcons(); - } - - @Override - protected void updateNotificationIcons() { - // XXX: need to implement a new limited linear layout class - // to avoid removing & readding everything - - if (mIconLayout == null) return; - - // first, populate the main notification panel - loadNotificationPanel(); - - final LinearLayout.LayoutParams params - = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mNaturalBarHeight); - - // alternate behavior in DND mode - if (mNotificationDNDMode) { - if (mIconLayout.getChildCount() == 0) { - final Notification dndNotification = new Notification.Builder(mContext) - .setContentTitle(mContext.getText(R.string.notifications_off_title)) - .setContentText(mContext.getText(R.string.notifications_off_text)) - .setSmallIcon(R.drawable.ic_notification_dnd) - .setOngoing(true) - .getNotification(); - - final StatusBarIconView iconView = new StatusBarIconView(mContext, "_dnd", - dndNotification); - iconView.setImageResource(R.drawable.ic_notification_dnd); - iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - iconView.setPadding(mIconHPadding, 0, mIconHPadding, 0); - - mNotificationDNDDummyEntry = new NotificationData.Entry( - null, new StatusBarNotification("", 0, "", 0, 0, Notification.PRIORITY_MAX, - dndNotification, android.os.Process.myUserHandle()), iconView); - - mIconLayout.addView(iconView, params); - } - - return; - } else if (0 != (mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS)) { - // if icons are disabled but we're not in DND mode, this is probably Setup and we should - // just leave the area totally empty - return; - } - - int N = mNotificationData.size(); - - if (DEBUG) { - Log.d(TAG, "refreshing icons: " + N + " notifications, mIconLayout=" + mIconLayout); - } - - ArrayList toShow = new ArrayList(); - - // Extra Special Icons - // The IME switcher and compatibility mode icons take the place of notifications. You didn't - // need to see all those new emails, did you? - int maxNotificationIconsCount = mMaxNotificationIcons; - if (mInputMethodSwitchButton.getVisibility() != View.GONE) maxNotificationIconsCount --; - if (mCompatModeButton.getVisibility() != View.GONE) maxNotificationIconsCount --; - - final boolean provisioned = isDeviceProvisioned(); - // If the device hasn't been through Setup, we only show system notifications - for (int i=0; toShow.size()< maxNotificationIconsCount; i++) { - if (i >= N) break; - Entry ent = mNotificationData.get(N-i-1); - if ((provisioned && ent.notification.getScore() >= HIDE_ICONS_BELOW_SCORE) - || showNotificationEvenIfUnprovisioned(ent.notification)) { - toShow.add(ent.icon); - } - } - - ArrayList toRemove = new ArrayList(); - for (int i=0; i toShow = new ArrayList(); - - final boolean provisioned = isDeviceProvisioned(); - // If the device hasn't been through Setup, we only show system notifications - for (int i=0; i toRemove = new ArrayList(); - for (int i=0; i= l && x < r && y >= t && y < b; - } - - public void setHandler(Handler h) { - mHandler = h; - } - - /** - * Let the status bar know that if you tap on ignore while panel is showing, don't do anything. - * - * Debounces taps on, say, a popup's trigger when the popup is already showing. - */ - public void setIgnoreChildren(int index, View ignore, View panel) { - mIgnoreChildren[index] = ignore; - mPanels[index] = panel; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java deleted file mode 100644 index 167f03ca95d0f..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (C) 2010 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.tablet; - -import android.animation.LayoutTransition; -import android.app.Notification; -import android.app.PendingIntent; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.PixelFormat; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.service.notification.StatusBarNotification; -import android.util.Log; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.internal.statusbar.StatusBarIcon; -import com.android.systemui.R; -import com.android.systemui.statusbar.StatusBarIconView; - -import java.util.Arrays; - -public class TabletTicker - extends Handler - implements LayoutTransition.TransitionListener { - - private static final String TAG = "StatusBar.TabletTicker"; - - private static final boolean CLICKABLE_TICKER = true; - - // 3 is enough to let us see most cases, but not get so far behind that it's too annoying. - private static final int QUEUE_LENGTH = 3; - - private static final int MSG_ADVANCE = 1; - - private static final int ADVANCE_DELAY = 5000; // 5 seconds - - private final Context mContext; - private final WindowManager mWindowManager; - - private ViewGroup mWindow; - private IBinder mCurrentKey; - private StatusBarNotification mCurrentNotification; - private View mCurrentView; - - private IBinder[] mKeys = new IBinder[QUEUE_LENGTH]; - private StatusBarNotification[] mQueue = new StatusBarNotification[QUEUE_LENGTH]; - private int mQueuePos; - - private final int mLargeIconHeight; - - private TabletStatusBar mBar; - - private LayoutTransition mLayoutTransition; - private boolean mWindowShouldClose; - - public TabletTicker(TabletStatusBar bar) { - mBar = bar; - mContext = bar.getContext(); - mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); - final Resources res = mContext.getResources(); - mLargeIconHeight = res.getDimensionPixelSize( - android.R.dimen.notification_large_icon_height); - } - - public void add(IBinder key, StatusBarNotification notification) { - if (false) { - Log.d(TAG, "add 1 mCurrentNotification=" + mCurrentNotification - + " mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue)); - } - - // If it's already in here, remove whatever's in there and put the new one at the end. - remove(key, false); - - mKeys[mQueuePos] = key; - mQueue[mQueuePos] = notification; - - // If nothing is running now, start the next one. - if (mQueuePos == 0 && mCurrentNotification == null) { - sendEmptyMessage(MSG_ADVANCE); - } - - if (mQueuePos < QUEUE_LENGTH - 1) { - mQueuePos++; - } - } - - public void remove(IBinder key) { - remove(key, true); - } - - public void remove(IBinder key, boolean advance) { - if (mCurrentKey == key) { - // Showing now - if (advance) { - removeMessages(MSG_ADVANCE); - sendEmptyMessage(MSG_ADVANCE); - } - } else { - // In the queue - for (int i=0; i 0) { - mQueuePos--; - } - break; - } - } - } - } - - public void halt() { - removeMessages(MSG_ADVANCE); - if (mCurrentView != null || mQueuePos != 0) { - for (int i=0; i