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