blob: 34492e4cae12ae37bd72aea04a46a1feba3505dd [file] [log] [blame]
package com.android.launcher3.testing;
import android.animation.Animator;
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 com.android.launcher3.AppInfo;
import com.android.launcher3.InsettableFrameLayout;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAnimUtils;
import com.android.launcher3.LauncherCallbacks;
import com.android.launcher3.R;
import com.android.launcher3.allapps.AllAppsSearchBarController;
import com.android.launcher3.util.ComponentKey;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
/**
* 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 onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
}
@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 onTrimMemory(int level) {
}
@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 AllAppsSearchBarController getAllAppsSearchBarController() {
return null;
}
@Override
public List<ComponentKey> getPredictedApps() {
return new ArrayList<>();
}
@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;
}
@Override
public void setLauncherSearchCallback(Object callbacks) {
// Do nothing
}
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;
}
};
}
}