content: package com.lb.launcher;
  
  import android.animation.Animator;
  import android.animation.Animator.AnimatorListener;
  import android.animation.AnimatorListenerAdapter;
  import android.animation.ObjectAnimator;
  import android.content.ComponentName;
  import android.content.Intent;
  import android.graphics.Rect;
  import android.os.Bundle;
  import android.view.Menu;
  import android.view.View;
  import android.view.ViewGroup;
  import java.io.FileDescriptor;
  import java.io.PrintWriter;
  import java.util.ArrayList;
  import com.lb.launcher.R;
  
  /**
   * This class represents a very trivial LauncherExtension. It primarily serves as a simple
   * class to exercise the LauncherOverlay interface.
   */
  public class LauncherExtension extends Launcher {
  
      //------ Activity methods -------//
      @Override
      public void onCreate(Bundle savedInstanceState) {
          setLauncherCallbacks(new LauncherExtensionCallbacks());
          super.onCreate(savedInstanceState);
      }
  
      public class LauncherExtensionCallbacks implements LauncherCallbacks {
  
          LauncherExtensionOverlay mLauncherOverlay = new LauncherExtensionOverlay();
  
          @Override
          public void preOnCreate() {
          }
  
          @Override
          public void onCreate(Bundle savedInstanceState) {
          }
  
          @Override
          public void preOnResume() {
          }
  
          @Override
          public void onResume() {
          }
  
          @Override
          public void onStart() {
          }
  
          @Override
          public void onStop() {
          }
  
          @Override
          public void onPause() {
          }
  
          @Override
          public void onDestroy() {
          }
  
          @Override
          public void onSaveInstanceState(Bundle outState) {
          }
  
          @Override
          public void onPostCreate(Bundle savedInstanceState) {
          }
  
          @Override
          public void onNewIntent(Intent intent) {
          }
  
          @Override
          public void onActivityResult(int requestCode, int resultCode, Intent data) {
          }
  
          @Override
          public void onWindowFocusChanged(boolean hasFocus) {
          }
  
          @Override
          public boolean onPrepareOptionsMenu(Menu menu) {
              return false;
          }
  
          @Override
          public void dump(String prefix, FileDescriptor fd, PrintWriter w, String[] args) {
          }
  
          @Override
          public void onHomeIntent() {
          }
  
          @Override
          public boolean handleBackPressed() {
              if (mLauncherOverlay.isOverlayPanelShowing()) {
                  mLauncherOverlay.hideOverlayPanel();
                  return true;
              }
              return false;
          }
  
          @Override
          public void onLauncherProviderChange() {
          }
  
          @Override
          public void finishBindingItems(boolean upgradePath) {
          }
  
          @Override
          public void onClickAllAppsButton(View v) {
          }
  
          @Override
          public void bindAllApplications(ArrayList<AppInfo> apps) {
          }
  
          @Override
          public void onClickFolderIcon(View v) {
          }
  
          @Override
          public void onClickAppShortcut(View v) {
          }
  
          @Override
          public void onClickPagedViewIcon(View v) {
          }
  
          @Override
          public void onClickWallpaperPicker(View v) {
          }
  
          @Override
          public void onClickSettingsButton(View v) {
          }
  
          @Override
          public void onClickAddWidgetButton(View v) {
          }
  
          @Override
          public void onPageSwitch(View newPage, int newPageIndex) {
          }
  
          @Override
          public void onWorkspaceLockedChanged() {
          }
  
          @Override
          public void onDragStarted(View view) {
          }
  
          @Override
          public void onInteractionBegin() {
          }
  
          @Override
          public void onInteractionEnd() {
          }
  
          @Override
          public boolean forceDisableVoiceButtonProxy() {
              return false;
          }
  
          @Override
          public boolean providesSearch() {
              return true;
          }
  
          @Override
          public boolean startSearch(String initialQuery, boolean selectInitialQuery,
                  Bundle appSearchData, Rect sourceBounds) {
              return false;
          }
  
          @Override
          public void startVoice() {
          }
  
          @Override
          public boolean hasCustomContentToLeft() {
              return false;
          }
  
          @Override
          public void populateCustomContentContainer() {
          }
  
          @Override
          public View getQsbBar() {
              return mLauncherOverlay.getSearchBox();
          }
  
          @Override
          public Intent getFirstRunActivity() {
              return null;
          }
  
          @Override
          public boolean hasFirstRunActivity() {
              return false;
          }
  
          @Override
          public boolean hasDismissableIntroScreen() {
              return false;
          }
  
          @Override
          public View getIntroScreen() {
              return null;
          }
  
          @Override
          public boolean shouldMoveToDefaultScreenOnHomeIntent() {
              return true;
          }
  
          @Override
          public boolean hasSettings() {
              return false;
          }
  
          @Override
          public ComponentName getWallpaperPickerComponent() {
              return null;
          }
  
          @Override
          public boolean overrideWallpaperDimensions() {
              return false;
          }
  
          @Override
          public boolean isLauncherPreinstalled() {
              return false;
          }
  
          @Override
          public boolean hasLauncherOverlay() {
              return true;
          }
  
          @Override
          public LauncherOverlay setLauncherOverlayView(InsettableFrameLayout container,
                  LauncherOverlayCallbacks callbacks) {
  
              mLauncherOverlay.setOverlayCallbacks(callbacks);
              mLauncherOverlay.setOverlayContainer(container);
  
              return mLauncherOverlay;
          }
  
          class LauncherExtensionOverlay implements LauncherOverlay {
              LauncherOverlayCallbacks mLauncherOverlayCallbacks;
              ViewGroup mOverlayView;
              View mSearchBox;
              View mSearchOverlay;
              boolean mShowOverlayFeedback;
              int mProgress;
              boolean mOverlayPanelShowing;
  
              @Override
              public void onScrollInteractionBegin() {
                  if (mLauncherOverlayCallbacks.canEnterFullImmersion()) {
                      mShowOverlayFeedback = true;
                      updatePanelOffset(0);
                      mSearchOverlay.setVisibility(View.VISIBLE);
                      mSearchOverlay.setLayerType(View.LAYER_TYPE_HARDWARE, null);
                  }
              }
  
              @Override
              public void onScrollChange(int progress, boolean rtl) {
                  mProgress = progress;
                  if (mShowOverlayFeedback) {
                      updatePanelOffset(progress);
                  }
              }
  
              private void updatePanelOffset(int progress) {
                  int panelWidth = mSearchOverlay.getMeasuredWidth();
                  int offset = (int) ((progress / 100f) * panelWidth);
                  mSearchOverlay.setTranslationX(- panelWidth + offset);
              }
  
              @Override
              public void onScrollInteractionEnd() {
                  if (mProgress > 25 && mLauncherOverlayCallbacks.enterFullImmersion()) {
                      ObjectAnimator oa = LauncherAnimUtils.ofFloat(mSearchOverlay, "translationX", 0);
                      oa.addListener(new AnimatorListenerAdapter() {
                          @Override
                          public void onAnimationEnd(Animator arg0) {
                              mSearchOverlay.setLayerType(View.LAYER_TYPE_NONE, null);
                          }
                      });
                      oa.start();
                      mOverlayPanelShowing = true;
                      mShowOverlayFeedback = false;
                  }
              }
  
              @Override
              public void onScrollSettled() {
                  if (mShowOverlayFeedback) {
                      mSearchOverlay.setVisibility(View.INVISIBLE);
                      mSearchOverlay.setLayerType(View.LAYER_TYPE_NONE, null);
                  }
                  mShowOverlayFeedback = false;
                  mProgress = 0;
              }
  
              public void hideOverlayPanel() {
                  mLauncherOverlayCallbacks.exitFullImmersion();
                  mSearchOverlay.setVisibility(View.INVISIBLE);
                  mOverlayPanelShowing = false;
              }
  
              public boolean isOverlayPanelShowing() {
                  return mOverlayPanelShowing;
              }
  
              @Override
              public void forceExitFullImmersion() {
                  hideOverlayPanel();
              }
  
              public void setOverlayContainer(InsettableFrameLayout container) {
                  mOverlayView = (ViewGroup) getLayoutInflater().inflate(
                          R.layout.launcher_overlay_example, container);
                  mSearchOverlay = mOverlayView.findViewById(R.id.search_overlay);
                  mSearchBox = mOverlayView.findViewById(R.id.search_box);
              }
  
              public View getSearchBox() {
                  return mSearchBox;
              }
  
              public void setOverlayCallbacks(LauncherOverlayCallbacks callbacks) {
                  mLauncherOverlayCallbacks = callbacks;
              }
          };
      }
  }
  