1 /*
2  * Copyright (C) 2014 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 
17 package androidx.appcompat.view;
18 
19 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
20 
21 import android.view.ActionMode;
22 import android.view.KeyEvent;
23 import android.view.KeyboardShortcutGroup;
24 import android.view.Menu;
25 import android.view.MenuItem;
26 import android.view.MotionEvent;
27 import android.view.SearchEvent;
28 import android.view.View;
29 import android.view.Window;
30 import android.view.WindowManager;
31 import android.view.accessibility.AccessibilityEvent;
32 
33 import androidx.annotation.RequiresApi;
34 import androidx.annotation.RestrictTo;
35 
36 import java.util.List;
37 
38 /**
39  * A simple decorator stub for Window.Callback that passes through any calls
40  * to the wrapped instance as a base implementation. Call super.foo() to call into
41  * the wrapped callback for any subclasses.
42  *
43  */
44 @RestrictTo(LIBRARY_GROUP_PREFIX)
45 public class WindowCallbackWrapper implements Window.Callback {
46 
47     final Window.Callback mWrapped;
48 
WindowCallbackWrapper(Window.Callback wrapped)49     public WindowCallbackWrapper(Window.Callback wrapped) {
50         if (wrapped == null) {
51             throw new IllegalArgumentException("Window callback may not be null");
52         }
53         mWrapped = wrapped;
54     }
55 
56     @Override
dispatchKeyEvent(KeyEvent event)57     public boolean dispatchKeyEvent(KeyEvent event) {
58         return mWrapped.dispatchKeyEvent(event);
59     }
60 
61     @Override
dispatchKeyShortcutEvent(KeyEvent event)62     public boolean dispatchKeyShortcutEvent(KeyEvent event) {
63         return mWrapped.dispatchKeyShortcutEvent(event);
64     }
65 
66     @Override
dispatchTouchEvent(MotionEvent event)67     public boolean dispatchTouchEvent(MotionEvent event) {
68         return mWrapped.dispatchTouchEvent(event);
69     }
70 
71     @Override
dispatchTrackballEvent(MotionEvent event)72     public boolean dispatchTrackballEvent(MotionEvent event) {
73         return mWrapped.dispatchTrackballEvent(event);
74     }
75 
76     @Override
dispatchGenericMotionEvent(MotionEvent event)77     public boolean dispatchGenericMotionEvent(MotionEvent event) {
78         return mWrapped.dispatchGenericMotionEvent(event);
79     }
80 
81     @Override
dispatchPopulateAccessibilityEvent(AccessibilityEvent event)82     public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
83         return mWrapped.dispatchPopulateAccessibilityEvent(event);
84     }
85 
86     @Override
onCreatePanelView(int featureId)87     public View onCreatePanelView(int featureId) {
88         return mWrapped.onCreatePanelView(featureId);
89     }
90 
91     @Override
onCreatePanelMenu(int featureId, Menu menu)92     public boolean onCreatePanelMenu(int featureId, Menu menu) {
93         return mWrapped.onCreatePanelMenu(featureId, menu);
94     }
95 
96     @Override
onPreparePanel(int featureId, View view, Menu menu)97     public boolean onPreparePanel(int featureId, View view, Menu menu) {
98         return mWrapped.onPreparePanel(featureId, view, menu);
99     }
100 
101     @Override
onMenuOpened(int featureId, Menu menu)102     public boolean onMenuOpened(int featureId, Menu menu) {
103         return mWrapped.onMenuOpened(featureId, menu);
104     }
105 
106     @Override
onMenuItemSelected(int featureId, MenuItem item)107     public boolean onMenuItemSelected(int featureId, MenuItem item) {
108         return mWrapped.onMenuItemSelected(featureId, item);
109     }
110 
111     @Override
onWindowAttributesChanged(WindowManager.LayoutParams attrs)112     public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) {
113         mWrapped.onWindowAttributesChanged(attrs);
114     }
115 
116     @Override
onContentChanged()117     public void onContentChanged() {
118         mWrapped.onContentChanged();
119     }
120 
121     @Override
onWindowFocusChanged(boolean hasFocus)122     public void onWindowFocusChanged(boolean hasFocus) {
123         mWrapped.onWindowFocusChanged(hasFocus);
124     }
125 
126     @Override
onAttachedToWindow()127     public void onAttachedToWindow() {
128         mWrapped.onAttachedToWindow();
129     }
130 
131     @Override
onDetachedFromWindow()132     public void onDetachedFromWindow() {
133         mWrapped.onDetachedFromWindow();
134     }
135 
136     @Override
onPanelClosed(int featureId, Menu menu)137     public void onPanelClosed(int featureId, Menu menu) {
138         mWrapped.onPanelClosed(featureId, menu);
139     }
140 
141     @RequiresApi(23)
142     @Override
onSearchRequested(SearchEvent searchEvent)143     public boolean onSearchRequested(SearchEvent searchEvent) {
144         return Api23Impl.onSearchRequested(mWrapped, searchEvent);
145     }
146 
147     @Override
onSearchRequested()148     public boolean onSearchRequested() {
149         return mWrapped.onSearchRequested();
150     }
151 
152     @Override
onWindowStartingActionMode(ActionMode.Callback callback)153     public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
154         return mWrapped.onWindowStartingActionMode(callback);
155     }
156 
157     @RequiresApi(23)
158     @Override
onWindowStartingActionMode(ActionMode.Callback callback, int type)159     public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) {
160         return Api23Impl.onWindowStartingActionMode(mWrapped, callback, type);
161     }
162 
163     @Override
onActionModeStarted(ActionMode mode)164     public void onActionModeStarted(ActionMode mode) {
165         mWrapped.onActionModeStarted(mode);
166     }
167 
168     @Override
onActionModeFinished(ActionMode mode)169     public void onActionModeFinished(ActionMode mode) {
170         mWrapped.onActionModeFinished(mode);
171     }
172 
173     @RequiresApi(24)
174     @Override
onProvideKeyboardShortcuts( List<KeyboardShortcutGroup> data, Menu menu, int deviceId)175     public void onProvideKeyboardShortcuts(
176             List<KeyboardShortcutGroup> data, Menu menu, int deviceId) {
177         Api24Impl.onProvideKeyboardShortcuts(mWrapped, data, menu, deviceId);
178     }
179 
180     @RequiresApi(26)
181     @Override
onPointerCaptureChanged(boolean hasCapture)182     public void onPointerCaptureChanged(boolean hasCapture) {
183         Api26Impl.onPointerCaptureChanged(mWrapped, hasCapture);
184     }
185 
getWrapped()186     public final Window.Callback getWrapped() {
187         return mWrapped;
188     }
189 
190     @RequiresApi(23)
191     static class Api23Impl {
Api23Impl()192         private Api23Impl() {
193             // This class is not instantiable.
194         }
195 
onSearchRequested(Window.Callback callback, SearchEvent searchEvent)196         static boolean onSearchRequested(Window.Callback callback, SearchEvent searchEvent) {
197             return callback.onSearchRequested(searchEvent);
198         }
199 
onWindowStartingActionMode(Window.Callback windowCallback, ActionMode.Callback actionModeCallback, int i)200         static ActionMode onWindowStartingActionMode(Window.Callback windowCallback,
201                 ActionMode.Callback actionModeCallback, int i) {
202             return windowCallback.onWindowStartingActionMode(actionModeCallback, i);
203         }
204     }
205 
206     @RequiresApi(24)
207     static class Api24Impl {
Api24Impl()208         private Api24Impl() {
209             // This class is not instantiable.
210         }
211 
onProvideKeyboardShortcuts(Window.Callback callback, List<KeyboardShortcutGroup> data, Menu menu, int deviceId)212         static void onProvideKeyboardShortcuts(Window.Callback callback,
213                 List<KeyboardShortcutGroup> data, Menu menu, int deviceId) {
214             callback.onProvideKeyboardShortcuts(data, menu, deviceId);
215         }
216 
217     }
218 
219     @RequiresApi(26)
220     static class Api26Impl {
Api26Impl()221         private Api26Impl() {
222             // This class is not instantiable.
223         }
224 
onPointerCaptureChanged(Window.Callback callback, boolean hasCapture)225         static void onPointerCaptureChanged(Window.Callback callback, boolean hasCapture) {
226             callback.onPointerCaptureChanged(hasCapture);
227         }
228 
229     }
230 }
231