55616cd363
The search bar can now be be normal or tall. When it is set to tall, the hotseat and page indicators move down so that the workspace isn't compressed quite as much. Change-Id: Id92a946eab3a93524999f92efd847a501a95f002
426 lines
12 KiB
Java
426 lines
12 KiB
Java
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.Color;
|
|
import android.graphics.Rect;
|
|
import android.os.Bundle;
|
|
import android.view.Menu;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.FrameLayout;
|
|
|
|
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 boolean startSearchFromAllApps(String query) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void startVoice() {
|
|
}
|
|
|
|
CustomContentCallbacks mCustomContentCallbacks = new CustomContentCallbacks() {
|
|
|
|
// Custom content is completely shown. {@code fromResume} indicates whether this was caused
|
|
// by a onResume or by scrolling otherwise.
|
|
public void onShow(boolean fromResume) {
|
|
}
|
|
|
|
// Custom content is completely hidden
|
|
public void onHide() {
|
|
}
|
|
|
|
// Custom content scroll progress changed. From 0 (not showing) to 1 (fully showing).
|
|
public void onScrollProgressChanged(float progress) {
|
|
|
|
}
|
|
|
|
// Indicates whether the user is allowed to scroll away from the custom content.
|
|
public boolean isScrollingAllowed() {
|
|
return true;
|
|
}
|
|
|
|
};
|
|
|
|
@Override
|
|
public boolean hasCustomContentToLeft() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void populateCustomContentContainer() {
|
|
FrameLayout customContent = new FrameLayout(LauncherExtension.this);
|
|
customContent.setBackgroundColor(Color.GRAY);
|
|
addToCustomContentPage(customContent, mCustomContentCallbacks, "");
|
|
}
|
|
|
|
@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 int getSearchBarHeight() {
|
|
return SEARCH_BAR_HEIGHT_NORMAL;
|
|
}
|
|
|
|
@Override
|
|
public boolean isLauncherPreinstalled() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean hasLauncherOverlay() {
|
|
return false;
|
|
}
|
|
|
|
@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;
|
|
}
|
|
};
|
|
}
|
|
}
|