blob: 452830d3b5fd5999dc92d195418dcb7f1fc17803 [file] [log] [blame]
/*
* Copyright (C) 2014 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.recents.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Pair;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.SeekBar;
import com.android.systemui.R;
import com.android.systemui.recents.RecentsConfiguration;
import java.util.ArrayList;
/**
* A full screen overlay layer that allows us to draw views from throughout the system on the top
* most layer.
*/
public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarChangeListener {
public interface DebugOverlayViewCallbacks {
public void onPrimarySeekBarChanged(float progress);
public void onSecondarySeekBarChanged(float progress);
}
final static int sCornerRectSize = 50;
RecentsConfiguration mConfig;
DebugOverlayViewCallbacks mCb;
ArrayList<Pair<Rect, Integer>> mRects = new ArrayList<Pair<Rect, Integer>>();
String mText;
Paint mDebugOutline = new Paint();
Paint mTmpPaint = new Paint();
Rect mTmpRect = new Rect();
boolean mEnabled = true;
SeekBar mPrimarySeekBar;
SeekBar mSecondarySeekBar;
public DebugOverlayView(Context context) {
this(context, null);
}
public DebugOverlayView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DebugOverlayView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public DebugOverlayView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mConfig = RecentsConfiguration.getInstance();
mDebugOutline.setColor(0xFFff0000);
mDebugOutline.setStyle(Paint.Style.STROKE);
mDebugOutline.setStrokeWidth(8f);
setWillNotDraw(false);
}
public void setCallbacks(DebugOverlayViewCallbacks cb) {
mCb = cb;
}
@Override
protected void onFinishInflate() {
mPrimarySeekBar = (SeekBar) findViewById(R.id.debug_seek_bar_1);
mPrimarySeekBar.setOnSeekBarChangeListener(this);
mSecondarySeekBar = (SeekBar) findViewById(R.id.debug_seek_bar_2);
mSecondarySeekBar.setOnSeekBarChangeListener(this);
}
/** Enables the debug overlay drawing. */
public void enable() {
mEnabled = true;
setVisibility(View.VISIBLE);
}
/** Disables the debug overlay drawing. */
public void disable() {
mEnabled = false;
setVisibility(View.GONE);
}
/** Clears all debug rects. */
public void clear() {
mRects.clear();
}
/** Adds a rect to be drawn. */
void addRect(Rect r, int color) {
mRects.add(new Pair<Rect, Integer>(r, color));
invalidate();
}
/** Adds a view's global rect to be drawn. */
void addViewRect(View v, int color) {
Rect vr = new Rect();
v.getGlobalVisibleRect(vr);
mRects.add(new Pair<Rect, Integer>(vr, color));
invalidate();
}
/** Adds a rect, relative to a given view to be drawn. */
void addRectRelativeToView(View v, Rect r, int color) {
Rect vr = new Rect();
v.getGlobalVisibleRect(vr);
r.offsetTo(vr.left, vr.top);
mRects.add(new Pair<Rect, Integer>(r, color));
invalidate();
}
/** Sets the debug text at the bottom of the screen. */
void setText(String message) {
mText = message;
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
addRect(new Rect(0, 0, sCornerRectSize, sCornerRectSize), 0xFFff0000);
addRect(new Rect(getMeasuredWidth() - sCornerRectSize, getMeasuredHeight() - sCornerRectSize,
getMeasuredWidth(), getMeasuredHeight()), 0xFFff0000);
}
@Override
protected void onDraw(Canvas canvas) {
if (mEnabled) {
// Draw the outline
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mDebugOutline);
// Draw the rects
int numRects = mRects.size();
for (int i = 0; i < numRects; i++) {
Pair<Rect, Integer> r = mRects.get(i);
mTmpPaint.setColor(r.second);
canvas.drawRect(r.first, mTmpPaint);
}
// Draw the text
if (mText != null && mText.length() > 0) {
mTmpPaint.setColor(0xFFff0000);
mTmpPaint.setTextSize(60);
mTmpPaint.getTextBounds(mText, 0, 1, mTmpRect);
canvas.drawText(mText, 10f, getMeasuredHeight() - mTmpRect.height() - mConfig.systemInsets.bottom, mTmpPaint);
}
}
}
/**** SeekBar.OnSeekBarChangeListener Implementation ****/
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Do nothing
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Do nothing
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (seekBar == mPrimarySeekBar) {
mCb.onPrimarySeekBarChanged((float) progress / mPrimarySeekBar.getMax());
} else if (seekBar == mSecondarySeekBar) {
mCb.onSecondarySeekBarChanged((float) progress / mSecondarySeekBar.getMax());
}
}
}