1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
/*
* 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());
}
}
}
|