13b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler/* 23b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * Copyright (C) 2011 The Android Open Source Project 33b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * 43b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 53b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * you may not use this file except in compliance with the License. 63b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * You may obtain a copy of the License at 73b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * 83b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 93b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * 103b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * Unless required by applicable law or agreed to in writing, software 113b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 123b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * See the License for the specific language governing permissions and 143b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler * limitations under the License. 153b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler */ 163b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 173b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerpackage com.android.systemui.statusbar.tablet; 183b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 193b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.app.ActivityManager; 203b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.content.Context; 213b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.content.res.TypedArray; 223b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.os.RemoteException; 233b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.util.AttributeSet; 243b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.util.Slog; 256179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.MotionEvent; 263b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.view.View; 273b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.widget.FrameLayout; 283b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.widget.ImageView; 293b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.widget.RadioButton; 303b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport android.widget.RadioGroup; 313b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 323b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerimport com.android.systemui.R; 333b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 343b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandlerpublic class CompatModePanel extends FrameLayout implements StatusBarPanel, 353b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler View.OnClickListener { 363b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private static final boolean DEBUG = TabletStatusBar.DEBUG; 373b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private static final String TAG = "CompatModePanel"; 383b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 393b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private ActivityManager mAM; 403b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 413b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private boolean mAttached = false; 423b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private Context mContext; 433b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private RadioButton mOnButton, mOffButton; 443b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 453b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private View mTrigger; 463b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler// private InputMethodButton mInputMethodSwitchButton; 473b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 483b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler public CompatModePanel(Context context, AttributeSet attrs) { 493b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler super(context, attrs); 503b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mContext = context; 513b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mAM = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 523b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 533b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 543b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler @Override 553b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler public void onFinishInflate() { 563b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mOnButton = (RadioButton) findViewById(R.id.compat_mode_on_radio); 573b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mOffButton = (RadioButton) findViewById(R.id.compat_mode_off_radio); 583b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mOnButton.setOnClickListener(this); 593b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mOffButton.setOnClickListener(this); 603b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 613b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler refresh(); 623b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 633b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 643b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler @Override 653b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler protected void onDetachedFromWindow() { 663b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler super.onDetachedFromWindow(); 673b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler if (mAttached) { 683b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mAttached = false; 693b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 703b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 713b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 723b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler @Override 733b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler protected void onAttachedToWindow() { 743b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler super.onAttachedToWindow(); 753b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler if (!mAttached) { 763b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mAttached = true; 773b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 783b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 793b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 803b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler @Override 813b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler public void onClick(View v) { 823b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler if (v == mOnButton) { 833b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_ENABLED); 843b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } else if (v == mOffButton) { 853b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_DISABLED); 863b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 873b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 883b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 893b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler @Override 903b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler public boolean isInContentArea(int x, int y) { 913b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler return false; 923b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 933b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 946179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 956179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov public boolean dispatchHoverEvent(MotionEvent event) { 966179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov // Ignore hover events outside of this panel bounds since such events 976179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov // generate spurious accessibility events with the panel content when 986179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov // tapping outside of it, thus confusing the user. 996179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov final int x = (int) event.getX(); 1006179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov final int y = (int) event.getY(); 1016179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) { 1026179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov return super.dispatchHoverEvent(event); 1036179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 1046179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov return true; 1056179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 1066179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov 1073b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler public void setTrigger(View v) { 1083b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mTrigger = v; 1093b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 1103b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 1113b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler public void openPanel() { 1123b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler setVisibility(View.VISIBLE); 1133b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler if (mTrigger != null) mTrigger.setSelected(true); 1143b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler refresh(); 1153b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 1163b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 1173b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler public void closePanel() { 1183b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler setVisibility(View.GONE); 1193b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler if (mTrigger != null) mTrigger.setSelected(false); 1203b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 1213b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler 1223b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private void refresh() { 1233b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler int mode = mAM.getFrontActivityScreenCompatMode(); 124ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn if (mode == ActivityManager.COMPAT_MODE_ALWAYS 125ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn || mode == ActivityManager.COMPAT_MODE_NEVER) { 126ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn // No longer have something to switch. 127ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn closePanel(); 128ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn return; 129ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn } 1303b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler final boolean on = (mode == ActivityManager.COMPAT_MODE_ENABLED); 1313b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mOnButton.setChecked(on); 1323b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler mOffButton.setChecked(!on); 1333b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler } 1343b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler} 135