/*
 * 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.app.ActivityManager;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.RadioButton;

import com.android.systemui.R;

public class CompatModePanel extends FrameLayout implements StatusBarPanel,
        View.OnClickListener {
    private static final boolean DEBUG = TabletStatusBar.DEBUG;
    private static final String TAG = "CompatModePanel";

    private ActivityManager mAM;

    private boolean mAttached = false;
    private Context mContext;
    private RadioButton mOnButton, mOffButton;

    private View mTrigger;
//    private InputMethodButton mInputMethodSwitchButton;

    public CompatModePanel(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mAM = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

    @Override
    public void onFinishInflate() {
        mOnButton  = (RadioButton) findViewById(R.id.compat_mode_on_radio);
        mOffButton = (RadioButton) findViewById(R.id.compat_mode_off_radio);
        mOnButton.setOnClickListener(this);
        mOffButton.setOnClickListener(this);

        refresh();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mAttached) {
            mAttached = false;
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (!mAttached) {
            mAttached = true;
        }
    }

    @Override
    public void onClick(View v) {
        if (v == mOnButton) {
            mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_ENABLED);
        } else if (v == mOffButton) {
            mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_DISABLED);
        }
    }

    @Override
    public boolean isInContentArea(int x, int y) {
        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;
    }

    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);
    }
}
