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