ViewGroupHelper.java revision f38d8fb9344954ed28ccaaee8e29dcd4d65f1fe0
1/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.media.update;
18
19import android.content.Context;
20import android.graphics.Canvas;
21import android.util.AttributeSet;
22import android.view.MotionEvent;
23import android.view.View;
24import android.view.ViewGroup;
25
26/**
27 * Helper class for connecting the public API to an updatable implementation.
28 *
29 * @see ViewGroupProvider
30 *
31 * @hide
32 */
33public abstract class ViewGroupHelper<T extends ViewGroupProvider> extends ViewGroup {
34    /** @hide */
35    final public T mProvider;
36
37    /** @hide */
38    public ViewGroupHelper(ProviderCreator<T> creator,
39            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
40        super(context, attrs, defStyleAttr, defStyleRes);
41
42        mProvider = creator.createProvider(this, new SuperProvider(),
43                new PrivateProvider());
44    }
45
46    /** @hide */
47    // TODO @SystemApi
48    public T getProvider() {
49        return mProvider;
50    }
51
52    @Override
53    protected void onAttachedToWindow() {
54        mProvider.onAttachedToWindow_impl();
55    }
56
57    @Override
58    protected void onDetachedFromWindow() {
59        mProvider.onDetachedFromWindow_impl();
60    }
61
62    @Override
63    public CharSequence getAccessibilityClassName() {
64        return mProvider.getAccessibilityClassName_impl();
65    }
66
67    @Override
68    public boolean onTouchEvent(MotionEvent ev) {
69        return mProvider.onTouchEvent_impl(ev);
70    }
71
72    @Override
73    public boolean onTrackballEvent(MotionEvent ev) {
74        return mProvider.onTrackballEvent_impl(ev);
75    }
76
77    @Override
78    public void onFinishInflate() {
79        mProvider.onFinishInflate_impl();
80    }
81
82    @Override
83    public void setEnabled(boolean enabled) {
84        mProvider.setEnabled_impl(enabled);
85    }
86
87    @Override
88    public void onVisibilityAggregated(boolean isVisible) {
89        mProvider.onVisibilityAggregated_impl(isVisible);
90    }
91
92    @Override
93    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
94        mProvider.onLayout_impl(changed, left, top, right, bottom);
95    }
96
97    @Override
98    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
99        mProvider.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
100    }
101
102    @Override
103    protected int getSuggestedMinimumWidth() {
104        return mProvider.getSuggestedMinimumWidth_impl();
105    }
106
107    @Override
108    protected int getSuggestedMinimumHeight() {
109        return mProvider.getSuggestedMinimumHeight_impl();
110    }
111
112    // setMeasuredDimension is final
113
114    @Override
115    protected boolean checkLayoutParams(LayoutParams p) {
116        return mProvider.checkLayoutParams_impl(p);
117    }
118
119    @Override
120    protected LayoutParams generateDefaultLayoutParams() {
121        return mProvider.generateDefaultLayoutParams_impl();
122    }
123
124    @Override
125    public LayoutParams generateLayoutParams(AttributeSet attrs) {
126        return mProvider.generateLayoutParams_impl(attrs);
127    }
128
129    @Override
130    protected LayoutParams generateLayoutParams(LayoutParams lp) {
131        return mProvider.generateLayoutParams_impl(lp);
132    }
133
134    @Override
135    public boolean shouldDelayChildPressedState() {
136        return mProvider.shouldDelayChildPressedState_impl();
137    }
138
139    @Override
140    protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
141            int parentHeightMeasureSpec, int heightUsed) {
142        mProvider.measureChildWithMargins_impl(child,
143                parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
144    }
145
146    /** @hide */
147    public class SuperProvider implements ViewGroupProvider {
148        @Override
149        public CharSequence getAccessibilityClassName_impl() {
150            return ViewGroupHelper.super.getAccessibilityClassName();
151        }
152
153        @Override
154        public boolean onTouchEvent_impl(MotionEvent ev) {
155            return ViewGroupHelper.super.onTouchEvent(ev);
156        }
157
158        @Override
159        public boolean onTrackballEvent_impl(MotionEvent ev) {
160            return ViewGroupHelper.super.onTrackballEvent(ev);
161        }
162
163        @Override
164        public void onFinishInflate_impl() {
165            ViewGroupHelper.super.onFinishInflate();
166        }
167
168        @Override
169        public void setEnabled_impl(boolean enabled) {
170            ViewGroupHelper.super.setEnabled(enabled);
171        }
172
173        @Override
174        public void onAttachedToWindow_impl() {
175            ViewGroupHelper.super.onAttachedToWindow();
176        }
177
178        @Override
179        public void onDetachedFromWindow_impl() {
180            ViewGroupHelper.super.onDetachedFromWindow();
181        }
182
183        @Override
184        public void onVisibilityAggregated_impl(boolean isVisible) {
185            ViewGroupHelper.super.onVisibilityAggregated(isVisible);
186        }
187
188        @Override
189        public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
190            // abstract method; no super
191        }
192
193        @Override
194        public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
195            ViewGroupHelper.super.onMeasure(widthMeasureSpec, heightMeasureSpec);
196        }
197
198        @Override
199        public int getSuggestedMinimumWidth_impl() {
200            return ViewGroupHelper.super.getSuggestedMinimumWidth();
201        }
202
203        @Override
204        public int getSuggestedMinimumHeight_impl() {
205            return ViewGroupHelper.super.getSuggestedMinimumHeight();
206        }
207
208        @Override
209        public void setMeasuredDimension_impl(int measuredWidth, int measuredHeight) {
210            ViewGroupHelper.super.setMeasuredDimension(measuredWidth, measuredHeight);
211        }
212
213        @Override
214        public boolean checkLayoutParams_impl(LayoutParams p) {
215            return ViewGroupHelper.super.checkLayoutParams(p);
216        }
217
218        @Override
219        public LayoutParams generateDefaultLayoutParams_impl() {
220            return ViewGroupHelper.super.generateDefaultLayoutParams();
221        }
222
223        @Override
224        public LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
225            return ViewGroupHelper.super.generateLayoutParams(attrs);
226        }
227
228        @Override
229        public LayoutParams generateLayoutParams_impl(LayoutParams lp) {
230            return ViewGroupHelper.super.generateLayoutParams(lp);
231        }
232
233        @Override
234        public boolean shouldDelayChildPressedState_impl() {
235            return ViewGroupHelper.super.shouldDelayChildPressedState();
236        }
237
238        @Override
239        public void measureChildWithMargins_impl(View child,
240                int parentWidthMeasureSpec, int widthUsed,
241                int parentHeightMeasureSpec, int heightUsed) {
242            ViewGroupHelper.super.measureChildWithMargins(child,
243                    parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
244        }
245    }
246
247    /** @hide */
248    public class PrivateProvider implements ViewGroupProvider {
249        @Override
250        public CharSequence getAccessibilityClassName_impl() {
251            return ViewGroupHelper.this.getAccessibilityClassName();
252        }
253
254        @Override
255        public boolean onTouchEvent_impl(MotionEvent ev) {
256            return ViewGroupHelper.this.onTouchEvent(ev);
257        }
258
259        @Override
260        public boolean onTrackballEvent_impl(MotionEvent ev) {
261            return ViewGroupHelper.this.onTrackballEvent(ev);
262        }
263
264        @Override
265        public void onFinishInflate_impl() {
266            ViewGroupHelper.this.onFinishInflate();
267        }
268
269        @Override
270        public void setEnabled_impl(boolean enabled) {
271            ViewGroupHelper.this.setEnabled(enabled);
272        }
273
274        @Override
275        public void onAttachedToWindow_impl() {
276            ViewGroupHelper.this.onAttachedToWindow();
277        }
278
279        @Override
280        public void onDetachedFromWindow_impl() {
281            ViewGroupHelper.this.onDetachedFromWindow();
282        }
283
284        @Override
285        public void onVisibilityAggregated_impl(boolean isVisible) {
286            ViewGroupHelper.this.onVisibilityAggregated(isVisible);
287        }
288
289        @Override
290        public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
291            ViewGroupHelper.this.onLayout(changed, left, top, right, bottom);
292        }
293
294        @Override
295        public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
296            ViewGroupHelper.this.onMeasure(widthMeasureSpec, heightMeasureSpec);
297        }
298
299        @Override
300        public int getSuggestedMinimumWidth_impl() {
301            return ViewGroupHelper.this.getSuggestedMinimumWidth();
302        }
303
304        @Override
305        public int getSuggestedMinimumHeight_impl() {
306            return ViewGroupHelper.this.getSuggestedMinimumHeight();
307        }
308
309        @Override
310        public void setMeasuredDimension_impl(int measuredWidth, int measuredHeight) {
311            ViewGroupHelper.this.setMeasuredDimension(measuredWidth, measuredHeight);
312        }
313
314        @Override
315        public boolean checkLayoutParams_impl(LayoutParams p) {
316            return ViewGroupHelper.this.checkLayoutParams(p);
317        }
318
319        @Override
320        public LayoutParams generateDefaultLayoutParams_impl() {
321            return ViewGroupHelper.this.generateDefaultLayoutParams();
322        }
323
324        @Override
325        public LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
326            return ViewGroupHelper.this.generateLayoutParams(attrs);
327        }
328
329        @Override
330        public LayoutParams generateLayoutParams_impl(LayoutParams lp) {
331            return ViewGroupHelper.this.generateLayoutParams(lp);
332        }
333
334        @Override
335        public boolean shouldDelayChildPressedState_impl() {
336            return ViewGroupHelper.this.shouldDelayChildPressedState();
337        }
338
339        @Override
340        public void measureChildWithMargins_impl(View child,
341                int parentWidthMeasureSpec, int widthUsed,
342                int parentHeightMeasureSpec, int heightUsed) {
343            ViewGroupHelper.this.measureChildWithMargins(child,
344                    parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
345        }
346    }
347
348        /** @hide */
349    @FunctionalInterface
350    public interface ProviderCreator<T extends ViewGroupProvider> {
351        T createProvider(ViewGroupHelper<T> instance, ViewGroupProvider superProvider,
352                ViewGroupProvider privateProvider);
353    }
354}
355