Snap for 7829119 from 6a4f5427ea to sc-v2-release
Change-Id: I9e15d19d70dcc60f9bcf5ef111427b3e39cbd016
This commit is contained in:
@@ -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"/>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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"/>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user