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}