Home | History | Annotate | Download | only in testing
      1 package com.android.launcher3.testing;
      2 
      3 import android.animation.Animator;
      4 import android.animation.AnimatorListenerAdapter;
      5 import android.animation.ObjectAnimator;
      6 import android.content.ComponentName;
      7 import android.content.Intent;
      8 import android.graphics.Rect;
      9 import android.os.Bundle;
     10 import android.view.Menu;
     11 import android.view.View;
     12 import android.view.ViewGroup;
     13 
     14 import com.android.launcher3.AppInfo;
     15 import com.android.launcher3.InsettableFrameLayout;
     16 import com.android.launcher3.Launcher;
     17 import com.android.launcher3.LauncherAnimUtils;
     18 import com.android.launcher3.LauncherCallbacks;
     19 import com.android.launcher3.R;
     20 import com.android.launcher3.allapps.AllAppsSearchBarController;
     21 import com.android.launcher3.util.ComponentKey;
     22 
     23 import java.io.FileDescriptor;
     24 import java.io.PrintWriter;
     25 import java.util.ArrayList;
     26 import 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  */
     32 public 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