From 3ada0966559cd9fee535a40686e049cd0d6f15c0 Mon Sep 17 00:00:00 2001 From: Nebojsa Cvetkovic Date: Mon, 10 Nov 2014 10:35:00 -0800 Subject: PagedView: Transition Effects Conflicts: res/layout/overview_panel.xml res/values/cm_arrays.xml res/values/cm_strings.xml res/values/dimens.xml res/values/preferences_defaults.xml src/com/android/launcher3/AppsCustomizePagedView.java src/com/android/launcher3/Launcher.java src/com/android/launcher3/PagedView.java src/com/android/launcher3/Workspace.java src/com/android/launcher3/settings/SettingsProvider.java Change-Id: Ib134705952877165c334181548d577b3dceece68 --- Android.mk | 1 + res/layout-port/launcher.xml | 9 +- res/layout/overview_panel.xml | 1 - res/layout/settings_pane.xml | 1 + res/menu/apps_customize_sort_mode.xml | 11 + res/menu/scrolling_settings.xml | 10 + res/values/cm_arrays.xml | 2 +- res/values/config.xml | 5 + res/values/preferences_defaults.xml | 15 + .../android/launcher3/AppsCustomizePagedView.java | 148 ++++++- src/com/android/launcher3/DeviceProfile.java | 12 - src/com/android/launcher3/DragLayer.java | 18 +- src/com/android/launcher3/Launcher.java | 41 +- src/com/android/launcher3/LauncherModel.java | 16 + .../android/launcher3/OverviewSettingsPanel.java | 2 +- src/com/android/launcher3/PagedView.java | 426 ++++++++++++++++++++- src/com/android/launcher3/Stats.java | 24 +- src/com/android/launcher3/Workspace.java | 170 +++++--- 18 files changed, 784 insertions(+), 128 deletions(-) create mode 100644 res/menu/apps_customize_sort_mode.xml create mode 100644 res/menu/scrolling_settings.xml create mode 100644 res/values/preferences_defaults.xml diff --git a/Android.mk b/Android.mk index 63e85aeda..59bc8961d 100644 --- a/Android.mk +++ b/Android.mk @@ -44,6 +44,7 @@ LOCAL_PACKAGE_NAME := Launcher3 LOCAL_OVERRIDES_PACKAGES := Launcher2 LOCAL_PROGUARD_FLAG_FILES := proguard.flags +LOCAL_PROGUARD_ENABLED := disabled include $(BUILD_PACKAGE) diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml index 9e98d4257..ad1027829 100644 --- a/res/layout-port/launcher.xml +++ b/res/layout-port/launcher.xml @@ -48,10 +48,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> - - + + + diff --git a/res/layout/overview_panel.xml b/res/layout/overview_panel.xml index ea12aefe4..8fed47718 100644 --- a/res/layout/overview_panel.xml +++ b/res/layout/overview_panel.xml @@ -22,7 +22,6 @@ android:gravity="bottom" slidingpanel:overlay="false" slidingpanel:panelHeight="@dimen/sliding_panel_padding" > - + + + + + + + \ No newline at end of file diff --git a/res/menu/scrolling_settings.xml b/res/menu/scrolling_settings.xml new file mode 100644 index 000000000..e29a3cac6 --- /dev/null +++ b/res/menu/scrolling_settings.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/res/values/cm_arrays.xml b/res/values/cm_arrays.xml index 2320f1805..de89b530b 100644 --- a/res/values/cm_arrays.xml +++ b/res/values/cm_arrays.xml @@ -74,4 +74,4 @@ @drawable/transition_carousel @drawable/transition_overview - \ No newline at end of file + diff --git a/res/values/config.xml b/res/values/config.xml index 8e19e3706..52d08718f 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -13,6 +13,7 @@ false false false + false 21 @@ -64,6 +65,10 @@ false + + false + + false 0 diff --git a/res/values/preferences_defaults.xml b/res/values/preferences_defaults.xml new file mode 100644 index 000000000..6d6d1b29e --- /dev/null +++ b/res/values/preferences_defaults.xml @@ -0,0 +1,15 @@ + + + true + none + true + @bool/config_workspaceDefaultShowOutlines + @@bool/config_workspaceFadeAdjacentScreens + false + stack + false + false + @bool/config_largeIcons + sans-serif-condensed + 0 + diff --git a/src/com/android/launcher3/AppsCustomizePagedView.java b/src/com/android/launcher3/AppsCustomizePagedView.java index 1bd290777..eac84dde5 100644 --- a/src/com/android/launcher3/AppsCustomizePagedView.java +++ b/src/com/android/launcher3/AppsCustomizePagedView.java @@ -49,9 +49,11 @@ import android.widget.Toast; import com.android.launcher3.DropTarget.DragObject; import com.android.launcher3.compat.AppWidgetManagerCompat; +import com.android.launcher3.settings.SettingsProvider; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -157,6 +159,36 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } private ContentType mContentType = ContentType.Applications; + /** + * The different sort modes than can be used to order items. + */ + public enum SortMode { + Title(0), + LaunchCount(1), + InstallTime(2); + + private final int mValue; + private SortMode(int value) { + mValue = value; + } + + public int getValue() { + return mValue; + } + + public static SortMode getModeForValue(int value) { + switch (value) { + case 1: + return LaunchCount; + case 2: + return InstallTime; + default : + return Title; + } + } + } + private SortMode mSortMode = SortMode.Title; + // Refs private Launcher mLauncher; private DragController mDragController; @@ -181,6 +213,26 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen private int mNumWidgetPages; private Rect mAllAppsPadding = new Rect(); + // Animation states + enum State { NORMAL, OVERVIEW}; + private State mState = State.NORMAL; + private boolean mIsSwitchingState = false; + + // Animation values + private float mNewScale; + private float[] mOldBackgroundAlphas; + private float[] mOldAlphas; + private float[] mNewBackgroundAlphas; + private float[] mNewAlphas; + + // Relating to the scroll and overscroll effects + private static float TRANSITION_MAX_ROTATION = 22; + private static final float ALPHA_CUTOFF_THRESHOLD = 0.01f; + private boolean mOverscrollTransformsSet; + private float mLastOverscrollPivotX; + + public static boolean DISABLE_ALL_APPS = false; + // Previews & outlines ArrayList mRunningTasks; private static final int sPageSleepDelay = 200; @@ -231,6 +283,10 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // (top + bottom) mFadeInAdjacentScreens = false; + TransitionEffect.setFromString(this, SettingsProvider.getString(context, + SettingsProvider.SETTINGS_UI_DRAWER_SCROLLING_TRANSITION_EFFECT, + R.string.preferences_interface_drawer_scrolling_transition_effect)); + // Unless otherwise specified this view is important for accessibility. if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); @@ -245,6 +301,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen Context context = getContext(); Resources r = context.getResources(); + mCameraDistance = (int) CAMERA_DISTANCE;//r.getInteger(R.integer.config_cameraDistance); setDragSlopeThreshold(r.getInteger(R.integer.config_appsCustomizeDragSlopeThreshold)/100f); } @@ -1321,8 +1378,54 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // In apps customize, we have a scrolling effect which emulates pulling cards off of a stack. @Override protected void screenScrolled(int screenCenter) { + final boolean isRtl = isLayoutRtl(); + + mUseTransitionEffect = !mIsSwitchingState; + super.screenScrolled(screenCenter); enableHwLayersOnVisiblePages(); + + boolean isInOverscroll = mOverScrollX < 0 || mOverScrollX > mMaxScrollX; + + if (isInOverscroll) { + int index = 0; + float pivotX = 0f; + final float leftBiasedPivot = 0.35f; + final float rightBiasedPivot = 0.65f; + final int lowerIndex = 0; + final int upperIndex = getChildCount() - 1; + + final boolean isLeftPage = mOverScrollX < 0; + index = (!isRtl && isLeftPage) || (isRtl && !isLeftPage) ? lowerIndex : upperIndex; + pivotX = isLeftPage ? rightBiasedPivot : leftBiasedPivot; + + View v = getPageAt(index); + + if (!mOverscrollTransformsSet || Float.compare(mLastOverscrollPivotX, pivotX) != 0) { + mOverscrollTransformsSet = true; + mLastOverscrollPivotX = pivotX; + v.setCameraDistance(mDensity * mCameraDistance); + v.setPivotX(v.getMeasuredWidth() * pivotX); + } + + float scrollProgress = getScrollProgress(screenCenter, v, index); + float rotation = -TRANSITION_MAX_ROTATION * scrollProgress; + v.setRotationY(rotation); + } else { + if (mOverscrollTransformsSet) { + mOverscrollTransformsSet = false; + View v0 = getPageAt(0); + View v1 = getPageAt(getChildCount() - 1); + v0.setRotationY(0); + v1.setRotationY(0); + v0.setCameraDistance(mDensity * mCameraDistance); + v1.setCameraDistance(mDensity * mCameraDistance); + v0.setPivotX(v0.getMeasuredWidth() / 2); + v1.setPivotX(v1.getMeasuredWidth() / 2); + v0.setPivotY(v0.getMeasuredHeight() / 2); + v1.setPivotY(v1.getMeasuredHeight() / 2); + } + } } private void enableHwLayersOnVisiblePages() { @@ -1352,17 +1455,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen layout.setLayerType(LAYER_TYPE_NONE, null); } } - - for (int i = 0; i < screenCount; i++) { - final View layout = (View) getPageAt(i); - - if (leftScreen <= i && i <= rightScreen && - (i == forceDrawScreen || shouldDrawChild(layout))) { - if (layout.getLayerType() != LAYER_TYPE_HARDWARE) { - layout.setLayerType(LAYER_TYPE_HARDWARE, null); - } - } - } } protected void overScroll(float amount) { @@ -1561,4 +1653,38 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen return String.format(getContext().getString(stringId), page + 1, count); } + + public Comparator getComparatorForSortMode() { + switch (mSortMode) { + case Title: + return LauncherModel.getAppNameComparator(); + case LaunchCount: + return LauncherModel.getAppLaunchCountComparator(mLauncher.getStats()); + case InstallTime: + return LauncherModel.APP_INSTALL_TIME_COMPARATOR; + } + return LauncherModel.getAppNameComparator(); + } + + public void setSortMode(SortMode sortMode) { + if (mSortMode == sortMode) return; + + mSortMode = sortMode; + + sortApps(); + } + + public void sortApps() { + Collections.sort(new ArrayList(), getComparatorForSortMode()); + + if (mContentType == ContentType.Applications) { + for (int i = 0; i < getChildCount(); i++) { + syncAppsPageItems(i, true); + } + } + } + + public SortMode getSortMode() { + return mSortMode; + } } diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index daf5556d4..c5f51d8bb 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -870,17 +870,5 @@ public class DeviceProfile { } } - - // Layout the Overview Mode - ViewGroup overviewMode = launcher.getOverviewPanel(); - if (overviewMode != null) { - Rect r = getOverviewModeButtonBarRect(); - lp = (FrameLayout.LayoutParams) overviewMode.getLayoutParams(); - lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - lp.width = Math.min(availableWidthPx, - calculateOverviewModeWidth(getVisibleChildCount(overviewMode))); - lp.height = r.height(); - overviewMode.setLayoutParams(lp); - } } } diff --git a/src/com/android/launcher3/DragLayer.java b/src/com/android/launcher3/DragLayer.java index e751b079d..4b40f4bb7 100644 --- a/src/com/android/launcher3/DragLayer.java +++ b/src/com/android/launcher3/DragLayer.java @@ -36,6 +36,7 @@ import android.view.accessibility.AccessibilityManager; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.FrameLayout; +import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; @@ -126,11 +127,17 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang final int n = getChildCount(); for (int i = 0; i < n; i++) { final View child = getChildAt(i); - setInsets(child, insets, mInsets); - final FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) child.getLayoutParams(); if (child.getId() == R.id.overview_panel) { + LinearLayout layout = (LinearLayout) + child.findViewById(R.id.settings_container); + FrameLayout.LayoutParams lp = + (FrameLayout.LayoutParams) layout.getLayoutParams(); + lp.bottomMargin += insets.bottom - mInsets.bottom; + layout.setLayoutParams(lp); continue; } + setInsets(child, insets, mInsets); + final FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) child.getLayoutParams(); if (child instanceof Insettable) { ((Insettable)child).setInsets(insets); } else { @@ -895,13 +902,6 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang invalidate(); } - /** - * Note: this is a reimplementation of View.isLayoutRtl() since that is currently hidden api. - */ - private boolean isLayoutRtl() { - return (getLayoutDirection() == LAYOUT_DIRECTION_RTL); - } - @Override protected void dispatchDraw(Canvas canvas) { // Draw the background gradient below children. diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index d04c42348..dcc87b83a 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1,4 +1,3 @@ - /* * Copyright (C) 2008 The Android Open Source Project * @@ -32,6 +31,7 @@ import android.app.AlertDialog; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; +import android.app.Dialog; import android.app.SearchManager; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; @@ -42,6 +42,7 @@ import android.content.ComponentCallbacks2; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; @@ -82,6 +83,7 @@ import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; +import android.view.MenuItem; import android.view.MotionEvent; import android.view.Surface; import android.view.View; @@ -100,6 +102,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.Advanceable; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; @@ -314,6 +317,8 @@ public class Launcher extends Activity private Bundle mSavedInstanceState; + private Dialog mTransitionEffectDialog; + private LauncherModel mModel; private IconCache mIconCache; private boolean mUserPresent = true; @@ -371,6 +376,9 @@ public class Launcher extends Activity private BubbleTextView mWaitingForResume; + // Preferences + private boolean mHideIconLabels; + private Runnable mBuildLayersRunnable = new Runnable() { public void run() { if (mWorkspace != null) { @@ -397,10 +405,6 @@ public class Launcher extends Activity FocusIndicatorView mFocusHandler; - static boolean isPropertyEnabled(String propertyName) { - return Log.isLoggable(propertyName, Log.VERBOSE); - } - public Animator.AnimatorListener mAnimatorListener = new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator arg0) {} @@ -414,7 +418,7 @@ public class Launcher extends Activity public void onAnimationCancel(Animator arg0) {} }; - private static boolean isPropertyEnabled(String propertyName) { + public static boolean isPropertyEnabled(String propertyName) { return Log.isLoggable(propertyName, Log.VERBOSE); } @@ -544,11 +548,6 @@ public class Launcher extends Activity mIconCache.flushInvalidIcons(mGrid); } - protected void onUserLeaveHint() { - super.onUserLeaveHint(); - sPausedFromUserAction = true; - } - /** To be overriden by subclasses to hint to Launcher that we have custom content */ protected boolean hasCustomContentToLeft() { return false; @@ -1486,7 +1485,7 @@ public class Launcher extends Activity mHotseat.setOnLongClickListener(this); } - mOverviewPanel = findViewById(R.id.overview_panel); + mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); mOverviewSettingsPanel = new OverviewSettingsPanel( this, mOverviewPanel); mOverviewSettingsPanel.initializeAdapter(); @@ -2027,6 +2026,10 @@ public class Launcher extends Activity // also will cancel mWaitingForResult. closeSystemDialogs(); + if (mTransitionEffectDialog != null) { + mTransitionEffectDialog.cancel(); + } + final boolean alreadyOnHome = mHasFocus && ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); @@ -3247,18 +3250,10 @@ public class Launcher extends Activity return mHotseat != null && layout != null && (layout instanceof CellLayout) && (layout == mHotseat.getLayout()); } - Hotseat getHotseat() { - return mHotseat; - } - View getOverviewPanel() { - return mOverviewPanel; - } + View getDarkPanel() { return mDarkPanel; } - SearchDropTargetBar getSearchBar() { - return mSearchDropTargetBar; - } /** * Returns the CellLayout of the specified container at the specified screen. @@ -3275,10 +3270,6 @@ public class Launcher extends Activity } } - protected Workspace getWorkspace() { - return mWorkspace; - } - protected AppsCustomizePagedView getAppsCustomizeContent() { return mAppsCustomizeContent; } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index c64506d80..39035cdd8 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -3663,6 +3663,22 @@ public class LauncherModel extends BroadcastReceiver } }; } + public static final Comparator getAppLaunchCountComparator(final Stats stats) { + final Collator collator = Collator.getInstance(); + return new Comparator() { + public final int compare(AppInfo a, AppInfo b) { + int result = stats.launchCount(b.intent) - stats.launchCount(a.intent); + if (result == 0) { + result = collator.compare(a.title.toString().trim(), + b.title.toString().trim()); + if (result == 0) { + result = a.componentName.compareTo(b.componentName); + } + } + return result; + } + }; + } public static final Comparator APP_INSTALL_TIME_COMPARATOR = new Comparator() { public final int compare(AppInfo a, AppInfo b) { diff --git a/src/com/android/launcher3/OverviewSettingsPanel.java b/src/com/android/launcher3/OverviewSettingsPanel.java index 2c1a7da36..76faff033 100644 --- a/src/com/android/launcher3/OverviewSettingsPanel.java +++ b/src/com/android/launcher3/OverviewSettingsPanel.java @@ -88,7 +88,7 @@ public class OverviewSettingsPanel { wallpaperButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { - mLauncher.startWallpaper(); + mLauncher.onClickWallpaperPicker(arg0); } }); wallpaperButton.setOnTouchListener(mLauncher.getHapticFeedbackTouchListener()); diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 248f98500..4388cd952 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -50,7 +50,10 @@ import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.view.animation.AccelerateInterpolator; +import java.lang.reflect.Array; import java.util.ArrayList; interface Page { @@ -262,6 +265,19 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc protected final Rect mInsets = new Rect(); + protected int mFirstChildLeft; + + protected Runnable mDelayedSnapToPageRunnable; + + // Relating to the scroll and overscroll effects + protected static float CAMERA_DISTANCE = 6500; + protected static final float TRANSITION_SCALE_FACTOR = 0.74f; + protected static final float TRANSITION_SCREEN_ROTATION = 12.5f; + protected int mCameraDistance; + private boolean mScrollTransformsSet; + protected TransitionEffect mTransitionEffect; + protected boolean mUseTransitionEffect = true; + public interface PageSwitchListener { void onPageSwitch(View newPage, int newPageIndex); } @@ -625,6 +641,10 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // a method that subclasses can override to add behavior protected void onPageEndMoving() { + if (mDelayedSnapToPageRunnable != null) { + mDelayedSnapToPageRunnable.run(); + mDelayedSnapToPageRunnable = null; + } } /** @@ -1026,25 +1046,77 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } } + public void setFadeInAdjacentScreens(boolean fade) { + mFadeInAdjacentScreens = fade; + } + public void setPageSpacing(int pageSpacing) { mPageSpacing = pageSpacing; requestLayout(); } + public TransitionEffect getTransitionEffect() { + return mTransitionEffect; + } + + public void setTransitionEffect(TransitionEffect effect) { + mTransitionEffect = effect; + + // Reset scroll transforms + if (mScrollTransformsSet) { + for (int i = 0; i < getChildCount(); i++) { + View v = getPageAt(i); + if (v != null) { + v.setPivotX(v.getMeasuredWidth() * 0.5f); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setRotation(0); + v.setRotationX(0); + v.setRotationY(0); + v.setScaleX(1f); + v.setScaleY(1f); + v.setTranslationX(0f); + v.setTranslationY(0f); + v.setVisibility(VISIBLE); + setChildAlpha(v, 1f); + } + } + + mScrollTransformsSet = false; + } + } + protected void screenScrolled(int screenCenter) { boolean isInOverscroll = mOverScrollX < 0 || mOverScrollX > mMaxScrollX; - - if (mFadeInAdjacentScreens && !isInOverscroll) { + // Apply transition effect and adjacent screen fade if enabled + if (mFadeInAdjacentScreens || (mTransitionEffect != null && mUseTransitionEffect) || mScrollTransformsSet) { for (int i = 0; i < getChildCount(); i++) { - View child = getChildAt(i); - if (child != null) { - float scrollProgress = getScrollProgress(screenCenter, child, i); - float alpha = 1 - Math.abs(scrollProgress); - child.setAlpha(alpha); + View v = getPageAt(i); + if (v != null) { + float scrollProgress = getScrollProgress(screenCenter, v, i); + // Fade first to allow transition effects to override alpha + if (mFadeInAdjacentScreens && !isInOverscroll) { + float alpha = 1 - Math.abs(scrollProgress); + setChildAlpha(v, alpha); + } + if (mTransitionEffect != null && mUseTransitionEffect && !isInOverscroll) { + mTransitionEffect.screenScrolled(v, i, scrollProgress); + } else if (mScrollTransformsSet) { + v.setPivotX(v.getMeasuredWidth() * 0.5f); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setRotation(0); + v.setRotationX(0); + v.setRotationY(0); + v.setScaleX(1f); + v.setScaleY(1f); + v.setTranslationX(0f); + v.setTranslationY(0f); + v.setVisibility(VISIBLE); + setChildAlpha(v, 1f); + } } } - invalidate(); } + mScrollTransformsSet = mTransitionEffect != null && mUseTransitionEffect && !isInOverscroll; } protected void enablePagedViewAnimations() { @@ -1055,6 +1127,42 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mAllowPagedViewAnimations = false; } + /* + * This interpolator emulates the rate at which the perceived scale of an object changes + * as its distance from a camera increases. When this interpolator is applied to a scale + * animation on a view, it evokes the sense that the object is shrinking due to moving away + * from the camera. + */ + static class ZInterpolator implements TimeInterpolator { + private float focalLength; + + public ZInterpolator(float foc) { + focalLength = foc; + } + + public float getInterpolation(float input) { + return (1.0f - focalLength / (focalLength + input)) / + (1.0f - focalLength / (focalLength + 1.0f)); + } + } + + /* + * The exact reverse of ZInterpolator. + */ + static class InverseZInterpolator implements TimeInterpolator { + private ZInterpolator zInterpolator; + public InverseZInterpolator(float foc) { + zInterpolator = new ZInterpolator(foc); + } + public float getInterpolation(float input) { + return 1 - zInterpolator.getInterpolation(1 - input); + } + } + + protected void setChildAlpha(View child, float alpha) { + child.setAlpha(alpha); + } + @Override public void onChildViewAdded(View parent, View child) { // Update the page indicator, we don't update the page indicator as we @@ -1663,10 +1771,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc setEnableFreeScroll(false); } - protected void disableFreeScroll(int snapPage) { - setEnableFreeScroll(false, snapPage); - } - void updateFreescrollBounds() { getFreeScrollPageRange(mTempVisiblePagesRange); if (isLayoutRtl()) { @@ -2212,6 +2316,14 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc snapToPage(whichPage, delta, duration); } + protected void snapToPage(int whichPage, Runnable r) { + if (mDelayedSnapToPageRunnable != null) { + mDelayedSnapToPageRunnable.run(); + } + mDelayedSnapToPageRunnable = r; + snapToPage(whichPage, SLOW_PAGE_SNAP_ANIMATION_DURATION); + } + protected void snapToPage(int whichPage) { snapToPage(whichPage, getPageSnapDuration()); } @@ -2888,4 +3000,294 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc public boolean onHoverEvent(android.view.MotionEvent event) { return true; } + + protected static abstract class TransitionEffect { + public static final String TRANSITION_EFFECT_NONE = "none"; + public static final String TRANSITION_EFFECT_ZOOM_IN = "zoom-in"; + public static final String TRANSITION_EFFECT_ZOOM_OUT = "zoom-out"; + public static final String TRANSITION_EFFECT_ROTATE_UP = "rotate-up"; + public static final String TRANSITION_EFFECT_ROTATE_DOWN = "rotate-down"; + public static final String TRANSITION_EFFECT_CUBE_IN = "cube-in"; + public static final String TRANSITION_EFFECT_CUBE_OUT = "cube-out"; + public static final String TRANSITION_EFFECT_STACK = "stack"; + public static final String TRANSITION_EFFECT_ACCORDION = "accordion"; + public static final String TRANSITION_EFFECT_FLIP = "flip"; + public static final String TRANSITION_EFFECT_CYLINDER_IN = "cylinder-in"; + public static final String TRANSITION_EFFECT_CYLINDER_OUT = "cylinder-out"; + public static final String TRANSITION_EFFECT_CAROUSEL = "carousel"; + public static final String TRANSITION_EFFECT_OVERVIEW = "overview"; + + protected final PagedView mPagedView; + private final String mName; + + public TransitionEffect(PagedView pagedView, String name) { + mPagedView = pagedView; + mName = name; + } + + public abstract void screenScrolled(View v, int i, float scrollProgress); + + public final String getName() { + return mName; + } + + public static void setFromString(PagedView pagedView, String effect) { + if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_NONE)) { + pagedView.setTransitionEffect(null); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_ZOOM_IN)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Zoom(pagedView, true)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_ZOOM_OUT)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Zoom(pagedView, false)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_CUBE_IN)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Cube(pagedView, true)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_CUBE_OUT)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Cube(pagedView, false)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_ROTATE_UP)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Rotate(pagedView, true)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_ROTATE_DOWN)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Rotate(pagedView, false)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_STACK)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Stack(pagedView)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_ACCORDION)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Accordion(pagedView)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_FLIP)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Flip(pagedView)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_CYLINDER_IN)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Cylinder(pagedView, true)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_CYLINDER_OUT)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Cylinder(pagedView, false)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_CAROUSEL)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Carousel(pagedView)); + } else if (effect.equals(PagedView.TransitionEffect.TRANSITION_EFFECT_OVERVIEW)) { + pagedView.setTransitionEffect(new PagedView.TransitionEffect.Overview(pagedView)); + } + } + + public static class Zoom extends TransitionEffect { + private boolean mIn; + + public Zoom(PagedView pagedView, boolean in) { + super(pagedView, in ? TRANSITION_EFFECT_ZOOM_IN : TRANSITION_EFFECT_ZOOM_OUT); + mIn = in; + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float scale = 1.0f + (mIn ? -0.2f : 0.1f) * Math.abs(scrollProgress); + + // Extra translation to account for the increase in size + if (!mIn) { + float translationX = v.getMeasuredWidth() * 0.1f * -scrollProgress; + v.setTranslationX(translationX); + } + + v.setScaleX(scale); + v.setScaleY(scale); + } + } + + public static class Rotate extends TransitionEffect { + private boolean mUp; + + public Rotate(PagedView pagedView, boolean up) { + super(pagedView, up ? TRANSITION_EFFECT_ROTATE_UP : TRANSITION_EFFECT_ROTATE_DOWN); + mUp = up; + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float rotation = + (mUp ? TRANSITION_SCREEN_ROTATION : -TRANSITION_SCREEN_ROTATION) * scrollProgress; + + float translationX = v.getMeasuredWidth() * scrollProgress; + + float rotatePoint = + (v.getMeasuredWidth() * 0.5f) / + (float) Math.tan(Math.toRadians((double) (TRANSITION_SCREEN_ROTATION * 0.5f))); + + v.setPivotX(v.getMeasuredWidth() * 0.5f); + if (mUp) { + v.setPivotY(-rotatePoint); + } else { + v.setPivotY(v.getMeasuredHeight() + rotatePoint); + } + v.setRotation(rotation); + v.setTranslationX(translationX); + } + } + + public static class Cube extends TransitionEffect { + private boolean mIn; + + public Cube(PagedView pagedView, boolean in) { + super(pagedView, in ? TRANSITION_EFFECT_CUBE_IN : TRANSITION_EFFECT_CUBE_OUT); + mIn = in; + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float rotation = (mIn ? 90.0f : -90.0f) * scrollProgress; + + if (mIn) { + v.setCameraDistance(mPagedView.mDensity * PagedView.CAMERA_DISTANCE); + } + + v.setPivotX(scrollProgress < 0 ? 0 : v.getMeasuredWidth()); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setRotationY(rotation); + } + } + + public static class Stack extends TransitionEffect { + private ZInterpolator mZInterpolator = new ZInterpolator(0.5f); + private DecelerateInterpolator mLeftScreenAlphaInterpolator = new DecelerateInterpolator(4); + protected AccelerateInterpolator mAlphaInterpolator = new AccelerateInterpolator(0.9f); + + public Stack(PagedView pagedView) { + super(pagedView, TRANSITION_EFFECT_STACK); + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + final boolean isRtl = mPagedView.isLayoutRtl(); + float interpolatedProgress; + float translationX; + float maxScrollProgress = Math.max(0, scrollProgress); + float minScrollProgress = Math.min(0, scrollProgress); + + if (mPagedView.isLayoutRtl()) { + translationX = maxScrollProgress * v.getMeasuredWidth(); + interpolatedProgress = mZInterpolator.getInterpolation(Math.abs(maxScrollProgress)); + } else { + translationX = minScrollProgress * v.getMeasuredWidth(); + interpolatedProgress = mZInterpolator.getInterpolation(Math.abs(minScrollProgress)); + } + float scale = (1 - interpolatedProgress) + + interpolatedProgress * TRANSITION_SCALE_FACTOR; + + float alpha; + if (isRtl && (scrollProgress > 0)) { + alpha = mAlphaInterpolator.getInterpolation(1 - Math.abs(maxScrollProgress)); + } else if (!isRtl && (scrollProgress < 0)) { + alpha = mAlphaInterpolator.getInterpolation(1 - Math.abs(scrollProgress)); + } else { + // On large screens we need to fade the page as it nears its leftmost position + alpha = mLeftScreenAlphaInterpolator.getInterpolation(1 - scrollProgress); + } + + v.setTranslationX(translationX); + v.setScaleX(scale); + v.setScaleY(scale); + if (v instanceof CellLayout) { + ((CellLayout) v).getShortcutsAndWidgets().setAlpha(alpha); + } else { + v.setAlpha(alpha); + } + + // If the view has 0 alpha, we set it to be invisible so as to prevent + // it from accepting touches + if (alpha == 0) { + v.setVisibility(INVISIBLE); + } else if (v.getVisibility() != VISIBLE) { + v.setVisibility(VISIBLE); + } + } + } + + public static class Accordion extends TransitionEffect { + public Accordion(PagedView pagedView) { + super(pagedView, TRANSITION_EFFECT_ACCORDION); + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float scale = 1.0f - Math.abs(scrollProgress); + + v.setScaleX(scale); + v.setPivotX(scrollProgress < 0 ? 0 : v.getMeasuredWidth()); + v.setPivotY(v.getMeasuredHeight() / 2f); + } + } + + public static class Flip extends TransitionEffect { + public Flip(PagedView pagedView) { + super(pagedView, TRANSITION_EFFECT_FLIP); + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float rotation = -180.0f * Math.max(-1f, Math.min(1f, scrollProgress)); + + v.setCameraDistance(mPagedView.mDensity * PagedView.CAMERA_DISTANCE); + v.setPivotX(v.getMeasuredWidth() * 0.5f); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setRotationY(rotation); + + if (scrollProgress >= -0.5f && scrollProgress <= 0.5f) { + v.setTranslationX(v.getMeasuredWidth() * scrollProgress); + if (v.getVisibility() != VISIBLE) { + v.setVisibility(VISIBLE); + } + } else { + v.setTranslationX(0f); + v.setVisibility(INVISIBLE); + } + } + } + + public static class Cylinder extends TransitionEffect { + private boolean mIn; + + public Cylinder(PagedView pagedView, boolean in) { + super(pagedView, in ? TRANSITION_EFFECT_CYLINDER_IN : TRANSITION_EFFECT_CYLINDER_OUT); + mIn = in; + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float rotation = (mIn ? TRANSITION_SCREEN_ROTATION : -TRANSITION_SCREEN_ROTATION) * scrollProgress; + + v.setPivotX((scrollProgress + 1) * v.getMeasuredWidth() * 0.5f); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setRotationY(rotation); + } + } + + public static class Carousel extends TransitionEffect { + public Carousel(PagedView pagedView) { + super(pagedView, TRANSITION_EFFECT_CAROUSEL); + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float rotation = 90.0f * scrollProgress; + + v.setCameraDistance(mPagedView.mDensity * PagedView.CAMERA_DISTANCE); + v.setTranslationX(v.getMeasuredWidth() * scrollProgress); + v.setPivotX(!mPagedView.isLayoutRtl() ? 0f : v.getMeasuredWidth()); + v.setPivotY(v.getMeasuredHeight() / 2); + v.setRotationY(-rotation); + } + } + + public static class Overview extends TransitionEffect { + private AccelerateDecelerateInterpolator mScaleInterpolator = new AccelerateDecelerateInterpolator(); + + public Overview(PagedView pagedView) { + super(pagedView, TRANSITION_EFFECT_OVERVIEW); + } + + @Override + public void screenScrolled(View v, int i, float scrollProgress) { + float scale = 1.0f - 0.1f * + mScaleInterpolator.getInterpolation(Math.min(0.3f, Math.abs(scrollProgress)) / 0.3f); + + v.setPivotX(scrollProgress < 0 ? 0 : v.getMeasuredWidth()); + v.setPivotY(v.getMeasuredHeight() * 0.5f); + v.setScaleX(scale); + v.setScaleY(scale); + mPagedView.setChildAlpha(v, scale); + } + } + } } diff --git a/src/com/android/launcher3/Stats.java b/src/com/android/launcher3/Stats.java index f3977e456..6ba1c19b9 100644 --- a/src/com/android/launcher3/Stats.java +++ b/src/com/android/launcher3/Stats.java @@ -32,6 +32,7 @@ public class Stats { private static final boolean LOCAL_LAUNCH_LOG = true; public static final String ACTION_LAUNCH = "com.android.launcher3.action.LAUNCH"; + public static final String PERM_LAUNCH = "com.android.launcher3.permission.RECEIVE_LAUNCH_BROADCASTS"; public static final String EXTRA_INTENT = "intent"; public static final String EXTRA_CONTAINER = "container"; public static final String EXTRA_SCREEN = "screen"; @@ -52,8 +53,6 @@ public class Stats { private final Launcher mLauncher; - private final String mLaunchBroadcastPermission; - DataOutputStream mLog; ArrayList mIntents; @@ -62,9 +61,6 @@ public class Stats { public Stats(Launcher launcher) { mLauncher = launcher; - mLaunchBroadcastPermission = - launcher.getResources().getString(R.string.receive_launch_broadcasts_permission); - loadStats(); if (LOCAL_LAUNCH_LOG) { @@ -91,7 +87,7 @@ public class Stats { } }, new IntentFilter(ACTION_LAUNCH), - mLaunchBroadcastPermission, + PERM_LAUNCH, null ); } @@ -107,6 +103,20 @@ public class Stats { } } + public int launchCount(Intent intent) { + intent = new Intent(intent); + intent.setSourceBounds(null); + + final String flat = intent.toUri(0); + + int pos = mIntents.indexOf(flat); + if (pos < 0) { + return 0; + } else { + return mHistogram.get(pos); + } + } + public void recordLaunch(Intent intent) { recordLaunch(intent, null); } @@ -124,7 +134,7 @@ public class Stats { .putExtra(EXTRA_CELLX, shortcut.cellX) .putExtra(EXTRA_CELLY, shortcut.cellY); } - mLauncher.sendBroadcast(broadcastIntent, mLaunchBroadcastPermission); + mLauncher.sendBroadcast(broadcastIntent, PERM_LAUNCH); incrementLaunch(flat); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index a3000d7aa..08204574d 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -60,6 +60,9 @@ import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.ViewPropertyAnimator; +import android.view.animation.AccelerateDecelerateInterpolator; + import android.view.accessibility.AccessibilityManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; @@ -132,6 +135,7 @@ public class Workspace extends SmoothPagedView private int mOriginalDefaultPage; private int mDefaultPage; + private long mDefaultScreenId; private ShortcutAndWidgetContainer mDragSourceInternal; private static boolean sAccessibilityEnabled; @@ -223,12 +227,13 @@ public class Workspace extends SmoothPagedView private boolean mWorkspaceFadeInAdjacentScreens; WallpaperOffsetInterpolator mWallpaperOffset; + private boolean mScrollWallpaper; private boolean mWallpaperIsLiveWallpaper; private int mNumPagesForWallpaperParallax; private float mLastSetWallpaperOffsetSteps = 0; private Runnable mDelayedResizeRunnable; - private Runnable mDelayedSnapToPageRunnable; + private Point mDisplaySize = new Point(); private int mCameraDistance; @@ -299,6 +304,9 @@ public class Workspace extends SmoothPagedView } }; + private boolean mShowSearchBar; + private boolean mShowOutlines; + private boolean mHideIconLabels; /** * Used to inflate the Workspace from XML. * @@ -326,6 +334,18 @@ public class Workspace extends SmoothPagedView // With workspace, data is available straight from the get-go setDataIsReady(); + mShowSearchBar = SettingsProvider.getBoolean(context, SettingsProvider.SETTINGS_UI_HOMESCREEN_SEARCH, + R.bool.preferences_interface_homescreen_search_default); + mShowOutlines = SettingsProvider.getBoolean(context, + SettingsProvider.SETTINGS_UI_HOMESCREEN_SCROLLING_PAGE_OUTLINES, + R.bool.preferences_interface_homescreen_scrolling_page_outlines_default); + mScrollWallpaper = SettingsProvider.getBoolean(context, + SettingsProvider.SETTINGS_UI_HOMESCREEN_SCROLLING_WALLPAPER_SCROLL, + R.bool.preferences_interface_homescreen_scrolling_wallpaper_scroll_default); + TransitionEffect.setFromString(this, SettingsProvider.getString(context, + SettingsProvider.SETTINGS_UI_HOMESCREEN_SCROLLING_TRANSITION_EFFECT, + R.string.preferences_interface_homescreen_scrolling_transition_effect)); + mLauncher = (Launcher) context; final Resources res = getResources(); mWorkspaceFadeInAdjacentScreens = LauncherAppState.getInstance().getDynamicGrid(). @@ -342,6 +362,8 @@ public class Workspace extends SmoothPagedView mOverviewModeShrinkFactor = grid.getOverviewModeScale(); mCameraDistance = res.getInteger(R.integer.config_cameraDistance); mOriginalDefaultPage = mDefaultPage = a.getInt(R.styleable.Workspace_defaultScreen, 1); + mDefaultScreenId = SettingsProvider.getLongCustomDefault(context, + SettingsProvider.SETTINGS_UI_HOMESCREEN_DEFAULT_SCREEN_ID, -1); a.recycle(); setOnHierarchyChangeListener(this); @@ -489,6 +511,11 @@ public class Workspace extends SmoothPagedView return SmoothPagedView.X_LARGE_MODE; } + @Override + public void setChildAlpha(View child, float alpha) { + ((CellLayout) child).setShortcutAndWidgetAlpha(alpha); + } + @Override public void onChildViewAdded(View parent, View child) { if (!(child instanceof CellLayout)) { @@ -583,6 +610,13 @@ public class Workspace extends SmoothPagedView mWorkspaceScreens.put(screenId, newScreen); mScreenOrder.add(insertIndex, screenId); addView(newScreen, insertIndex); + + if (mDefaultScreenId == screenId) { + int defaultPage = getPageIndexForScreenId(screenId); + moveToScreen(defaultPage, false); + Launcher.setScreen(defaultPage); + } + return screenId; } @@ -1246,10 +1280,6 @@ public class Workspace extends SmoothPagedView mDelayedResizeRunnable = null; } - if (mDelayedSnapToPageRunnable != null) { - mDelayedSnapToPageRunnable.run(); - mDelayedSnapToPageRunnable = null; - } if (mStripScreensOnPageStopMoving) { stripEmptyScreens(); mStripScreensOnPageStopMoving = false; @@ -1683,9 +1713,27 @@ public class Workspace extends SmoothPagedView return listener; } + public void setShowOutlines(boolean show) { + mShowOutlines = show; + } + + @Override + public void setFadeInAdjacentScreens(boolean fade) { + mWorkspaceFadeInAdjacentScreens = fade; + } + @Override protected void screenScrolled(int screenCenter) { final boolean isRtl = isLayoutRtl(); + + boolean isOnLastPageBeforeCustomContent = false; + if (hasCustomContent()) { + int customContentWidth = mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID).getMeasuredWidth(); + isOnLastPageBeforeCustomContent = (mOverScrollX < customContentWidth && (!hasCustomContent() || isLayoutRtl())) || + (mOverScrollX > mMaxScrollX - customContentWidth && (!hasCustomContent() || !isLayoutRtl())); + } + mUseTransitionEffect = !isOnLastPageBeforeCustomContent && mState == State.NORMAL && !mIsSwitchingState; + super.screenScrolled(screenCenter); updatePageAlphaValues(screenCenter); @@ -1921,38 +1969,6 @@ public class Workspace extends SmoothPagedView position[0], position[1], 0, null); } - /* - * This interpolator emulates the rate at which the perceived scale of an object changes - * as its distance from a camera increases. When this interpolator is applied to a scale - * animation on a view, it evokes the sense that the object is shrinking due to moving away - * from the camera. - */ - static class ZInterpolator implements TimeInterpolator { - private float focalLength; - - public ZInterpolator(float foc) { - focalLength = foc; - } - - public float getInterpolation(float input) { - return (1.0f - focalLength / (focalLength + input)) / - (1.0f - focalLength / (focalLength + 1.0f)); - } - } - - /* - * The exact reverse of ZInterpolator. - */ - static class InverseZInterpolator implements TimeInterpolator { - private ZInterpolator zInterpolator; - public InverseZInterpolator(float foc) { - zInterpolator = new ZInterpolator(foc); - } - public float getInterpolation(float input) { - return 1 - zInterpolator.getInterpolation(1 - input); - } - } - /* * ZInterpolator compounded with an ease-out. */ @@ -2063,6 +2079,15 @@ public class Workspace extends SmoothPagedView getOverviewModePages(range); } + private void updateDefaultScreenButton() { + View overviewPanel = mLauncher.getOverviewPanel(); + if (overviewPanel != null) { + View defaultPageButton = overviewPanel.findViewById(R.id.default_screen_button); + defaultPageButton.setActivated( + getScreenIdForPageIndex(getPageNearestToCenterOfScreen()) == mDefaultScreenId); + } + } + public void onClickDefaultScreenButton() { if (!isInOverviewMode()) return; @@ -2249,7 +2274,7 @@ public class Workspace extends SmoothPagedView final boolean stateIsOverview = (state == State.OVERVIEW); float finalBackgroundAlpha = (stateIsSpringLoaded || stateIsOverview) ? 1.0f : 0f; float finalHotseatAndPageIndicatorAlpha = (stateIsNormal || stateIsSpringLoaded) ? 1f : 0f; - float finalOverviewPanelAlpha = stateIsOverview ? 1f : 0f; + final float finalOverviewPanelAlpha = stateIsOverview ? 1f : 0f; float finalSearchBarAlpha = !stateIsNormal ? 0f : 1f; float finalWorkspaceTranslationY = stateIsOverview || stateIsOverviewHidden ? getOverviewModeTranslationY() : 0; @@ -2257,8 +2282,8 @@ public class Workspace extends SmoothPagedView boolean workspaceToAllApps = (oldStateIsNormal && stateIsNormalHidden); boolean overviewToAllApps = (oldStateIsOverview && stateIsOverviewHidden); boolean allAppsToWorkspace = (stateIsNormalHidden && stateIsNormal); - boolean workspaceToOverview = (oldStateIsNormal && stateIsOverview); - boolean overviewToWorkspace = (oldStateIsOverview && stateIsNormal); + final boolean workspaceToOverview = (oldStateIsNormal && stateIsOverview); + final boolean overviewToWorkspace = (oldStateIsOverview && stateIsNormal); mNewScale = 1.0f; @@ -2303,6 +2328,20 @@ public class Workspace extends SmoothPagedView finalAlpha = 1f; } + if (stateIsOverview) { + cl.setVisibility(VISIBLE); + cl.setTranslationX(0f); + cl.setTranslationY(0f); + cl.setPivotX(cl.getMeasuredWidth() * 0.5f); + cl.setPivotY(cl.getMeasuredHeight() * 0.5f); + cl.setRotation(0f); + cl.setRotationY(0f); + cl.setRotationX(0f); + cl.setScaleX(1f); + cl.setScaleY(1f); + cl.setShortcutAndWidgetAlpha(1f); + } + // If we are animating to/from the small state, then hide the side pages and fade the // current page in if (!mIsSwitchingState) { @@ -2423,10 +2462,51 @@ public class Workspace extends SmoothPagedView hotseatAlpha.setDuration(duration); searchBarAlpha.setDuration(duration); - overviewPanel.setAlpha(finalOverviewPanelAlpha); - AlphaUpdateListener.updateVisibility(overviewPanel); - Animation animation = AnimationUtils.loadAnimation(mLauncher, R.anim.drop_down); - overviewPanel.startAnimation(animation); + float mOverviewPanelSlideScale = 1.0f; + + if (overviewToWorkspace || stateIsNormal) { + ((SlidingUpPanelLayout) overviewPanel).collapsePane(); + overviewPanel.setScaleY(1.0f); + mOverviewPanelSlideScale = 3.0f; + } else if (workspaceToOverview || stateIsOverview) { + overviewPanel.setScaleY(3.0f); + mOverviewPanelSlideScale = 1.0f; + } + + final ViewPropertyAnimator overviewPanelScale = overviewPanel.animate(); + overviewPanelScale.scaleY(mOverviewPanelSlideScale) + .alpha(finalOverviewPanelAlpha) + .setInterpolator(new AccelerateDecelerateInterpolator()); + overviewPanelScale.setListener(new AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + if (workspaceToOverview || stateIsOverview) { + overviewPanel.setAlpha(finalOverviewPanelAlpha); + AlphaUpdateListener.updateVisibility(overviewPanel); + } + } + + @Override + public void onAnimationEnd(Animator animation) { + if (overviewToWorkspace || stateIsNormal) { + overviewPanel.setAlpha(finalOverviewPanelAlpha); + AlphaUpdateListener.updateVisibility(overviewPanel); + } + overviewPanelScale.setListener(null); + } + + @Override + public void onAnimationCancel(Animator animation) { + overviewPanel.setAlpha(finalOverviewPanelAlpha); + AlphaUpdateListener.updateVisibility(overviewPanel); + overviewPanelScale.setListener(null); + } + @Override + public void onAnimationRepeat(Animator animation) {} + }); + + // Animation animation = AnimationUtils.loadAnimation(mLauncher, R.anim.drop_down); + // overviewPanel.startAnimation(animation); anim.play(hotseatAlpha); anim.play(searchBarAlpha); anim.play(pageIndicatorAlpha); @@ -5086,7 +5166,7 @@ public class Workspace extends SmoothPagedView } void moveToDefaultScreen(boolean animate) { - moveToScreen(mDefaultPage, animate); + moveToScreen(getPageIndexForScreenId(mDefaultScreenId), animate); } void moveToCustomContentScreen(boolean animate) { -- cgit v1.2.3