1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.mediapicker.camerafocus; 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.graphics.Canvas; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.util.AttributeSet; 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.MotionEvent; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.View; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.FrameLayout; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.ArrayList; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.List; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class RenderOverlay extends FrameLayout { 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd interface Renderer { 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean handlesTouch(); 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean onTouchEvent(MotionEvent evt); 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setOverlay(RenderOverlay overlay); 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void layout(int left, int top, int right, int bottom); 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void draw(Canvas canvas); 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private RenderView mRenderView; 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private List<Renderer> mClients; 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // reverse list of touch clients 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private List<Renderer> mTouchClients; 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private int[] mPosition = new int[2]; 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public RenderOverlay(Context context, AttributeSet attrs) { 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(context, attrs); 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mRenderView = new RenderView(context); 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd addView(mRenderView, new LayoutParams(LayoutParams.MATCH_PARENT, 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LayoutParams.MATCH_PARENT)); 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mClients = new ArrayList<Renderer>(10); 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mTouchClients = new ArrayList<Renderer>(10); 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd setWillNotDraw(false); 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd addRenderer(new PieRenderer(context)); 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public PieRenderer getPieRenderer() { 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (Renderer renderer : mClients) { 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (renderer instanceof PieRenderer) { 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return (PieRenderer) renderer; 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void addRenderer(Renderer renderer) { 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mClients.add(renderer); 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd renderer.setOverlay(this); 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (renderer.handlesTouch()) { 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mTouchClients.add(0, renderer); 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd renderer.layout(getLeft(), getTop(), getRight(), getBottom()); 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void addRenderer(int pos, Renderer renderer) { 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mClients.add(pos, renderer); 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd renderer.setOverlay(this); 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd renderer.layout(getLeft(), getTop(), getRight(), getBottom()); 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void remove(Renderer renderer) { 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mClients.remove(renderer); 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd renderer.setOverlay(null); 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public int getClientSize() { 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mClients.size(); 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean dispatchTouchEvent(MotionEvent m) { 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return false; 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean directDispatchTouch(MotionEvent m, Renderer target) { 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mRenderView.setTouchTarget(target); 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean res = super.dispatchTouchEvent(m); 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mRenderView.setTouchTarget(null); 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return res; 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private void adjustPosition() { 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd getLocationInWindow(mPosition); 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public int getWindowPositionX() { 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mPosition[0]; 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public int getWindowPositionY() { 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mPosition[1]; 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void update() { 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mRenderView.invalidate(); 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private class RenderView extends View { 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private Renderer mTouchTarget; 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public RenderView(Context context) { 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(context); 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd setWillNotDraw(false); 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setTouchTarget(Renderer target) { 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mTouchTarget = target; 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean onTouchEvent(MotionEvent evt) { 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mTouchTarget != null) { 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mTouchTarget.onTouchEvent(evt); 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mTouchClients != null) { 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean res = false; 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (Renderer client : mTouchClients) { 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd res |= client.onTouchEvent(evt); 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return res; 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return false; 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onLayout(boolean changed, int left, int top, int right, int bottom) { 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd adjustPosition(); 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onLayout(changed, left, top, right, bottom); 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mClients == null) { 154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return; 155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (Renderer renderer : mClients) { 157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd renderer.layout(left, top, right, bottom); 158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void draw(Canvas canvas) { 163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.draw(canvas); 164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mClients == null) { 165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return; 166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean redraw = false; 168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (Renderer renderer : mClients) { 169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd renderer.draw(canvas); 170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd redraw = redraw || ((OverlayRenderer) renderer).isVisible(); 171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (redraw) { 173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd invalidate(); 174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}