1package com.android.launcher3.testing;
2
3import android.animation.Animator;
4import android.animation.AnimatorListenerAdapter;
5import android.animation.ObjectAnimator;
6import android.content.ComponentName;
7import android.content.Intent;
8import android.graphics.Rect;
9import android.os.Bundle;
10import android.view.Menu;
11import android.view.View;
12import android.view.ViewGroup;
13
14import com.android.launcher3.AppInfo;
15import com.android.launcher3.InsettableFrameLayout;
16import com.android.launcher3.Launcher;
17import com.android.launcher3.LauncherAnimUtils;
18import com.android.launcher3.LauncherCallbacks;
19import com.android.launcher3.R;
20import com.android.launcher3.allapps.AllAppsSearchBarController;
21import com.android.launcher3.util.ComponentKey;
22
23import java.io.FileDescriptor;
24import java.io.PrintWriter;
25import java.util.ArrayList;
26import java.util.List;
27
28/**
29 * This class represents a very trivial LauncherExtension. It primarily serves as a simple
30 * class to exercise the LauncherOverlay interface.
31 */
32public class LauncherExtension extends Launcher {
33
34    //------ Activity methods -------//
35    @Override
36    public void onCreate(Bundle savedInstanceState) {
37        setLauncherCallbacks(new LauncherExtensionCallbacks());
38        super.onCreate(savedInstanceState);
39    }
40
41    public class LauncherExtensionCallbacks implements LauncherCallbacks {
42
43        LauncherExtensionOverlay mLauncherOverlay = new LauncherExtensionOverlay();
44
45        @Override
46        public void preOnCreate() {
47        }
48
49        @Override
50        public void onCreate(Bundle savedInstanceState) {
51        }
52
53        @Override
54        public void preOnResume() {
55        }
56
57        @Override
58        public void onResume() {
59        }
60
61        @Override
62        public void onStart() {
63        }
64
65        @Override
66        public void onStop() {
67        }
68
69        @Override
70        public void onPause() {
71        }
72
73        @Override
74        public void onDestroy() {
75        }
76
77        @Override
78        public void onSaveInstanceState(Bundle outState) {
79        }
80
81        @Override
82        public void onPostCreate(Bundle savedInstanceState) {
83        }
84
85        @Override
86        public void onNewIntent(Intent intent) {
87        }
88
89        @Override
90        public void onActivityResult(int requestCode, int resultCode, Intent data) {
91        }
92
93        @Override
94        public void onRequestPermissionsResult(int requestCode, String[] permissions,
95                int[] grantResults) {
96        }
97
98        @Override
99        public void onWindowFocusChanged(boolean hasFocus) {
100        }
101
102        @Override
103        public boolean onPrepareOptionsMenu(Menu menu) {
104            return false;
105        }
106
107        @Override
108        public void dump(String prefix, FileDescriptor fd, PrintWriter w, String[] args) {
109        }
110
111        @Override
112        public void onHomeIntent() {
113        }
114
115        @Override
116        public boolean handleBackPressed() {
117            if (mLauncherOverlay.isOverlayPanelShowing()) {
118                mLauncherOverlay.hideOverlayPanel();
119                return true;
120            }
121            return false;
122        }
123
124        @Override
125        public void onTrimMemory(int level) {
126        }
127
128        @Override
129        public void onLauncherProviderChange() {
130        }
131
132        @Override
133        public void finishBindingItems(boolean upgradePath) {
134        }
135
136        @Override
137        public void onClickAllAppsButton(View v) {
138        }
139
140        @Override
141        public void bindAllApplications(ArrayList<AppInfo> apps) {
142        }
143
144        @Override
145        public void onClickFolderIcon(View v) {
146        }
147
148        @Override
149        public void onClickAppShortcut(View v) {
150        }
151
152        @Override
153        public void onClickPagedViewIcon(View v) {
154        }
155
156        @Override
157        public void onClickWallpaperPicker(View v) {
158        }
159
160        @Override
161        public void onClickSettingsButton(View v) {
162        }
163
164        @Override
165        public void onClickAddWidgetButton(View v) {
166        }
167
168        @Override
169        public void onPageSwitch(View newPage, int newPageIndex) {
170        }
171
172        @Override
173        public void onWorkspaceLockedChanged() {
174        }
175
176        @Override
177        public void onDragStarted(View view) {
178        }
179
180        @Override
181        public void onInteractionBegin() {
182        }
183
184        @Override
185        public void onInteractionEnd() {
186        }
187
188        @Override
189        public boolean forceDisableVoiceButtonProxy() {
190            return false;
191        }
192
193        @Override
194        public boolean providesSearch() {
195            return true;
196        }
197
198        @Override
199        public boolean startSearch(String initialQuery, boolean selectInitialQuery,
200                Bundle appSearchData, Rect sourceBounds) {
201            return false;
202        }
203
204        @Override
205        public void startVoice() {
206        }
207
208        @Override
209        public boolean hasCustomContentToLeft() {
210            return false;
211        }
212
213        @Override
214        public void populateCustomContentContainer() {
215        }
216
217        @Override
218        public View getQsbBar() {
219            return mLauncherOverlay.getSearchBox();
220        }
221
222        @Override
223        public Intent getFirstRunActivity() {
224            return null;
225        }
226
227        @Override
228        public boolean hasFirstRunActivity() {
229            return false;
230        }
231
232        @Override
233        public boolean hasDismissableIntroScreen() {
234            return false;
235        }
236
237        @Override
238        public View getIntroScreen() {
239            return null;
240        }
241
242        @Override
243        public boolean shouldMoveToDefaultScreenOnHomeIntent() {
244            return true;
245        }
246
247        @Override
248        public boolean hasSettings() {
249            return false;
250        }
251
252        @Override
253        public ComponentName getWallpaperPickerComponent() {
254            return null;
255        }
256
257        @Override
258        public boolean overrideWallpaperDimensions() {
259            return false;
260        }
261
262        @Override
263        public AllAppsSearchBarController getAllAppsSearchBarController() {
264            return null;
265        }
266
267        @Override
268        public List<ComponentKey> getPredictedApps() {
269            return new ArrayList<>();
270        }
271
272        @Override
273        public boolean isLauncherPreinstalled() {
274            return false;
275        }
276
277        @Override
278        public boolean hasLauncherOverlay() {
279            return true;
280        }
281
282        @Override
283        public LauncherOverlay setLauncherOverlayView(InsettableFrameLayout container,
284                LauncherOverlayCallbacks callbacks) {
285
286            mLauncherOverlay.setOverlayCallbacks(callbacks);
287            mLauncherOverlay.setOverlayContainer(container);
288
289            return mLauncherOverlay;
290        }
291
292        @Override
293        public void setLauncherSearchCallback(Object callbacks) {
294            // Do nothing
295        }
296
297        class LauncherExtensionOverlay implements LauncherOverlay {
298            LauncherOverlayCallbacks mLauncherOverlayCallbacks;
299            ViewGroup mOverlayView;
300            View mSearchBox;
301            View mSearchOverlay;
302            boolean mShowOverlayFeedback;
303            int mProgress;
304            boolean mOverlayPanelShowing;
305
306            @Override
307            public void onScrollInteractionBegin() {
308                if (mLauncherOverlayCallbacks.canEnterFullImmersion()) {
309                    mShowOverlayFeedback = true;
310                    updatePanelOffset(0);
311                    mSearchOverlay.setVisibility(View.VISIBLE);
312                    mSearchOverlay.setLayerType(View.LAYER_TYPE_HARDWARE, null);
313                }
314            }
315
316            @Override
317            public void onScrollChange(int progress, boolean rtl) {
318                mProgress = progress;
319                if (mShowOverlayFeedback) {
320                    updatePanelOffset(progress);
321                }
322            }
323
324            private void updatePanelOffset(int progress) {
325                int panelWidth = mSearchOverlay.getMeasuredWidth();
326                int offset = (int) ((progress / 100f) * panelWidth);
327                mSearchOverlay.setTranslationX(- panelWidth + offset);
328            }
329
330            @Override
331            public void onScrollInteractionEnd() {
332                if (mProgress > 25 && mLauncherOverlayCallbacks.enterFullImmersion()) {
333                    ObjectAnimator oa = LauncherAnimUtils.ofFloat(mSearchOverlay, "translationX", 0);
334                    oa.addListener(new AnimatorListenerAdapter() {
335                        @Override
336                        public void onAnimationEnd(Animator arg0) {
337                            mSearchOverlay.setLayerType(View.LAYER_TYPE_NONE, null);
338                        }
339                    });
340                    oa.start();
341                    mOverlayPanelShowing = true;
342                    mShowOverlayFeedback = false;
343                }
344            }
345
346            @Override
347            public void onScrollSettled() {
348                if (mShowOverlayFeedback) {
349                    mSearchOverlay.setVisibility(View.INVISIBLE);
350                    mSearchOverlay.setLayerType(View.LAYER_TYPE_NONE, null);
351                }
352                mShowOverlayFeedback = false;
353                mProgress = 0;
354            }
355
356            public void hideOverlayPanel() {
357                mLauncherOverlayCallbacks.exitFullImmersion();
358                mSearchOverlay.setVisibility(View.INVISIBLE);
359                mOverlayPanelShowing = false;
360            }
361
362            public boolean isOverlayPanelShowing() {
363                return mOverlayPanelShowing;
364            }
365
366            @Override
367            public void forceExitFullImmersion() {
368                hideOverlayPanel();
369            }
370
371            public void setOverlayContainer(InsettableFrameLayout container) {
372                mOverlayView = (ViewGroup) getLayoutInflater().inflate(
373                        R.layout.launcher_overlay_example, container);
374                mSearchOverlay = mOverlayView.findViewById(R.id.search_overlay);
375                mSearchBox = mOverlayView.findViewById(R.id.search_box);
376            }
377
378            public View getSearchBox() {
379                return mSearchBox;
380            }
381
382            public void setOverlayCallbacks(LauncherOverlayCallbacks callbacks) {
383                mLauncherOverlayCallbacks = callbacks;
384            }
385        };
386    }
387}
388