Snap for 7829119 from 6a4f5427ea to sc-v2-release

Change-Id: I9e15d19d70dcc60f9bcf5ef111427b3e39cbd016
This commit is contained in:
Android Build Coastguard Worker
2021-10-16 01:07:55 +00:00
31 changed files with 275 additions and 645 deletions
+2
View File
@@ -42,6 +42,7 @@
android:layout_height="match_parent"
android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
android:paddingTop="@dimen/taskbar_contextual_padding_top"
android:gravity="center_vertical"
android:layout_gravity="start"/>
@@ -62,6 +63,7 @@
android:layout_height="match_parent"
android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
android:paddingTop="@dimen/taskbar_contextual_padding_top"
android:gravity="center_vertical"
android:layout_gravity="end"/>
</FrameLayout>
@@ -15,9 +15,7 @@
-->
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/taskbar_contextual_buttons_size"
android:layout_height="@dimen/taskbar_contextual_buttons_size"
android:layout_marginTop="@dimen/taskbar_contextual_button_margin"
android:paddingStart="@dimen/taskbar_nav_buttons_spacing"
android:layout_width="@dimen/taskbar_nav_buttons_size"
android:layout_height="@dimen/taskbar_nav_buttons_size"
android:background="@drawable/taskbar_icon_click_feedback_roundrect"
android:scaleType="center"/>
+4 -2
View File
@@ -165,8 +165,10 @@
<dimen name="taskbar_icon_drag_icon_size">54dp</dimen>
<dimen name="taskbar_folder_margin">16dp</dimen>
<dimen name="taskbar_nav_buttons_spacing">16dp</dimen>
<dimen name="taskbar_nav_buttons_size">48dp</dimen>
<dimen name="taskbar_contextual_button_margin">16dp</dimen>
<dimen name="taskbar_contextual_padding_top">8dp</dimen>
<dimen name="taskbar_nav_buttons_size">44dp</dimen>
<dimen name="taskbar_contextual_button_margin">40dp</dimen>
<dimen name="taskbar_hotseat_nav_spacing">42dp</dimen>
<dimen name="taskbar_contextual_buttons_size">35dp</dimen>
<dimen name="taskbar_stashed_size">24dp</dimen>
<dimen name="taskbar_stashed_handle_width">220dp</dimen>
@@ -62,7 +62,6 @@ import java.util.stream.Stream;
public class LauncherTaskbarUIController extends TaskbarUIController {
private final BaseQuickstepLauncher mLauncher;
private final TaskbarStateHandler mTaskbarStateHandler;
private final TaskbarActivityContext mContext;
private final TaskbarDragLayer mTaskbarDragLayer;
@@ -96,6 +95,14 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
private TaskbarKeyguardController mKeyguardController;
private LauncherState mTargetStateOverride = null;
private final DeviceProfile.OnDeviceProfileChangeListener mProfileChangeListener =
new DeviceProfile.OnDeviceProfileChangeListener() {
@Override
public void onDeviceProfileChanged(DeviceProfile dp) {
mControllers.taskbarViewController.onRotationChanged(
mLauncher.getDeviceProfile());
}
};
public LauncherTaskbarUIController(
BaseQuickstepLauncher launcher, TaskbarActivityContext context) {
@@ -104,7 +111,6 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
mTaskbarView = mTaskbarDragLayer.findViewById(R.id.taskbar_view);
mLauncher = launcher;
mTaskbarStateHandler = mLauncher.getTaskbarStateHandler();
}
@Override
@@ -129,6 +135,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
onStashedInAppChanged(mLauncher.getDeviceProfile());
mLauncher.addOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener);
mLauncher.getStateManager().addStateListener(mStateListener);
mLauncher.addOnDeviceProfileChangeListener(mProfileChangeListener);
}
@Override
@@ -141,6 +148,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
mLauncher.getStateManager().removeStateListener(mStateListener);
mLauncher.getHotseat().setIconsAlpha(1f);
mLauncher.setTaskbarUIController(null);
mLauncher.removeOnDeviceProfileChangeListener(mProfileChangeListener);
}
@Override
@@ -95,6 +95,9 @@ public class NavbarButtonsViewController {
private final ViewGroup mEndContextualContainer;
private final ViewGroup mStartContextualContainer;
private final AnimatedFloat mTaskbarNavButtonTranslationY = new AnimatedFloat(
this::updateNavButtonTranslationY);
// Initialized in init.
private TaskbarControllers mControllers;
private View mA11yButton;
@@ -133,8 +136,7 @@ public class NavbarButtonsViewController {
mControllers.navButtonController, R.id.ime_switcher);
mPropertyHolders.add(new StatePropertyHolder(imeSwitcherButton,
flags -> ((flags & MASK_IME_SWITCHER_VISIBLE) == MASK_IME_SWITCHER_VISIBLE)
&& ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0)
&& ((flags & FLAG_A11Y_VISIBLE) == 0)));
&& ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0)));
mPropertyHolders.add(new StatePropertyHolder(
mControllers.taskbarViewController.getTaskbarIconAlpha()
@@ -305,6 +307,11 @@ public class NavbarButtonsViewController {
}
}
/** Use to set the translationY for the all nav+contextual buttons */
public AnimatedFloat getTaskbarNavButtonTranslationY() {
return mTaskbarNavButtonTranslationY;
}
/**
* Does not call {@link #applyState()}. Don't forget to!
*/
@@ -323,6 +330,10 @@ public class NavbarButtonsViewController {
}
}
private void updateNavButtonTranslationY() {
mNavButtonsView.setTranslationY(mTaskbarNavButtonTranslationY.value);
}
private ImageView addButton(@DrawableRes int drawableId, @TaskbarButton int buttonType,
ViewGroup parent, TaskbarNavButtonController navButtonController, @IdRes int id) {
return addButton(drawableId, buttonType, parent, navButtonController, id,
@@ -60,6 +60,7 @@ public class TaskbarViewController {
this::updateTranslationY);
private final AnimatedFloat mTaskbarIconTranslationYForStash = new AnimatedFloat(
this::updateTranslationY);
private AnimatedFloat mTaskbarNavButtonTranslationY;
private final TaskbarModelCallbacks mModelCallbacks;
@@ -88,6 +89,8 @@ public class TaskbarViewController {
mModelCallbacks.init(controllers);
LauncherAppState.getInstance(mActivity).getModel().addCallbacksAndLoad(mModelCallbacks);
mTaskbarNavButtonTranslationY =
controllers.navbarButtonsViewController.getTaskbarNavButtonTranslationY();
}
public void onDestroy() {
@@ -214,6 +217,7 @@ public class TaskbarViewController {
int offsetY = launcherDp.getTaskbarOffsetY();
setter.setFloat(mTaskbarIconTranslationYForHome, VALUE, -offsetY, LINEAR);
setter.setFloat(mTaskbarNavButtonTranslationY, VALUE, -offsetY, LINEAR);
int collapsedHeight = mActivity.getDefaultTaskbarWindowHeight();
int expandedHeight = Math.max(collapsedHeight,
@@ -238,6 +242,14 @@ public class TaskbarViewController {
return controller;
}
public void onRotationChanged(DeviceProfile deviceProfile) {
if (areIconsVisible()) {
// We only translate on rotation when on home
return;
}
mTaskbarNavButtonTranslationY.updateValue(-deviceProfile.getTaskbarOffsetY());
}
/**
* Callbacks for {@link TaskbarView} to interact with its controller.
*/
@@ -57,13 +57,13 @@ public class ApiWrapper {
if (SysUINavigationMode.INSTANCE.get(context).getMode() == Mode.THREE_BUTTONS) {
Resources res = context.getResources();
/*
* 2 (left + right) x Padding +
* 3 nav buttons +
* Little space at the end for contextual buttons
* Little space at the end for contextual buttons +
* Little space between icons and nav buttons
*/
return 2 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_spacing)
+ 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size)
+ res.getDimensionPixelSize(R.dimen.taskbar_contextual_button_margin);
return 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size)
+ res.getDimensionPixelSize(R.dimen.taskbar_contextual_button_margin)
+ res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing);
} else {
return 0;
}
@@ -122,10 +122,6 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
public static final int STATE_RECENTS_ANIMATION_ENDED =
getFlagForIndex("STATE_RECENTS_ANIMATION_ENDED");
// Called when we create an overscroll window when swiping right to left on the most recent app
public static final int STATE_OVERSCROLL_WINDOW_CREATED =
getFlagForIndex("STATE_OVERSCROLL_WINDOW_CREATED");
// Called when RecentsView stops scrolling and settles on a TaskView.
public static final int STATE_RECENTS_SCROLLING_FINISHED =
getFlagForIndex("STATE_RECENTS_SCROLLING_FINISHED");
@@ -1,40 +0,0 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep;
import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import com.android.launcher3.R;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.ResourceBasedOverride;
import com.android.systemui.plugins.OverscrollPlugin;
/**
* Resource overrideable factory for forcing a local overscroll plugin.
* Override {@link R.string#overscroll_plugin_factory_class} to set a different class.
*/
public class OverscrollPluginFactory implements ResourceBasedOverride {
public static final MainThreadInitializedObject<OverscrollPluginFactory> INSTANCE = forOverride(
OverscrollPluginFactory.class,
R.string.overscroll_plugin_factory_class);
/**
* Get the plugin that is defined locally in launcher, as opposed to a dynamic side loaded one.
*/
public OverscrollPlugin getLocalOverscrollPlugin() {
return null;
}
}
@@ -40,7 +40,6 @@ import android.app.PendingIntent;
import android.app.RemoteAction;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
@@ -90,7 +89,6 @@ import com.android.quickstep.inputconsumers.AssistantInputConsumer;
import com.android.quickstep.inputconsumers.DeviceLockedInputConsumer;
import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer;
import com.android.quickstep.inputconsumers.OtherActivityInputConsumer;
import com.android.quickstep.inputconsumers.OverscrollInputConsumer;
import com.android.quickstep.inputconsumers.OverviewInputConsumer;
import com.android.quickstep.inputconsumers.OverviewWithoutFocusInputConsumer;
import com.android.quickstep.inputconsumers.ResetGestureInputConsumer;
@@ -103,8 +101,6 @@ import com.android.quickstep.util.LauncherSplitScreenListener;
import com.android.quickstep.util.ProtoTracer;
import com.android.quickstep.util.ProxyScreenStatusProvider;
import com.android.quickstep.util.SplitScreenBounds;
import com.android.systemui.plugins.OverscrollPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.shared.recents.IOverviewProxy;
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -129,8 +125,8 @@ import java.util.LinkedList;
* Service connected by system-UI for handling touch interaction.
*/
@TargetApi(Build.VERSION_CODES.R)
public class TouchInteractionService extends Service implements PluginListener<OverscrollPlugin>,
ProtoTraceable<LauncherTraceProto.Builder> {
public class TouchInteractionService extends Service
implements ProtoTraceable<LauncherTraceProto.Builder> {
private static final String TAG = "TouchInteractionService";
@@ -149,8 +145,6 @@ public class TouchInteractionService extends Service implements PluginListener<O
SystemProperties.getBoolean("persist.debug.per_window_input_rotation", false);
private int mBackGestureNotificationCounter = -1;
@Nullable
private OverscrollPlugin mOverscrollPlugin;
/**
* Local IOverviewProxy implementation with some methods for local components
@@ -423,9 +417,6 @@ public class TouchInteractionService extends Service implements PluginListener<O
.getInt(KEY_BACK_NOTIFICATION_COUNT, MAX_BACK_NOTIFICATION_COUNT));
resetHomeBounceSeenOnQuickstepEnabledFirstTime();
PluginManagerWrapper.INSTANCE.get(getBaseContext()).addPluginListener(this,
OverscrollPlugin.class, false /* allowMultiple */);
mOverviewComponentObserver.setOverviewChangeListener(this::onOverviewTargetChange);
onOverviewTargetChange(mOverviewComponentObserver.isHomeAndOverviewSame());
}
@@ -507,7 +498,6 @@ public class TouchInteractionService extends Service implements PluginListener<O
if (mDeviceState.isUserUnlocked()) {
mInputConsumer.unregisterInputConsumer();
mOverviewComponentObserver.onDestroy();
PluginManagerWrapper.INSTANCE.get(getBaseContext()).removePluginListener(this);
}
disposeEventHandlers();
mDeviceState.destroy();
@@ -691,26 +681,6 @@ public class TouchInteractionService extends Service implements PluginListener<O
mTaskbarManager.getCurrentActivityContext());
}
if (FeatureFlags.ENABLE_QUICK_CAPTURE_GESTURE.get()) {
OverscrollPlugin plugin = null;
if (FeatureFlags.FORCE_LOCAL_OVERSCROLL_PLUGIN.get()) {
plugin = OverscrollPluginFactory.INSTANCE.get(
getApplicationContext()).getLocalOverscrollPlugin();
}
// If not local plugin was forced, use the actual overscroll plugin if available.
if (plugin == null && mOverscrollPlugin != null && mOverscrollPlugin.isActive()) {
plugin = mOverscrollPlugin;
}
if (plugin != null) {
// Put the overscroll gesture as higher priority than the Assistant or base
// gestures
base = new OverscrollInputConsumer(this, newGestureState, base,
mInputMonitorCompat, plugin);
}
}
// If Bubbles is expanded, use the overlay input consumer, which will close Bubbles
// instead of going all the way home when a swipe up is detected.
if (mDeviceState.isBubblesExpanded() || mDeviceState.isGlobalActionsShowing()) {
@@ -1018,16 +988,6 @@ public class TouchInteractionService extends Service implements PluginListener<O
}
}
@Override
public void onPluginConnected(OverscrollPlugin overscrollPlugin, Context context) {
mOverscrollPlugin = overscrollPlugin;
}
@Override
public void onPluginDisconnected(OverscrollPlugin overscrollPlugin) {
mOverscrollPlugin = null;
}
@Override
public void writeToProto(LauncherTraceProto.Builder proto) {
TouchInteractionServiceProto.Builder serviceProto =
@@ -29,7 +29,6 @@ import static com.android.launcher3.Utilities.EDGE_NAV_BAR;
import static com.android.launcher3.Utilities.squaredHypot;
import static com.android.launcher3.util.TraceHelper.FLAG_CHECK_FOR_RACE_CONDITIONS;
import static com.android.launcher3.util.VelocityUtils.PX_PER_MS;
import static com.android.quickstep.GestureState.STATE_OVERSCROLL_WINDOW_CREATED;
import static com.android.quickstep.util.ActiveGestureLog.INTENT_EXTRA_LOG_TRACE_ID;
import android.annotation.TargetApi;
@@ -490,7 +489,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
@Override
public boolean allowInterceptByParent() {
return !mPassedPilferInputSlop || mGestureState.hasState(STATE_OVERSCROLL_WINDOW_CREATED);
return !mPassedPilferInputSlop;
}
@Override
@@ -1,284 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.inputconsumers;
import static android.view.MotionEvent.ACTION_CANCEL;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_POINTER_DOWN;
import static android.view.MotionEvent.ACTION_POINTER_UP;
import static android.view.MotionEvent.ACTION_UP;
import static com.android.launcher3.Utilities.squaredHypot;
import static java.lang.Math.abs;
import android.content.Context;
import android.graphics.PointF;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.launcher3.BaseDraggingActivity;
import com.android.launcher3.R;
import com.android.quickstep.GestureState;
import com.android.quickstep.InputConsumer;
import com.android.quickstep.views.RecentsView;
import com.android.systemui.plugins.OverscrollPlugin;
import com.android.systemui.shared.system.InputMonitorCompat;
/**
* Input consumer for handling events to pass to an {@code OverscrollPlugin}.
*/
public class OverscrollInputConsumer extends DelegateInputConsumer {
private static final String TAG = "OverscrollInputConsumer";
private static final boolean DEBUG_LOGS_ENABLED = false;
private static void debugPrint(String log) {
if (DEBUG_LOGS_ENABLED) {
Log.v(TAG, log);
}
}
private final PointF mDownPos = new PointF();
private final PointF mLastPos = new PointF();
private final PointF mStartDragPos = new PointF();
private final int mAngleThreshold;
private final int mFlingDistanceThresholdPx;
private final int mFlingVelocityThresholdPx;
private int mActivePointerId = -1;
private boolean mPassedSlop = false;
// True if we set ourselves as active, meaning we no longer pass events to the delegate.
private boolean mPassedActiveThreshold = false;
// When a gesture crosses this length, this recognizer will attempt to interpret touch events.
private final float mSquaredSlop;
// When a gesture crosses this length, this recognizer will become the sole active recognizer.
private final float mSquaredActiveThreshold;
// When a gesture crosses this length, the overscroll view should be shown.
private final float mSquaredFinishThreshold;
private boolean mThisDownIsIgnored = false;
private final GestureState mGestureState;
@Nullable
private final OverscrollPlugin mPlugin;
@Nullable
private RecentsView mRecentsView;
public OverscrollInputConsumer(Context context, GestureState gestureState,
InputConsumer delegate, InputMonitorCompat inputMonitor, OverscrollPlugin plugin) {
super(delegate, inputMonitor);
mAngleThreshold = context.getResources()
.getInteger(R.integer.assistant_gesture_corner_deg_threshold);
mFlingDistanceThresholdPx = (int) context.getResources()
.getDimension(R.dimen.gestures_overscroll_fling_threshold);
mFlingVelocityThresholdPx = ViewConfiguration.get(context).getScaledMinimumFlingVelocity();
mGestureState = gestureState;
mPlugin = plugin;
float slop = ViewConfiguration.get(context).getScaledTouchSlop();
mSquaredSlop = slop * slop;
float finishGestureThreshold = (int) context.getResources()
.getDimension(R.dimen.gestures_overscroll_finish_threshold);
mSquaredFinishThreshold = finishGestureThreshold * finishGestureThreshold;
float activeThreshold = (int) context.getResources()
.getDimension(R.dimen.gestures_overscroll_active_threshold);
mSquaredActiveThreshold = activeThreshold * activeThreshold;
}
@Override
public int getType() {
return TYPE_OVERSCROLL | mDelegate.getType();
}
@Override
public void onMotionEvent(MotionEvent ev) {
if (mPlugin == null) {
return;
}
debugPrint("got event, underlying activity is " + getUnderlyingActivity());
switch (ev.getActionMasked()) {
case ACTION_DOWN: {
debugPrint("ACTION_DOWN");
mActivePointerId = ev.getPointerId(0);
mDownPos.set(ev.getX(), ev.getY());
mLastPos.set(mDownPos);
if (mPlugin.blockOtherGestures()) {
debugPrint("mPlugin.blockOtherGestures(), becoming active on ACTION_DOWN");
// Otherwise, if an appear gesture is performed when the Activity is visible,
// the Activity will dismiss its keyboard.
mPassedActiveThreshold = true;
mPassedSlop = true;
mStartDragPos.set(mLastPos.x, mLastPos.y);
setActive(ev);
}
break;
}
case ACTION_POINTER_DOWN: {
if (mState != STATE_ACTIVE) {
mState = STATE_DELEGATE_ACTIVE;
}
break;
}
case ACTION_POINTER_UP: {
int ptrIdx = ev.getActionIndex();
int ptrId = ev.getPointerId(ptrIdx);
if (ptrId == mActivePointerId) {
final int newPointerIdx = ptrIdx == 0 ? 1 : 0;
mDownPos.set(
ev.getX(newPointerIdx) - (mLastPos.x - mDownPos.x),
ev.getY(newPointerIdx) - (mLastPos.y - mDownPos.y));
mLastPos.set(ev.getX(newPointerIdx), ev.getY(newPointerIdx));
mActivePointerId = ev.getPointerId(newPointerIdx);
}
break;
}
case ACTION_MOVE: {
if (mState == STATE_DELEGATE_ACTIVE) {
break;
}
if (!mDelegate.allowInterceptByParent()) {
mState = STATE_DELEGATE_ACTIVE;
break;
}
// Update last touch position.
int pointerIndex = ev.findPointerIndex(mActivePointerId);
if (pointerIndex == -1) {
break;
}
mLastPos.set(ev.getX(pointerIndex), ev.getY(pointerIndex));
float squaredDist = squaredHypot(mLastPos.x - mDownPos.x, mLastPos.y - mDownPos.y);
if ((!mPassedSlop) && (squaredDist > mSquaredSlop)) {
mPassedSlop = true;
mStartDragPos.set(mLastPos.x, mLastPos.y);
mGestureState.setState(GestureState.STATE_OVERSCROLL_WINDOW_CREATED);
}
boolean becomeActive = mPassedSlop && !mPassedActiveThreshold && isOverscrolled()
&& (squaredDist > mSquaredActiveThreshold);
if (becomeActive) {
debugPrint("Past slop and past threshold, set active");
mPassedActiveThreshold = true;
setActive(ev);
}
if (mPassedActiveThreshold) {
debugPrint("ACTION_MOVE Relaying touch event");
mPlugin.onTouchEvent(ev, getHorizontalDistancePx(), getVerticalDistancePx(),
(int) Math.sqrt(mSquaredFinishThreshold), mFlingDistanceThresholdPx,
mFlingVelocityThresholdPx, getDeviceState(), getUnderlyingActivity());
}
break;
}
case ACTION_CANCEL:
case ACTION_UP:
debugPrint("ACTION_UP");
if (mPassedActiveThreshold) {
debugPrint("ACTION_UP Relaying touch event");
mPlugin.onTouchEvent(ev, getHorizontalDistancePx(), getVerticalDistancePx(),
(int) Math.sqrt(mSquaredFinishThreshold), mFlingDistanceThresholdPx,
mFlingVelocityThresholdPx, getDeviceState(), getUnderlyingActivity());
}
mPassedSlop = false;
mPassedActiveThreshold = false;
mState = STATE_INACTIVE;
break;
}
if (mState != STATE_ACTIVE) {
mDelegate.onMotionEvent(ev);
}
}
private boolean isOverscrolled() {
if (mRecentsView == null) {
BaseDraggingActivity activity = mGestureState.getActivityInterface()
.getCreatedActivity();
if (activity != null) {
mRecentsView = activity.getOverviewPanel();
}
}
// Make sure there isn't an app to quick switch to on our right
int maxIndex = 0;
boolean atRightMostApp = mRecentsView == null
|| (mRecentsView.getRunningTaskIndex() <= maxIndex);
// Check if the gesture is within our angle threshold of horizontal
float deltaY = abs(mLastPos.y - mDownPos.y);
float deltaX = mLastPos.x - mDownPos.x;
boolean angleInBounds = (Math.toDegrees(Math.atan2(deltaY, abs(deltaX))) < mAngleThreshold);
boolean overscrollVisible = mPlugin.blockOtherGestures();
boolean overscrollInvisibleAndLeftSwipe = !overscrollVisible && deltaX < 0;
boolean gestureDirectionMatchesVisibility = overscrollVisible
|| overscrollInvisibleAndLeftSwipe;
return atRightMostApp && angleInBounds && gestureDirectionMatchesVisibility;
}
private String getDeviceState() {
String deviceState = OverscrollPlugin.DEVICE_STATE_UNKNOWN;
int consumerType = mDelegate.getType();
if (((consumerType & InputConsumer.TYPE_OVERVIEW) > 0)
|| ((consumerType & InputConsumer.TYPE_OVERVIEW_WITHOUT_FOCUS)) > 0) {
deviceState = OverscrollPlugin.DEVICE_STATE_LAUNCHER;
} else if ((consumerType & InputConsumer.TYPE_OTHER_ACTIVITY) > 0) {
deviceState = OverscrollPlugin.DEVICE_STATE_APP;
} else if (((consumerType & InputConsumer.TYPE_RESET_GESTURE) > 0)
|| ((consumerType & InputConsumer.TYPE_DEVICE_LOCKED) > 0)) {
deviceState = OverscrollPlugin.DEVICE_STATE_LOCKED;
}
return deviceState;
}
private int getHorizontalDistancePx() {
return (int) (mLastPos.x - mDownPos.x);
}
private int getVerticalDistancePx() {
return (int) (mLastPos.y - mDownPos.y);
}
private @NonNull String getUnderlyingActivity() {
// Overly defensive, got guidance on code review that something in the chain of
// `mGestureState.getRunningTask().topActivity` can be null and thus cause a null pointer
// exception to be thrown, but we aren't sure which part can be null.
if ((mGestureState == null) || (mGestureState.getRunningTask() == null)
|| (mGestureState.getRunningTask().topActivity == null)) {
return "";
}
return mGestureState.getRunningTask().topActivity.flattenToString();
}
}
+2 -2
View File
@@ -41,7 +41,7 @@
<string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
<string name="widget_button_text" msgid="2880537293434387943">"ਵਿਜੇਟ"</string>
<string name="widgets_full_sheet_search_bar_hint" msgid="8484659090860596457">"ਖੋਜੋ"</string>
<string name="widgets_full_sheet_cancel_button_description" msgid="5766167035728653605">"ਖੋਜ ਬਾਕਸ ਤੋਂ ਸਪੱਸ਼ਟ ਲਿਖਤ"</string>
<string name="widgets_full_sheet_cancel_button_description" msgid="5766167035728653605">"ਖੋਜ ਬਾਕਸ ਤੋਂ ਲਿਖਤ ਕਲੀਅਰ ਕਰੋ"</string>
<string name="no_widgets_available" msgid="4337693382501046170">"ਵਿਜੇਟ ਜਾਂ ਸ਼ਾਰਟਕੱਟ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
<string name="no_search_results" msgid="3787956167293097509">"ਕੋਈ ਵੀ ਵਿਜੇਟ ਜਾਂ ਸ਼ਾਰਟਕੱਟ ਨਹੀਂ ਮਿਲਿਆ"</string>
<string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ਨਿੱਜੀ"</string>
@@ -115,7 +115,7 @@
<string name="abandoned_clean_this" msgid="7610119707847920412">"ਹਟਾਓ"</string>
<string name="abandoned_search" msgid="891119232568284442">"ਖੋਜੋ"</string>
<string name="abandoned_promises_title" msgid="7096178467971716750">"ਇਹ ਐਪ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ ਹੈ।"</string>
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"ਇਸ ਪ੍ਰਤੀਕ ਲਈ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤ ਹੋਇਆ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਹਟਾ ਸਕਦੇ ਹੋ ਜਾਂ ਐਪ ਖੋਜ ਸਕਦੇ ਹੋ ਅਤੇ ਇਸਨੂੰ ਮੈਨੂਅਲੀ ਸਥਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।"</string>
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"ਇਸ ਪ੍ਰਤੀਕ ਲਈ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤ ਹੋ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਹਟਾ ਸਕਦੇ ਹੋ ਜਾਂ ਐਪ ਨੂੰ ਹੱਥੀਂ ਖੋਜ ਕੇ ਉਸਨੂੰ ਸਥਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।"</string>
<string name="app_installing_title" msgid="5864044122733792085">"<xliff:g id="NAME">%1$s</xliff:g> ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ, <xliff:g id="PROGRESS">%2$s</xliff:g> ਪੂਰਾ ਹੋਇਆ"</string>
<string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ਡਾਉਨਲੋਡ ਹੋਰ ਰਿਹਾ ਹੈ, <xliff:g id="PROGRESS">%2$s</xliff:g> ਸੰਪੂਰਣ"</string>
<string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ਸਥਾਪਤ ਕਰਨ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ"</string>
+2 -10
View File
@@ -154,12 +154,7 @@
<attr name="demoModeLayoutId" format="reference" />
<attr name="isScalable" format="boolean" />
<attr name="devicePaddingId" format="reference" />
<attr name="gridEnabled" format="integer" >
<!-- Enable on all devices; default value -->
<enum name="all_displays" value="0" />
<!-- Enable on single display devices only -->
<enum name="single_display" value="1" />
</attr>
<attr name="gridEnabled" format="boolean" />
</declare-styleable>
@@ -241,10 +236,7 @@
<attr name="twoPanelLandscapeIconTextSize" format="float" />
<!-- If set, this display option is used to determine the default grid -->
<attr name="canBeDefault" format="boolean|integer" >
<!-- The profile can be default on split display devices -->
<flag name="split_display" value="0x2" />
</attr>
<attr name="canBeDefault" format="boolean" />
<!-- Margin on left and right of the workspace when GridDisplayOption#isScalable is true -->
<attr name="horizontalMargin" format="float"/>
+1 -1
View File
@@ -121,7 +121,7 @@
launcher:minHeightDps="694"
launcher:iconImageSize="56"
launcher:iconTextSize="14.4"
launcher:canBeDefault="split_display" />
launcher:canBeDefault="true" />
<display-option
launcher:name="Shorter Stubby"
+137
View File
@@ -0,0 +1,137 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<profiles xmlns:launcher="http://schemas.android.com/apk/res-auto" >
<grid-option
launcher:name="3_by_3"
launcher:numRows="3"
launcher:numColumns="3"
launcher:numFolderRows="2"
launcher:numFolderColumns="3"
launcher:numHotseatIcons="3"
launcher:dbFile="launcher_3_by_3.db"
launcher:defaultLayoutId="@xml/default_workspace_3x3" >
<display-option
launcher:name="Super Short Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="300"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
<display-option
launcher:name="Shorter Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="400"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
</grid-option>
<grid-option
launcher:name="4_by_4"
launcher:numRows="4"
launcher:numColumns="4"
launcher:numFolderRows="3"
launcher:numFolderColumns="4"
launcher:numHotseatIcons="4"
launcher:dbFile="launcher_4_by_4.db"
launcher:defaultLayoutId="@xml/default_workspace_4x4" >
<display-option
launcher:name="Short Stubby"
launcher:minWidthDps="275"
launcher:minHeightDps="420"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
<display-option
launcher:name="Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="450"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
<display-option
launcher:name="Nexus S"
launcher:minWidthDps="296"
launcher:minHeightDps="491.33"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
<display-option
launcher:name="Nexus 4"
launcher:minWidthDps="359"
launcher:minHeightDps="567"
launcher:iconImageSize="54"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
<display-option
launcher:name="Nexus 5"
launcher:minWidthDps="335"
launcher:minHeightDps="567"
launcher:iconImageSize="54"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
</grid-option>
<grid-option
launcher:name="5_by_5"
launcher:numRows="5"
launcher:numColumns="5"
launcher:numFolderRows="4"
launcher:numFolderColumns="4"
launcher:numHotseatIcons="5"
launcher:numExtendedHotseatIcons="8"
launcher:dbFile="launcher.db"
launcher:defaultLayoutId="@xml/default_workspace_5x5" >
<display-option
launcher:name="Large Phone"
launcher:minWidthDps="406"
launcher:minHeightDps="694"
launcher:iconImageSize="56"
launcher:iconTextSize="14.4"
launcher:canBeDefault="true" />
<display-option
launcher:name="Large Phone Split Display"
launcher:minWidthDps="406"
launcher:minHeightDps="694"
launcher:iconImageSize="56"
launcher:iconTextSize="14.4"
launcher:canBeDefault="true" />
<display-option
launcher:name="Shorter Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="400"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
</grid-option>
</profiles>
-114
View File
@@ -1,114 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<device-paddings xmlns:launcher="http://schemas.android.com/apk/res-auto" >
<device-padding
launcher:maxEmptySpace="88dp">
<workspaceTopPadding
launcher:a="0"
launcher:b="0"/>
<workspaceBottomPadding
launcher:a="0.52"
launcher:b="0"/>
<hotseatBottomPadding
launcher:a="0.48"
launcher:b="0"/>
</device-padding>
<device-padding
launcher:maxEmptySpace="100dp">
<workspaceTopPadding
launcher:a="0"
launcher:b="9dp"/>
<workspaceBottomPadding
launcher:a="0.40"
launcher:b="0"
launcher:c="9dp"/>
<hotseatBottomPadding
launcher:a="0.60"
launcher:b="0"
launcher:c="9dp"/>
</device-padding>
<device-padding
launcher:maxEmptySpace="103dp">
<workspaceTopPadding
launcher:a="0"
launcher:b="26dp"/>
<workspaceBottomPadding
launcher:a="0"
launcher:b="20dp"/>
<hotseatBottomPadding
launcher:a="1"
launcher:b="0"
launcher:c="46dp"/>
</device-padding>
<device-padding
launcher:maxEmptySpace="107dp">
<workspaceTopPadding
launcher:a="0"
launcher:b="9dp"/>
<workspaceBottomPadding
launcher:a="0"
launcher:b="34dp"/>
<hotseatBottomPadding
launcher:a="1"
launcher:b="0"
launcher:c="43dp"/>
</device-padding>
<device-padding
launcher:maxEmptySpace="120dp">
<workspaceTopPadding
launcher:a="0"
launcher:b="16dp"/>
<workspaceBottomPadding
launcher:a="1"
launcher:c="72dp"/>
<hotseatBottomPadding
launcher:a="0"
launcher:b="56dp"/>
</device-padding>
<device-padding
launcher:maxEmptySpace="135dp">
<workspaceTopPadding
launcher:a="0"
launcher:b="39dp"/>
<workspaceBottomPadding
launcher:a="1"
launcher:c="95dp"/>
<hotseatBottomPadding
launcher:a="0"
launcher:b="56dp"/>
</device-padding>
<device-padding
launcher:maxEmptySpace="9999dp">
<workspaceTopPadding
launcher:a="0.40"
launcher:c="36dp"/>
<workspaceBottomPadding
launcher:a="0.60"
launcher:c="36dp"/>
<hotseatBottomPadding
launcher:a="0"
launcher:b="36dp"/>
</device-padding>
</device-paddings>
+10 -4
View File
@@ -66,7 +66,6 @@ import com.android.launcher3.model.data.SearchActionItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.BubbleTextHolder;
import com.android.launcher3.views.IconLabelDotView;
import java.text.NumberFormat;
@@ -163,6 +162,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
private HandlerRunnable mIconLoadRequest;
private boolean mEnableIconUpdateAnimation = false;
private ItemInfoUpdateReceiver mItemInfoUpdateReceiver;
public BubbleTextView(Context context) {
this(context, null, 0);
@@ -240,6 +240,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
mDotParams.scale = 0f;
mForceHideDot = false;
setBackground(null);
mItemInfoUpdateReceiver = null;
}
private void cancelDotScaleAnim() {
@@ -337,13 +338,18 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
setDownloadStateContentDescription(info, info.getProgressLevel());
}
private void setItemInfo(ItemInfo itemInfo) {
private void setItemInfo(ItemInfoWithIcon itemInfo) {
setTag(itemInfo);
if (getParent() instanceof BubbleTextHolder) {
((BubbleTextHolder) getParent()).onItemInfoChanged(itemInfo);
if (mItemInfoUpdateReceiver != null) {
mItemInfoUpdateReceiver.reapplyItemInfo(itemInfo);
}
}
public void setItemInfoUpdateReceiver(
ItemInfoUpdateReceiver itemInfoUpdateReceiver) {
mItemInfoUpdateReceiver = itemInfoUpdateReceiver;
}
@UiThread
protected void applyIconAndLabel(ItemInfoWithIcon info) {
boolean useTheme = mDisplay == DISPLAY_WORKSPACE || mDisplay == DISPLAY_FOLDER
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -70,11 +70,6 @@ public class InvariantDeviceProfile {
public static final MainThreadInitializedObject<InvariantDeviceProfile> INSTANCE =
new MainThreadInitializedObject<>(InvariantDeviceProfile::new);
private static final int DEFAULT_TRUE = -1;
private static final int DEFAULT_SPLIT_DISPLAY = 2;
private static final int GRID_ENABLED_ALL_DISPLAYS = 0;
private static final int GRID_ENABLED_SINGLE_DISPLAY = 1;
private static final String KEY_IDP_GRID_NAME = "idp_grid_name";
private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48;
@@ -393,7 +388,9 @@ public class InvariantDeviceProfile {
private static ArrayList<DisplayOption> getPredefinedDeviceProfiles(
Context context, String gridName, boolean isSplitDisplay, boolean allowDisabledGrid) {
ArrayList<DisplayOption> profiles = new ArrayList<>();
try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) {
int xmlResource = isSplitDisplay ? R.xml.device_profiles_split : R.xml.device_profiles;
try (XmlResourceParser parser = context.getResources().getXml(xmlResource)) {
final int depth = parser.getDepth();
int type;
while (((type = parser.next()) != XmlPullParser.END_TAG ||
@@ -411,8 +408,7 @@ public class InvariantDeviceProfile {
if ((type == XmlPullParser.START_TAG) && "display-option".equals(
parser.getName())) {
profiles.add(new DisplayOption(gridOption, context,
Xml.asAttributeSet(parser),
isSplitDisplay ? DEFAULT_SPLIT_DISPLAY : DEFAULT_TRUE));
Xml.asAttributeSet(parser)));
}
}
}
@@ -450,7 +446,9 @@ public class InvariantDeviceProfile {
*/
public List<GridOption> parseAllGridOptions(Context context) {
List<GridOption> result = new ArrayList<>();
try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) {
int xmlResource = isSplitDisplay ? R.xml.device_profiles_split : R.xml.device_profiles;
try (XmlResourceParser parser = context.getResources().getXml(xmlResource)) {
final int depth = parser.getDepth();
int type;
while (((type = parser.next()) != XmlPullParser.END_TAG
@@ -702,11 +700,7 @@ public class InvariantDeviceProfile {
devicePaddingId = a.getResourceId(
R.styleable.GridDisplayOption_devicePaddingId, 0);
final int enabledInt =
a.getInteger(R.styleable.GridDisplayOption_gridEnabled,
GRID_ENABLED_ALL_DISPLAYS);
isEnabled = enabledInt == GRID_ENABLED_ALL_DISPLAYS
|| enabledInt == GRID_ENABLED_SINGLE_DISPLAY && !isSplitDisplay;
isEnabled = a.getBoolean(R.styleable.GridDisplayOption_gridEnabled, true);
a.recycle();
extraAttrs = Themes.createValueMap(context, attrs,
@@ -732,17 +726,15 @@ public class InvariantDeviceProfile {
private final float[] iconSizes = new float[COUNT_SIZES];
private final float[] textSizes = new float[COUNT_SIZES];
DisplayOption(GridOption grid, Context context, AttributeSet attrs, int defaultFlagValue) {
DisplayOption(GridOption grid, Context context, AttributeSet attrs) {
this.grid = grid;
TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.ProfileDisplayOption);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProfileDisplayOption);
minWidthDps = a.getFloat(R.styleable.ProfileDisplayOption_minWidthDps, 0);
minHeightDps = a.getFloat(R.styleable.ProfileDisplayOption_minHeightDps, 0);
canBeDefault = a.getInt(R.styleable.ProfileDisplayOption_canBeDefault, 0)
== defaultFlagValue;
canBeDefault = a.getBoolean(R.styleable.ProfileDisplayOption_canBeDefault, false);
float x;
float y;
@@ -60,6 +60,7 @@ import com.android.launcher3.pm.InstallSessionTracker;
import com.android.launcher3.pm.PackageInstallInfo;
import com.android.launcher3.pm.UserCache;
import com.android.launcher3.shortcuts.ShortcutRequest;
import com.android.launcher3.testing.TestProtocol;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.PackageUserKey;
@@ -346,6 +347,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
public void addCallbacks(Callbacks callbacks) {
Preconditions.assertUIThread();
synchronized (mCallbacksList) {
if (TestProtocol.sDebugTracing) {
Log.d(TestProtocol.NULL_INT_SET, "addCallbacks pointer: "
+ callbacks
+ ", name: "
+ callbacks.getClass().getName(), new Exception());
}
mCallbacksList.add(callbacks);
}
}
@@ -461,6 +461,13 @@ public class LauncherProvider extends ContentProvider {
app.getModel().forceReload();
return null;
}
case LauncherSettings.Settings.METHOD_CLEAR_WORKSPACE:
{
Bundle result = new Bundle();
result.putIntArray(LauncherSettings.Settings.EXTRA_VALUE, clearWorkspace()
.toArray());
return result;
}
}
return null;
}
@@ -497,6 +504,30 @@ public class LauncherProvider extends ContentProvider {
}
}
/**
* Deletes any items from the DB apart from hotseat.
* @return Ids of deleted items.
*/
private IntArray clearWorkspace() {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
try (SQLiteTransaction t = new SQLiteTransaction(db)) {
String selection = LauncherSettings.Favorites.CONTAINER + " <> "
+ LauncherSettings.Favorites.CONTAINER_HOTSEAT;
IntArray itemIds = LauncherDbUtils.queryIntArray(db, Favorites.TABLE_NAME,
Favorites._ID, selection, null, null);
if (!itemIds.isEmpty()) {
db.delete(Favorites.TABLE_NAME, Utilities.createDbSelectionQuery(
LauncherSettings.Favorites._ID, itemIds), null);
}
t.commit();
return itemIds;
} catch (SQLException ex) {
Log.e(TAG, ex.getMessage(), ex);
return new IntArray();
}
}
@Thunk static void addModifiedTime(ContentValues values) {
values.put(LauncherSettings.Favorites.MODIFIED, System.currentTimeMillis());
}
@@ -392,6 +392,8 @@ public class LauncherSettings {
public static final String METHOD_SWITCH_DATABASE = "switch_database";
public static final String METHOD_CLEAR_WORKSPACE = "clear_workspace";
public static final String EXTRA_VALUE = "value";
public static final String EXTRA_DB_NAME = "db_name";
@@ -72,12 +72,6 @@ public final class FeatureFlags {
"PROMISE_APPS_NEW_INSTALLS", true,
"Adds a promise icon to the home screen for new install sessions.");
public static final BooleanFlag QUICKSTEP_SPRINGS = getDebugFlag(
"QUICKSTEP_SPRINGS", true, "Enable springs for quickstep animations");
public static final BooleanFlag UNSTABLE_SPRINGS = getDebugFlag(
"UNSTABLE_SPRINGS", false, "Enable unstable springs for quickstep animations");
public static final BooleanFlag ENABLE_LOCAL_COLOR_POPUPS = getDebugFlag(
"ENABLE_LOCAL_COLOR_POPUPS", false, "Enable local color extraction for popups.");
@@ -122,16 +116,6 @@ public final class FeatureFlags {
public static final BooleanFlag ENABLE_PREDICTION_DISMISS = getDebugFlag(
"ENABLE_PREDICTION_DISMISS", true, "Allow option to dimiss apps from predicted list");
public static final BooleanFlag ENABLE_QUICK_CAPTURE_GESTURE = getDebugFlag(
"ENABLE_QUICK_CAPTURE_GESTURE", true, "Swipe from right to left to quick capture");
public static final BooleanFlag ENABLE_QUICK_CAPTURE_WINDOW = getDebugFlag(
"ENABLE_QUICK_CAPTURE_WINDOW", false, "Use window to host quick capture");
public static final BooleanFlag FORCE_LOCAL_OVERSCROLL_PLUGIN = getDebugFlag(
"FORCE_LOCAL_OVERSCROLL_PLUGIN", false,
"Use a launcher-provided OverscrollPlugin if available");
public static final BooleanFlag ASSISTANT_GIVES_LAUNCHER_FOCUS = getDebugFlag(
"ASSISTANT_GIVES_LAUNCHER_FOCUS", false,
"Allow Launcher to handle nav bar gestures while Assistant is running over it");
@@ -177,7 +177,9 @@ public abstract class BaseLoaderResults {
if (TestProtocol.sDebugTracing) {
Log.d(TestProtocol.NULL_INT_SET, "bind (1) currentScreenIds: "
+ currentScreenIds
+ ", mCallBacks: "
+ ", pointer: "
+ mCallbacks
+ ", name: "
+ mCallbacks.getClass().getName());
}
filterCurrentWorkspaceItems(currentScreenIds, mWorkspaceItems, currentWorkspaceItems,
@@ -21,7 +21,6 @@ import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity;
import static com.android.launcher3.config.FeatureFlags.UNSTABLE_SPRINGS;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_ALLAPPS;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
@@ -217,7 +216,7 @@ public abstract class AbstractStateChangeTouchController
mFlingBlockCheck.blockFling();
}
}
if (mToState == LauncherState.ALL_APPS && !UNSTABLE_SPRINGS.get()) {
if (mToState == LauncherState.ALL_APPS) {
mAllAppsOvershootStarted = true;
// 1f, value when all apps container hit the top
mLauncher.getAppsView().onPull(progress - 1f, progress - 1f);
@@ -333,7 +332,7 @@ public abstract class AbstractStateChangeTouchController
anim.setFloatValues(startProgress, endProgress);
updateSwipeCompleteAnimation(anim, duration, targetState, velocity, fling);
mCurrentAnimation.dispatchOnStart();
if (targetState == LauncherState.ALL_APPS && !UNSTABLE_SPRINGS.get()) {
if (targetState == LauncherState.ALL_APPS) {
if (mAllAppsOvershootStarted) {
mLauncher.getAppsView().onRelease();
mAllAppsOvershootStarted = false;
@@ -16,12 +16,14 @@
package com.android.launcher3.views;
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.icons.IconCache;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.ItemInfoWithIcon;
/**
* Views that contain {@link BubbleTextView} should implement this interface.
*/
public interface BubbleTextHolder {
public interface BubbleTextHolder extends IconCache.ItemInfoUpdateReceiver {
BubbleTextView getBubbleText();
/**
@@ -29,6 +31,6 @@ public interface BubbleTextHolder {
*
* @param itemInfo the new itemInfo
*/
default void onItemInfoChanged(ItemInfo itemInfo) {
}
@Override
default void reapplyItemInfo(ItemInfoWithIcon itemInfo){};
}
@@ -1,75 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.plugins;
import android.view.MotionEvent;
import com.android.systemui.plugins.annotations.ProvidesInterface;
/**
* Implement this interface to receive a callback when the user swipes right
* to left on the gesture area. It won't fire if the user has quick switched to a previous app
* (swiped right) and the current app isn't yet the active one (i.e., if swiping left would take
* the user to a more recent app).
*/
@ProvidesInterface(action = com.android.systemui.plugins.OverscrollPlugin.ACTION,
version = com.android.systemui.plugins.OverscrollPlugin.VERSION)
public interface OverscrollPlugin extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_LAUNCHER_OVERSCROLL";
int VERSION = 4;
String DEVICE_STATE_LOCKED = "Locked";
String DEVICE_STATE_LAUNCHER = "Launcher";
String DEVICE_STATE_APP = "App";
String DEVICE_STATE_UNKNOWN = "Unknown";
/**
* @return true if the plugin is active and will accept overscroll gestures
*/
boolean isActive();
/**
* Called when a touch has been recognized as an overscroll gesture.
* @param horizontalDistancePx Horizontal distance from the last finger location to the finger
* location when it first touched the screen.
* @param verticalDistancePx Horizontal distance from the last finger location to the finger
* location when it first touched the screen.
* @param thresholdPx Minimum distance for gesture.
* @param flingDistanceThresholdPx Minimum distance for gesture by fling.
* @param flingVelocityThresholdPx Minimum velocity for gesture by fling.
* @param deviceState String representing the current device state
* @param underlyingActivity String representing the currently active Activity
*/
void onTouchEvent(MotionEvent event,
int horizontalDistancePx,
int verticalDistancePx,
int thresholdPx,
int flingDistanceThresholdPx,
int flingVelocityThresholdPx,
String deviceState,
String underlyingActivity);
/**
* @return `true` if overscroll gesture handling should override all other gestures.
*/
boolean blockOtherGestures();
/**
* @return `true` if the overscroll gesture can pan the underlying app.
*/
boolean allowsUnderlyingActivityOverscroll();
}
@@ -288,13 +288,14 @@ public abstract class AbstractLauncherUiTest {
}
/**
* Removes all icons from homescreen and hotseat.
* Removes all items from workspace and populate default hotseat.
*/
public void clearHomescreen() throws Throwable {
public void clearWorkspace() {
// First clear data to ensure hotseat is populated.
clearLauncherData();
// Next make provider call to clear everything apart from hotseat.
LauncherSettings.Settings.call(mTargetContext.getContentResolver(),
LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB);
LauncherSettings.Settings.call(mTargetContext.getContentResolver(),
LauncherSettings.Settings.METHOD_CLEAR_EMPTY_DB_FLAG);
LauncherSettings.Settings.METHOD_CLEAR_WORKSPACE);
resetLoaderState();
}
@@ -85,7 +85,7 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest {
* @param acceptConfig accept the config activity
*/
private void runTest(boolean acceptConfig) throws Throwable {
clearHomescreen();
clearWorkspace();
mDevice.pressHome();
final Widgets widgets = mLauncher.getWorkspace().openAllWidgets();
@@ -47,7 +47,7 @@ public class AddWidgetTest extends AbstractLauncherUiTest {
@Test
@PortraitLandscape
public void testDragIcon() throws Throwable {
clearHomescreen();
clearWorkspace();
mDevice.pressHome();
final LauncherAppWidgetProviderInfo widgetInfo =
@@ -81,7 +81,7 @@ public class AddWidgetTest extends AbstractLauncherUiTest {
@Test
@PortraitLandscape
public void testDragCustomShortcut() throws Throwable {
clearHomescreen();
clearWorkspace();
mDevice.pressHome();
mLauncher.getWorkspace().openAllWidgets()
.getWidget("com.android.launcher3.testcomponent.CustomShortcutConfigActivity")
@@ -125,7 +125,7 @@ public class RequestPinItemTest extends AbstractLauncherUiTest {
private void runTest(String activityMethod, boolean isWidget, ItemOperator itemMatcher,
Intent... commandIntents) throws Throwable {
clearHomescreen();
clearWorkspace();
mDevice.pressHome();
// Open Pin item activity