| /* |
| * 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()); |
| } |
| } |
| } |