Snap for 8414751 from e3589debfd to tm-release
Change-Id: Icbdd8fec08e8331e8602b0e281a38e21c320008f
This commit is contained in:
@@ -18,6 +18,7 @@ package com.android.launcher3.model;
|
||||
import static android.app.prediction.AppTargetEvent.ACTION_DISMISS;
|
||||
import static android.app.prediction.AppTargetEvent.ACTION_LAUNCH;
|
||||
import static android.app.prediction.AppTargetEvent.ACTION_PIN;
|
||||
import static android.app.prediction.AppTargetEvent.ACTION_UNDISMISS;
|
||||
import static android.app.prediction.AppTargetEvent.ACTION_UNPIN;
|
||||
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION;
|
||||
@@ -25,6 +26,7 @@ import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_PREDICT
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION;
|
||||
import static com.android.launcher3.logger.LauncherAtomExtensions.ExtendedContainers.ContainerCase.DEVICE_SEARCH_RESULT_CONTAINER;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_DISMISS_PREDICTION_UNDO;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_CONVERTED_TO_ICON;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_HOTSEAT_PREDICTION_PINNED;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DRAG_STARTED;
|
||||
@@ -176,6 +178,8 @@ public class AppEventProducer implements StatsLogConsumer {
|
||||
mContext.getPackageName(), Process.myUserHandle())
|
||||
.build();
|
||||
sendEvent(target, atomInfo, ACTION_LAUNCH, CONTAINER_PREDICTION);
|
||||
} else if (event == LAUNCHER_DISMISS_PREDICTION_UNDO) {
|
||||
sendEvent(atomInfo, ACTION_UNDISMISS, CONTAINER_HOTSEAT_PREDICTION);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +65,9 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
|
||||
| FLAG_STASHED_IN_APP_PINNED | FLAG_STASHED_IN_APP_EMPTY | FLAG_STASHED_IN_APP_SETUP
|
||||
| FLAG_STASHED_IN_APP_IME | FLAG_STASHED_IN_APP_ALL_APPS;
|
||||
|
||||
private static final int FLAGS_STASHED_IN_APP_IGNORING_IME =
|
||||
FLAGS_STASHED_IN_APP & ~FLAG_STASHED_IN_APP_IME;
|
||||
|
||||
// If any of these flags are enabled, inset apps by our stashed height instead of our unstashed
|
||||
// height. This way the reported insets are consistent even during transitions out of the app.
|
||||
// Currently any flag that causes us to stash in an app is included, except for IME or All Apps
|
||||
@@ -238,6 +241,13 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
|
||||
return hasAnyFlag(FLAGS_STASHED_IN_APP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the taskbar should be stashed in apps regardless of the IME visibility.
|
||||
*/
|
||||
public boolean isStashedInAppIgnoringIme() {
|
||||
return hasAnyFlag(FLAGS_STASHED_IN_APP_IGNORING_IME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the taskbar should be stashed in the current LauncherState.
|
||||
*/
|
||||
@@ -586,7 +596,11 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
|
||||
|
||||
private void notifyStashChange(boolean visible, boolean stashed) {
|
||||
mSystemUiProxy.notifyTaskbarStatus(visible, stashed);
|
||||
mControllers.taskbarActivityContext.updateInsetRoundedCornerFrame(visible && !stashed);
|
||||
// If stashing taskbar is caused by IME visibility, we could just skip updating rounded
|
||||
// corner insets since the rounded corners will be covered by IME during IME is showing and
|
||||
// taskbar will be restored back to unstashed when IME is hidden.
|
||||
mControllers.taskbarActivityContext.updateInsetRoundedCornerFrame(
|
||||
visible && !isStashedInAppIgnoringIme());
|
||||
mControllers.rotationButtonController.onTaskbarStateChange(visible, stashed);
|
||||
}
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.provider.RestoreDbTask;
|
||||
import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.taskbar.TaskbarActivityContext;
|
||||
import com.android.launcher3.taskbar.TaskbarManager;
|
||||
import com.android.launcher3.testing.TestLogging;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
@@ -688,11 +689,9 @@ public class TouchInteractionService extends Service
|
||||
}
|
||||
|
||||
// If Taskbar is present, we listen for long press to unstash it.
|
||||
BaseActivityInterface activityInterface = newGestureState.getActivityInterface();
|
||||
StatefulActivity activity = activityInterface.getCreatedActivity();
|
||||
if (activity != null && activity.getDeviceProfile().isTaskbarPresent) {
|
||||
base = new TaskbarStashInputConsumer(this, base, mInputMonitorCompat,
|
||||
mTaskbarManager.getCurrentActivityContext());
|
||||
TaskbarActivityContext tac = mTaskbarManager.getCurrentActivityContext();
|
||||
if (tac != null) {
|
||||
base = new TaskbarStashInputConsumer(this, base, mInputMonitorCompat, tac);
|
||||
}
|
||||
|
||||
// If Bubbles is expanded, use the overlay input consumer, which will close Bubbles
|
||||
|
||||
@@ -31,6 +31,7 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.ResourceUtils;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
|
||||
/**
|
||||
* Utility class to handle edge swipes for back gestures.
|
||||
@@ -115,10 +116,9 @@ public class EdgeBackGestureHandler implements OnTouchListener {
|
||||
// Add a nav bar panel window.
|
||||
mEdgeBackPanel = new EdgeBackGesturePanel(mContext, parent, createLayoutParams());
|
||||
mEdgeBackPanel.setBackCallback(mBackCallback);
|
||||
if (mContext.getDisplay() != null) {
|
||||
mContext.getDisplay().getRealSize(mDisplaySize);
|
||||
mEdgeBackPanel.setDisplaySize(mDisplaySize);
|
||||
}
|
||||
Point currentSize = DisplayController.INSTANCE.get(mContext).getInfo().currentSize;
|
||||
mDisplaySize.set(currentSize.x, currentSize.y);
|
||||
mEdgeBackPanel.setDisplaySize(mDisplaySize);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@ import android.os.SystemClock;
|
||||
import android.view.Display;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import android.view.View;
|
||||
import android.view.View.OnTouchListener;
|
||||
import android.view.ViewConfiguration;
|
||||
@@ -47,6 +46,7 @@ import androidx.annotation.Nullable;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.ResourceUtils;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.quickstep.util.MotionPauseDetector;
|
||||
import com.android.quickstep.util.NavBarPosition;
|
||||
@@ -92,13 +92,10 @@ public class NavBarGestureHandler implements OnTouchListener,
|
||||
NavBarGestureHandler(Context context) {
|
||||
mContext = context;
|
||||
final Display display = mContext.getDisplay();
|
||||
final int displayRotation;
|
||||
if (display == null) {
|
||||
displayRotation = Surface.ROTATION_0;
|
||||
} else {
|
||||
displayRotation = display.getRotation();
|
||||
display.getRealSize(mDisplaySize);
|
||||
}
|
||||
DisplayController.Info displayInfo = DisplayController.INSTANCE.get(mContext).getInfo();
|
||||
final int displayRotation = displayInfo.rotation;
|
||||
Point currentSize = displayInfo.currentSize;
|
||||
mDisplaySize.set(currentSize.x, currentSize.y);
|
||||
mSwipeUpTouchTracker =
|
||||
new TriggerSwipeUpTouchTracker(context, true /*disableHorizontalSwipe*/,
|
||||
new NavBarPosition(NavigationMode.NO_BUTTON, displayRotation),
|
||||
|
||||
@@ -79,6 +79,8 @@ import java.util.function.Function;
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class FallbackRecentsTest {
|
||||
|
||||
private static final String FALLBACK_LAUNCHER_TITLE = "Test launcher";
|
||||
|
||||
private final UiDevice mDevice;
|
||||
private final LauncherInstrumentation mLauncher;
|
||||
private final ActivityInfo mOtherLauncherActivity;
|
||||
@@ -169,7 +171,7 @@ public class FallbackRecentsTest {
|
||||
public void goToOverviewFromHome() {
|
||||
mDevice.pressHome();
|
||||
assertTrue("Fallback Launcher not visible", mDevice.wait(Until.hasObject(By.pkg(
|
||||
mOtherLauncherActivity.packageName)), WAIT_TIME_MS));
|
||||
mOtherLauncherActivity.packageName).text(FALLBACK_LAUNCHER_TITLE)), WAIT_TIME_MS));
|
||||
|
||||
mLauncher.getLaunchedAppState().switchToOverview();
|
||||
}
|
||||
@@ -258,7 +260,7 @@ public class FallbackRecentsTest {
|
||||
// Test dismissing all tasks.
|
||||
pressHomeAndGoToOverview().dismissAllTasks();
|
||||
assertTrue("Fallback Launcher not visible", TestHelpers.wait(Until.hasObject(By.pkg(
|
||||
mOtherLauncherActivity.packageName)), WAIT_TIME_MS));
|
||||
mOtherLauncherActivity.packageName).text(FALLBACK_LAUNCHER_TITLE)), WAIT_TIME_MS));
|
||||
}
|
||||
|
||||
private int getCurrentOverviewPage(RecentsActivity recents) {
|
||||
|
||||
@@ -17,6 +17,6 @@
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="@android:color/transparent" />
|
||||
<corners android:radius="28dp" />
|
||||
<corners android:radius="80dp" />
|
||||
<stroke android:width="2dp" android:color="?attr/workspaceAccentColor" />
|
||||
</shape>
|
||||
@@ -19,37 +19,49 @@
|
||||
android:layout_marginTop="8dp"
|
||||
android:gravity="center">
|
||||
|
||||
<LinearLayout
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingHorizontal="@dimen/work_card_padding_horizontal"
|
||||
android:paddingVertical="@dimen/work_card_padding_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:background="@drawable/work_card"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center"
|
||||
android:paddingEnd="@dimen/work_card_margin"
|
||||
android:paddingStart="@dimen/work_card_margin"
|
||||
android:paddingTop="@dimen/work_card_margin"
|
||||
android:id="@+id/wrapper">
|
||||
|
||||
<TextView
|
||||
style="@style/PrimaryHeadline"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:id="@+id/work_apps_paused_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/work_card_padding_horizontal"
|
||||
android:layout_marginBottom="@dimen/work_card_margin"
|
||||
android:layout_marginRight="@dimen/work_card_margin"
|
||||
android:text="@string/work_profile_edu_work_apps"
|
||||
android:textAlignment="center"
|
||||
android:textSize="20sp" />
|
||||
|
||||
<Button
|
||||
android:textSize="18sp" />
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/work_card_button_height"
|
||||
android:id="@+id/action_btn"
|
||||
android:textColor="?attr/workProfileOverlayTextColor"
|
||||
android:text="@string/work_profile_edu_accept"
|
||||
android:textAlignment="center"
|
||||
android:background="@drawable/rounded_action_button"
|
||||
android:layout_height="@dimen/padded_rounded_button_height"
|
||||
android:orientation="horizontal"
|
||||
>
|
||||
<FrameLayout
|
||||
android:layout_width="@dimen/rounded_button_width"
|
||||
android:layout_height="@dimen/rounded_button_width"
|
||||
android:background="@drawable/rounded_action_button"
|
||||
android:padding="@dimen/rounded_button_padding"
|
||||
android:layout_alignParentRight="true">
|
||||
<ImageButton
|
||||
android:layout_width="@dimen/x_icon_size"
|
||||
android:layout_height="@dimen/x_icon_size"
|
||||
android:id="@+id/action_btn"
|
||||
android:src="@drawable/ic_remove_no_shadow"
|
||||
android:layout_gravity="center"
|
||||
android:padding="@dimen/x_icon_padding" />
|
||||
</FrameLayout>
|
||||
</RelativeLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
|
||||
|
||||
android:textSize="14sp" />
|
||||
</LinearLayout>
|
||||
</com.android.launcher3.allapps.WorkEduCard>
|
||||
@@ -29,4 +29,6 @@
|
||||
android:drawableStart="@drawable/ic_corp_off"
|
||||
android:layout_marginBottom="@dimen/work_fab_margin"
|
||||
android:layout_marginEnd="@dimen/work_fab_margin"
|
||||
android:paddingLeft="@dimen/work_mode_fab_padding"
|
||||
android:paddingRight="@dimen/work_mode_fab_padding"
|
||||
android:text="@string/work_apps_pause_btn_text" />
|
||||
@@ -22,8 +22,19 @@
|
||||
<dimen name="fastscroll_popup_text_size">24dp</dimen>
|
||||
|
||||
<!-- Dynamic grid -->
|
||||
<dimen name="dynamic_grid_edge_margin">15.28dp</dimen>
|
||||
<dimen name="dynamic_grid_icon_drawable_padding">4dp</dimen>
|
||||
<dimen name="dynamic_grid_drop_target_size">36dp</dimen>
|
||||
<dimen name="cell_layout_padding">20dp</dimen>
|
||||
|
||||
<!-- Hotseat -->
|
||||
<dimen name="dynamic_grid_hotseat_side_padding">16dp</dimen>
|
||||
<dimen name="spring_loaded_hotseat_top_margin">45dp</dimen>
|
||||
|
||||
<!-- Dragging -->
|
||||
<dimen name="drop_target_button_gap">28dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_horizontal_padding">16dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_vertical_padding">2dp</dimen>
|
||||
<dimen name="drop_target_top_margin">6dp</dimen>
|
||||
<dimen name="drop_target_bottom_margin">6dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2022 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.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<!-- Hotseat -->
|
||||
<dimen name="spring_loaded_hotseat_top_margin">44dp</dimen>
|
||||
|
||||
<!-- Dragging -->
|
||||
<dimen name="drop_target_top_margin">0dp</dimen>
|
||||
<dimen name="drop_target_bottom_margin">16dp</dimen>
|
||||
|
||||
<!-- Dynamic grid -->
|
||||
<dimen name="dynamic_grid_edge_margin">11.33dp</dimen>
|
||||
<dimen name="cell_layout_padding">11.33dp</dimen>
|
||||
|
||||
<!-- AllApps -->
|
||||
<dimen name="all_apps_bottom_sheet_horizontal_padding">52dp</dimen>
|
||||
</resources>
|
||||
@@ -32,8 +32,18 @@
|
||||
<dimen name="fastscroll_popup_text_size">32dp</dimen>
|
||||
|
||||
<!-- Dynamic grid -->
|
||||
<dimen name="dynamic_grid_edge_margin">9dp</dimen>
|
||||
<dimen name="dynamic_grid_icon_drawable_padding">7dp</dimen>
|
||||
<dimen name="cell_layout_padding">9dp</dimen>
|
||||
|
||||
<!-- Hotseat -->
|
||||
<dimen name="dynamic_grid_hotseat_side_padding">0dp</dimen>
|
||||
<dimen name="spring_loaded_hotseat_top_margin">97dp</dimen>
|
||||
|
||||
<!-- Dragging -->
|
||||
<dimen name="drop_target_top_margin">34dp</dimen>
|
||||
<dimen name="drop_target_bottom_margin">16dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_horizontal_padding">16dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_vertical_padding">16dp</dimen>
|
||||
<dimen name="dynamic_grid_drop_target_size">56dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -15,9 +15,23 @@
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<!-- Widget picker-->
|
||||
<!-- Dynamic grid -->
|
||||
<dimen name="dynamic_grid_edge_margin">21.93dp</dimen>
|
||||
<dimen name="cell_layout_padding">29.33dp</dimen>
|
||||
|
||||
<!-- AllApps -->
|
||||
<dimen name="all_apps_bottom_sheet_horizontal_padding">32dp</dimen>
|
||||
|
||||
<!-- Dragging-->
|
||||
<dimen name="drop_target_top_margin">0dp</dimen>
|
||||
<dimen name="drop_target_bottom_margin">32dp</dimen>
|
||||
|
||||
<!-- Hotseat -->
|
||||
<dimen name="spring_loaded_hotseat_top_margin">64dp</dimen>
|
||||
|
||||
<!-- Widget picker-->
|
||||
<dimen name="widget_list_horizontal_margin">49dp</dimen>
|
||||
|
||||
<!-- Bottom sheet-->
|
||||
<!-- Bottom sheet-->
|
||||
<dimen name="bottom_sheet_extra_top_padding">0dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -16,7 +16,23 @@
|
||||
|
||||
<resources>
|
||||
<!-- AllApps -->
|
||||
<dimen name="all_apps_bottom_sheet_horizontal_padding">65dp</dimen>
|
||||
<dimen name="all_apps_bottom_sheet_horizontal_padding">28dp</dimen>
|
||||
|
||||
<!-- Dynamic grid -->
|
||||
<dimen name="dynamic_grid_edge_margin">27.59dp</dimen>
|
||||
<dimen name="cell_layout_padding">36dp</dimen>
|
||||
|
||||
<!-- Dragging -->
|
||||
<dimen name="drop_target_text_size">20sp</dimen>
|
||||
<dimen name="dynamic_grid_drop_target_size">72dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_horizontal_padding">24dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_vertical_padding">20dp</dimen>
|
||||
<dimen name="drop_target_button_gap">32dp</dimen>
|
||||
<dimen name="drop_target_top_margin">32dp</dimen>
|
||||
<dimen name="drop_target_bottom_margin">32dp</dimen>
|
||||
|
||||
<!-- Hotseat -->
|
||||
<dimen name="spring_loaded_hotseat_top_margin">164dp</dimen>
|
||||
|
||||
<!-- Widget picker-->
|
||||
<dimen name="widget_list_horizontal_margin">30dp</dimen>
|
||||
|
||||
@@ -22,9 +22,6 @@
|
||||
<item type="id" name="drag_event_parity" />
|
||||
|
||||
<!-- AllApps & Launcher transitions -->
|
||||
<!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
|
||||
<integer name="config_workspaceSpringLoadShrinkPercentage">85</integer>
|
||||
|
||||
<!-- The duration of the animation from search hint to text entry -->
|
||||
<integer name="config_searchHintAnimationDuration">50</integer>
|
||||
|
||||
|
||||
+21
-8
@@ -19,14 +19,14 @@
|
||||
<dimen name="click_shadow_elevation">4dp</dimen>
|
||||
|
||||
<!-- Dynamic Grid -->
|
||||
<dimen name="dynamic_grid_edge_margin">8dp</dimen>
|
||||
<dimen name="dynamic_grid_edge_margin">10.77dp</dimen>
|
||||
<dimen name="dynamic_grid_left_right_margin">8dp</dimen>
|
||||
<dimen name="dynamic_grid_icon_drawable_padding">7dp</dimen>
|
||||
<!-- Minimum space between workspace and hotseat in spring loaded mode -->
|
||||
<dimen name="dynamic_grid_min_spring_loaded_space">8dp</dimen>
|
||||
|
||||
<dimen name="dynamic_grid_cell_border_spacing">16dp</dimen>
|
||||
<dimen name="dynamic_grid_cell_layout_padding">5.5dp</dimen>
|
||||
<dimen name="cell_layout_padding">10.77dp</dimen>
|
||||
<dimen name="dynamic_grid_cell_padding_x">8dp</dimen>
|
||||
|
||||
<!-- Hotseat -->
|
||||
@@ -34,6 +34,7 @@
|
||||
<dimen name="dynamic_grid_hotseat_bottom_padding">2dp</dimen>
|
||||
<dimen name="dynamic_grid_hotseat_bottom_tall_padding">0dp</dimen>
|
||||
<dimen name="inline_qsb_bottom_margin">0dp</dimen>
|
||||
<dimen name="spring_loaded_hotseat_top_margin">76dp</dimen>
|
||||
|
||||
<!-- Qsb -->
|
||||
<!-- Used for adjusting the position of QSB when placed in hotseat. This is a ratio and a higher
|
||||
@@ -55,8 +56,10 @@
|
||||
<dimen name="workspace_page_indicator_overlap_workspace">0dp</dimen>
|
||||
|
||||
<!-- Drop target bar -->
|
||||
<dimen name="dynamic_grid_drop_target_size">52dp</dimen>
|
||||
<dimen name="dynamic_grid_drop_target_size">56dp</dimen>
|
||||
<dimen name="drop_target_vertical_gap">20dp</dimen>
|
||||
<dimen name="drop_target_top_margin">36dp</dimen>
|
||||
<dimen name="drop_target_bottom_margin">16dp</dimen>
|
||||
|
||||
<!-- App Widget resize frame -->
|
||||
<dimen name="widget_handle_margin">13dp</dimen>
|
||||
@@ -134,18 +137,25 @@
|
||||
|
||||
<!-- Floating action button inside work tab to toggle work profile -->
|
||||
<dimen name="work_fab_height">56dp</dimen>
|
||||
<dimen name="work_fab_radius">28dp</dimen>
|
||||
<dimen name="work_card_padding_horizontal">24dp</dimen>
|
||||
<dimen name="work_fab_radius">16dp</dimen>
|
||||
<dimen name="work_card_padding_horizontal">10dp</dimen>
|
||||
<dimen name="work_card_button_height">52dp</dimen>
|
||||
<dimen name="work_fab_margin">16dp</dimen>
|
||||
<dimen name="work_mode_fab_padding">16dp</dimen>
|
||||
<dimen name="work_profile_footer_padding">20dp</dimen>
|
||||
<dimen name="work_edu_card_margin">16dp</dimen>
|
||||
<dimen name="work_edu_card_radius">28dp</dimen>
|
||||
<dimen name="work_edu_card_radius">16dp</dimen>
|
||||
|
||||
<dimen name="work_card_margin">24dp</dimen>
|
||||
<!-- (x) icon button inside work edu card -->
|
||||
<dimen name="rounded_button_width">24dp</dimen>
|
||||
<dimen name="x_icon_size">16dp</dimen>
|
||||
<dimen name="x_icon_padding">4dp</dimen>
|
||||
|
||||
<!-- rounded button shown inside card views, and snack bars -->
|
||||
<dimen name="padded_rounded_button_height">48dp</dimen>
|
||||
<dimen name="rounded_button_height">32dp</dimen>
|
||||
<dimen name="rounded_button_radius">16dp</dimen>
|
||||
<dimen name="rounded_button_height">48dp</dimen>
|
||||
<dimen name="rounded_button_radius">200dp</dimen>
|
||||
<dimen name="rounded_button_padding">8dp</dimen>
|
||||
|
||||
|
||||
@@ -207,6 +217,9 @@
|
||||
<dimen name="drop_target_shadow_elevation">2dp</dimen>
|
||||
<dimen name="drop_target_bar_margin_horizontal">4dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_padding">8dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_horizontal_padding">16dp</dimen>
|
||||
<dimen name="drop_target_button_drawable_vertical_padding">8dp</dimen>
|
||||
<dimen name="drop_target_button_gap">22dp</dimen>
|
||||
|
||||
<!-- the distance an icon must be dragged before button drop targets accept it -->
|
||||
<dimen name="drag_distanceThreshold">30dp</dimen>
|
||||
|
||||
@@ -97,18 +97,16 @@ public class DeviceProfile {
|
||||
private static final float TALL_DEVICE_EXTRA_SPACE_THRESHOLD_DP = 252;
|
||||
private static final float TALL_DEVICE_MORE_EXTRA_SPACE_THRESHOLD_DP = 268;
|
||||
|
||||
// To evenly space the icons, increase the left/right margins for tablets in portrait mode.
|
||||
private static final int PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER = 4;
|
||||
|
||||
// Workspace
|
||||
public final int desiredWorkspaceHorizontalMarginOriginalPx;
|
||||
public int desiredWorkspaceHorizontalMarginPx;
|
||||
public Point cellLayoutBorderSpaceOriginalPx;
|
||||
public Point cellLayoutBorderSpacePx;
|
||||
public final int cellLayoutPaddingLeftRightPx;
|
||||
public final int cellLayoutBottomPaddingPx;
|
||||
public Rect cellLayoutPaddingPx = new Rect();
|
||||
|
||||
public final int edgeMarginPx;
|
||||
public float workspaceSpringLoadShrinkFactor;
|
||||
public float workspaceSpringLoadShrunkTop;
|
||||
public float workspaceSpringLoadShrunkBottom;
|
||||
public final int workspaceSpringLoadedBottomSpace;
|
||||
|
||||
private final int extraSpace;
|
||||
@@ -164,6 +162,7 @@ public class DeviceProfile {
|
||||
public int hotseatBarSizePx;
|
||||
public int hotseatBarTopPaddingPx;
|
||||
public final int hotseatBarBottomPaddingPx;
|
||||
public int springLoadedHotseatBarTopMarginPx;
|
||||
// Start is the side next to the nav bar, end is the side next to the workspace
|
||||
public final int hotseatBarSidePaddingStartPx;
|
||||
public final int hotseatBarSidePaddingEndPx;
|
||||
@@ -209,8 +208,13 @@ public class DeviceProfile {
|
||||
|
||||
// Drop Target
|
||||
public int dropTargetBarSizePx;
|
||||
public int dropTargetBarTopMarginPx;
|
||||
public int dropTargetBarBottomMarginPx;
|
||||
public int dropTargetDragPaddingPx;
|
||||
public int dropTargetTextSizePx;
|
||||
public int dropTargetHorizontalPaddingPx;
|
||||
public int dropTargetVerticalPaddingPx;
|
||||
public int dropTargetGapPx;
|
||||
|
||||
// Insets
|
||||
private final Rect mInsets = new Rect();
|
||||
@@ -321,23 +325,6 @@ public class DeviceProfile {
|
||||
folderCellLayoutBorderSpacePx = new Point(folderCellLayoutBorderSpaceOriginalPx,
|
||||
folderCellLayoutBorderSpaceOriginalPx);
|
||||
|
||||
int cellLayoutPaddingLeftRightMultiplier = !isVerticalBarLayout() && isTablet
|
||||
? PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER : 1;
|
||||
int cellLayoutPadding = isScalableGrid
|
||||
? 0
|
||||
: res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_padding);
|
||||
|
||||
if (isTwoPanels) {
|
||||
cellLayoutPaddingLeftRightPx = 0;
|
||||
cellLayoutBottomPaddingPx = 0;
|
||||
} else if (isLandscape) {
|
||||
cellLayoutPaddingLeftRightPx = 0;
|
||||
cellLayoutBottomPaddingPx = cellLayoutPadding;
|
||||
} else {
|
||||
cellLayoutPaddingLeftRightPx = cellLayoutPaddingLeftRightMultiplier * cellLayoutPadding;
|
||||
cellLayoutBottomPaddingPx = 0;
|
||||
}
|
||||
|
||||
workspacePageIndicatorHeight = res.getDimensionPixelSize(
|
||||
R.dimen.workspace_page_indicator_height);
|
||||
mWorkspacePageIndicatorOverlapWorkspace =
|
||||
@@ -347,8 +334,15 @@ public class DeviceProfile {
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding);
|
||||
|
||||
dropTargetBarSizePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_drop_target_size);
|
||||
dropTargetBarTopMarginPx = res.getDimensionPixelSize(R.dimen.drop_target_top_margin);
|
||||
dropTargetBarBottomMarginPx = res.getDimensionPixelSize(R.dimen.drop_target_bottom_margin);
|
||||
dropTargetDragPaddingPx = res.getDimensionPixelSize(R.dimen.drop_target_drag_padding);
|
||||
dropTargetTextSizePx = res.getDimensionPixelSize(R.dimen.drop_target_text_size);
|
||||
dropTargetHorizontalPaddingPx = res.getDimensionPixelSize(
|
||||
R.dimen.drop_target_button_drawable_horizontal_padding);
|
||||
dropTargetVerticalPaddingPx = res.getDimensionPixelSize(
|
||||
R.dimen.drop_target_button_drawable_vertical_padding);
|
||||
dropTargetGapPx = res.getDimensionPixelSize(R.dimen.drop_target_button_gap);
|
||||
|
||||
workspaceSpringLoadedBottomSpace =
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_min_spring_loaded_space);
|
||||
@@ -389,6 +383,8 @@ public class DeviceProfile {
|
||||
+ res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_padding);
|
||||
qsbWidth = 0;
|
||||
}
|
||||
springLoadedHotseatBarTopMarginPx = res.getDimensionPixelSize(
|
||||
R.dimen.spring_loaded_hotseat_top_margin);
|
||||
hotseatBarSidePaddingEndPx =
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding);
|
||||
// Add a bit of space between nav bar and hotseat in vertical bar layout.
|
||||
@@ -482,6 +478,12 @@ public class DeviceProfile {
|
||||
// Recalculate the available dimensions using the new hotseat size.
|
||||
updateAvailableDimensions(res);
|
||||
}
|
||||
|
||||
int cellLayoutPadding =
|
||||
isTwoPanels ? cellLayoutBorderSpacePx.x / 2 : res.getDimensionPixelSize(
|
||||
R.dimen.cell_layout_padding);
|
||||
cellLayoutPaddingPx = new Rect(cellLayoutPadding, cellLayoutPadding, cellLayoutPadding,
|
||||
cellLayoutPadding);
|
||||
updateWorkspacePadding();
|
||||
|
||||
flingToDeleteThresholdVelocity = res.getDimensionPixelSize(
|
||||
@@ -594,7 +596,6 @@ public class DeviceProfile {
|
||||
float appWidgetScaleX = (float) profile.getCellSize().x / getCellSize().x;
|
||||
float appWidgetScaleY = (float) profile.getCellSize().y / getCellSize().y;
|
||||
profile.appWidgetScale.set(appWidgetScaleX, appWidgetScaleY);
|
||||
profile.updateWorkspacePadding();
|
||||
|
||||
return profile;
|
||||
}
|
||||
@@ -629,18 +630,19 @@ public class DeviceProfile {
|
||||
}
|
||||
|
||||
private void updateAllAppsContainerWidth(Resources res) {
|
||||
|
||||
int cellLayoutHorizontalPadding =
|
||||
(cellLayoutPaddingPx.left + cellLayoutPaddingPx.right) / 2;
|
||||
if (isTablet) {
|
||||
allAppsLeftRightPadding =
|
||||
res.getDimensionPixelSize(R.dimen.all_apps_bottom_sheet_horizontal_padding)
|
||||
+ cellLayoutPaddingLeftRightPx;
|
||||
res.getDimensionPixelSize(R.dimen.all_apps_bottom_sheet_horizontal_padding);
|
||||
|
||||
int usedWidth = (allAppsCellWidthPx * numShownAllAppsColumns)
|
||||
+ (allAppsBorderSpacePx.x * (numShownAllAppsColumns - 1))
|
||||
+ allAppsLeftRightPadding * 2;
|
||||
allAppsLeftRightMargin = Math.max(1, (availableWidthPx - usedWidth) / 2);
|
||||
} else {
|
||||
allAppsLeftRightPadding =
|
||||
desiredWorkspaceHorizontalMarginPx + cellLayoutPaddingLeftRightPx;
|
||||
desiredWorkspaceHorizontalMarginPx + cellLayoutHorizontalPadding;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -650,11 +652,12 @@ public class DeviceProfile {
|
||||
private int updateAvailableDimensions(Resources res) {
|
||||
updateIconSize(1f, res);
|
||||
|
||||
updateWorkspacePadding();
|
||||
Point workspacePadding = getTotalWorkspacePadding();
|
||||
|
||||
// Check to see if the icons fit within the available height.
|
||||
float usedHeight = getCellLayoutHeight();
|
||||
final int maxHeight = availableHeightPx - workspacePadding.y;
|
||||
final int maxHeight = getWorkspaceHeight(workspacePadding);
|
||||
float extraHeight = Math.max(0, maxHeight - usedHeight);
|
||||
float scaleY = maxHeight / usedHeight;
|
||||
boolean shouldScale = scaleY < 1f;
|
||||
@@ -664,10 +667,7 @@ public class DeviceProfile {
|
||||
// We scale to fit the cellWidth and cellHeight in the available space.
|
||||
// The benefit of scalable grids is that we can get consistent aspect ratios between
|
||||
// devices.
|
||||
int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns;
|
||||
float usedWidth = (cellWidthPx * numColumns)
|
||||
+ (cellLayoutBorderSpacePx.x * (numColumns - 1))
|
||||
+ (desiredWorkspaceHorizontalMarginPx * 2);
|
||||
float usedWidth = getCellLayoutWidth() + (desiredWorkspaceHorizontalMarginPx * 2);
|
||||
// We do not subtract padding here, as we also scale the workspace padding if needed.
|
||||
scaleX = availableWidthPx / usedWidth;
|
||||
shouldScale = true;
|
||||
@@ -684,7 +684,14 @@ public class DeviceProfile {
|
||||
}
|
||||
|
||||
private int getCellLayoutHeight() {
|
||||
return (cellHeightPx * inv.numRows) + (cellLayoutBorderSpacePx.y * (inv.numRows - 1));
|
||||
return (cellHeightPx * inv.numRows) + (cellLayoutBorderSpacePx.y * (inv.numRows - 1))
|
||||
+ cellLayoutPaddingPx.top + cellLayoutPaddingPx.bottom;
|
||||
}
|
||||
|
||||
private int getCellLayoutWidth() {
|
||||
int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns;
|
||||
return (cellWidthPx * numColumns) + (cellLayoutBorderSpacePx.x * (numColumns - 1))
|
||||
+ cellLayoutPaddingPx.left + cellLayoutPaddingPx.right;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -744,18 +751,6 @@ public class DeviceProfile {
|
||||
}
|
||||
updateHotseatIconSize(iconSizePx);
|
||||
|
||||
if (!isVerticalLayout) {
|
||||
int expectedWorkspaceHeight = availableHeightPx - hotseatBarSizePx
|
||||
- workspacePageIndicatorHeight - edgeMarginPx;
|
||||
float minRequiredHeight = dropTargetBarSizePx + workspaceSpringLoadedBottomSpace;
|
||||
workspaceSpringLoadShrinkFactor = Math.min(
|
||||
res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f,
|
||||
1 - (minRequiredHeight / expectedWorkspaceHeight));
|
||||
} else {
|
||||
workspaceSpringLoadShrinkFactor =
|
||||
res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f;
|
||||
}
|
||||
|
||||
// Folder icon
|
||||
folderIconSizePx = IconNormalizer.getNormalizedCircleSize(iconSizePx);
|
||||
folderIconOffsetYPx = (iconSizePx - folderIconSizePx) / 2;
|
||||
@@ -865,7 +860,6 @@ public class DeviceProfile {
|
||||
|
||||
public void updateInsets(Rect insets) {
|
||||
mInsets.set(insets);
|
||||
updateWorkspacePadding();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -892,23 +886,62 @@ public class DeviceProfile {
|
||||
int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns;
|
||||
int screenWidthPx = getWorkspaceWidth(padding);
|
||||
result.x = calculateCellWidth(screenWidthPx, cellLayoutBorderSpacePx.x, numColumns);
|
||||
result.y = calculateCellHeight(availableHeightPx - padding.y
|
||||
- cellLayoutBottomPaddingPx, cellLayoutBorderSpacePx.y, inv.numRows);
|
||||
int screenHeightPx = getWorkspaceHeight(padding);
|
||||
result.y = calculateCellHeight(screenHeightPx, cellLayoutBorderSpacePx.y, inv.numRows);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the space in px from the bottom of last item in the vertical-bar hotseat to the
|
||||
* bottom of the screen.
|
||||
*/
|
||||
public int getVerticalHotseatLastItemBottomOffset() {
|
||||
int cellHeight = calculateCellHeight(
|
||||
heightPx - mHotseatPadding.top - mHotseatPadding.bottom, hotseatBorderSpace,
|
||||
numShownHotseatIcons);
|
||||
int hotseatSize = (cellHeight * numShownHotseatIcons)
|
||||
+ (hotseatBorderSpace * (numShownHotseatIcons - 1));
|
||||
int extraHotseatEndSpacing = (heightPx - hotseatSize) / 2;
|
||||
int extraIconEndSpacing = (cellHeight - iconSizePx) / 2;
|
||||
return extraHotseatEndSpacing + extraIconEndSpacing + mHotseatPadding.bottom;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the scaled top of the workspace in px for the spring-loaded edit state.
|
||||
*/
|
||||
public float getWorkspaceSpringLoadShrunkTop() {
|
||||
workspaceSpringLoadShrunkTop = mInsets.top + dropTargetBarTopMarginPx + dropTargetBarSizePx
|
||||
+ dropTargetBarBottomMarginPx;
|
||||
return workspaceSpringLoadShrunkTop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the scaled bottom of the workspace in px for the spring-loaded edit state.
|
||||
*/
|
||||
public float getWorkspaceSpringLoadShrunkBottom() {
|
||||
int topOfHotseat = hotseatBarSizePx + springLoadedHotseatBarTopMarginPx;
|
||||
workspaceSpringLoadShrunkBottom =
|
||||
heightPx - (isVerticalBarLayout() ? getVerticalHotseatLastItemBottomOffset()
|
||||
: topOfHotseat);
|
||||
return workspaceSpringLoadShrunkBottom;
|
||||
}
|
||||
|
||||
public int getWorkspaceWidth() {
|
||||
return getWorkspaceWidth(getTotalWorkspacePadding());
|
||||
}
|
||||
|
||||
public int getWorkspaceWidth(Point workspacePadding) {
|
||||
int cellLayoutTotalPadding =
|
||||
isTwoPanels ? 4 * cellLayoutPaddingLeftRightPx : 2 * cellLayoutPaddingLeftRightPx;
|
||||
(isTwoPanels ? 2 : 1) * (cellLayoutPaddingPx.left + cellLayoutPaddingPx.right);
|
||||
return availableWidthPx - workspacePadding.x - cellLayoutTotalPadding;
|
||||
}
|
||||
|
||||
private int getWorkspaceHeight(Point workspacePadding) {
|
||||
return availableHeightPx - workspacePadding.y - (cellLayoutPaddingPx.top
|
||||
+ cellLayoutPaddingPx.bottom);
|
||||
}
|
||||
|
||||
public Point getTotalWorkspacePadding() {
|
||||
updateWorkspacePadding();
|
||||
return new Point(workspacePadding.left + workspacePadding.right,
|
||||
workspacePadding.top + workspacePadding.bottom);
|
||||
}
|
||||
@@ -934,12 +967,26 @@ public class DeviceProfile {
|
||||
int hotseatTop = hotseatBarSizePx;
|
||||
int paddingBottom = hotseatTop + workspacePageIndicatorHeight
|
||||
+ workspaceBottomPadding - mWorkspacePageIndicatorOverlapWorkspace;
|
||||
int paddingTop = workspaceTopPadding + (isScalableGrid ? 0 : edgeMarginPx);
|
||||
int paddingSide = desiredWorkspaceHorizontalMarginPx;
|
||||
|
||||
padding.set(desiredWorkspaceHorizontalMarginPx,
|
||||
workspaceTopPadding + (isScalableGrid ? 0 : edgeMarginPx),
|
||||
desiredWorkspaceHorizontalMarginPx,
|
||||
paddingBottom);
|
||||
padding.set(paddingSide, paddingTop, paddingSide, paddingBottom);
|
||||
}
|
||||
insetPadding(workspacePadding, cellLayoutPaddingPx);
|
||||
}
|
||||
|
||||
private void insetPadding(Rect paddings, Rect insets) {
|
||||
insets.left = Math.min(insets.left, paddings.left);
|
||||
paddings.left -= insets.left;
|
||||
|
||||
insets.top = Math.min(insets.top, paddings.top);
|
||||
paddings.top -= insets.top;
|
||||
|
||||
insets.right = Math.min(insets.right, paddings.right);
|
||||
paddings.right -= insets.right;
|
||||
|
||||
insets.bottom = Math.min(insets.bottom, paddings.bottom);
|
||||
paddings.bottom -= insets.bottom;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -953,16 +1000,17 @@ public class DeviceProfile {
|
||||
// Workspace icons are moved up by a small factor. The variable diffOverlapFactor
|
||||
// is set to account for that difference.
|
||||
float diffOverlapFactor = iconSizePx * (ICON_OVERLAP_FACTOR - 1) / 2;
|
||||
int paddingTop = Math.max((int) (mInsets.top - diffOverlapFactor), 0);
|
||||
int paddingBottom = Math.max((int) (mInsets.bottom + cellLayoutBottomPaddingPx
|
||||
int paddingTop = Math.max((int) (mInsets.top + cellLayoutPaddingPx.top
|
||||
- diffOverlapFactor), 0);
|
||||
int paddingBottom = Math.max((int) (mInsets.bottom + cellLayoutPaddingPx.bottom
|
||||
+ diffOverlapFactor), 0);
|
||||
|
||||
if (isSeascape()) {
|
||||
mHotseatPadding.set(mInsets.left + hotseatBarSidePaddingStartPx,
|
||||
mInsets.top, hotseatBarSidePaddingEndPx, mInsets.bottom);
|
||||
mHotseatPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop,
|
||||
hotseatBarSidePaddingEndPx, paddingBottom);
|
||||
} else {
|
||||
mHotseatPadding.set(hotseatBarSidePaddingEndPx, mInsets.top,
|
||||
mInsets.right + hotseatBarSidePaddingStartPx, mInsets.bottom);
|
||||
mHotseatPadding.set(hotseatBarSidePaddingEndPx, paddingTop,
|
||||
mInsets.right + hotseatBarSidePaddingStartPx, paddingBottom);
|
||||
}
|
||||
} else if (isTaskbarPresent) {
|
||||
int hotseatHeight = workspacePadding.bottom;
|
||||
@@ -1001,14 +1049,12 @@ public class DeviceProfile {
|
||||
float workspaceCellWidth = (float) widthPx / inv.numColumns;
|
||||
float hotseatCellWidth = (float) widthPx / numShownHotseatIcons;
|
||||
int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);
|
||||
mHotseatPadding.set(
|
||||
hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx
|
||||
+ mInsets.left,
|
||||
hotseatBarTopPaddingPx,
|
||||
hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx
|
||||
mHotseatPadding.set(hotseatAdjustment + workspacePadding.left + cellLayoutPaddingPx.left
|
||||
+ mInsets.left, hotseatBarTopPaddingPx,
|
||||
hotseatAdjustment + workspacePadding.right + cellLayoutPaddingPx.right
|
||||
+ mInsets.right,
|
||||
hotseatBarSizePx - hotseatCellHeightPx - hotseatBarTopPaddingPx
|
||||
+ cellLayoutBottomPaddingPx + mInsets.bottom);
|
||||
+ mInsets.bottom);
|
||||
}
|
||||
return mHotseatPadding;
|
||||
}
|
||||
@@ -1092,6 +1138,8 @@ public class DeviceProfile {
|
||||
.getInfo().rotation == Surface.ROTATION_270;
|
||||
if (mIsSeascape != isSeascape) {
|
||||
mIsSeascape = isSeascape;
|
||||
// Hotseat changing sides requires updating workspace left/right paddings
|
||||
updateWorkspacePadding();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1169,6 +1217,11 @@ public class DeviceProfile {
|
||||
cellLayoutBorderSpacePx.x));
|
||||
writer.println(prefix + pxToDpStr("cellLayoutBorderSpacePx Vertical",
|
||||
cellLayoutBorderSpacePx.y));
|
||||
writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.left", cellLayoutPaddingPx.left));
|
||||
writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.top", cellLayoutPaddingPx.top));
|
||||
writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.right", cellLayoutPaddingPx.right));
|
||||
writer.println(
|
||||
prefix + pxToDpStr("cellLayoutPaddingPx.bottom", cellLayoutPaddingPx.bottom));
|
||||
|
||||
writer.println(prefix + pxToDpStr("iconSizePx", iconSizePx));
|
||||
writer.println(prefix + pxToDpStr("iconTextSizePx", iconTextSizePx));
|
||||
@@ -1206,6 +1259,12 @@ public class DeviceProfile {
|
||||
hotseatBarSidePaddingStartPx));
|
||||
writer.println(prefix + pxToDpStr("hotseatBarSidePaddingEndPx",
|
||||
hotseatBarSidePaddingEndPx));
|
||||
writer.println(prefix + pxToDpStr("springLoadedHotseatBarTopMarginPx",
|
||||
springLoadedHotseatBarTopMarginPx));
|
||||
writer.println(prefix + pxToDpStr("mHotseatPadding.top", mHotseatPadding.top));
|
||||
writer.println(prefix + pxToDpStr("mHotseatPadding.bottom", mHotseatPadding.bottom));
|
||||
writer.println(prefix + pxToDpStr("mHotseatPadding.left", mHotseatPadding.left));
|
||||
writer.println(prefix + pxToDpStr("mHotseatPadding.right", mHotseatPadding.right));
|
||||
writer.println(prefix + "\tnumShownHotseatIcons: " + numShownHotseatIcons);
|
||||
writer.println(prefix + pxToDpStr("hotseatBorderSpace", hotseatBorderSpace));
|
||||
writer.println(prefix + "\tisQsbInline: " + isQsbInline);
|
||||
@@ -1256,6 +1315,16 @@ public class DeviceProfile {
|
||||
writer.println(prefix + pxToDpStr("overviewPageSpacing", overviewPageSpacing));
|
||||
writer.println(prefix + pxToDpStr("overviewRowSpacing", overviewRowSpacing));
|
||||
writer.println(prefix + pxToDpStr("overviewGridSideMargin", overviewGridSideMargin));
|
||||
|
||||
writer.println(prefix + pxToDpStr("dropTargetBarTopMarginPx", dropTargetBarTopMarginPx));
|
||||
writer.println(prefix + pxToDpStr("dropTargetBarSizePx", dropTargetBarSizePx));
|
||||
writer.println(
|
||||
prefix + pxToDpStr("dropTargetBarBottomMarginPx", dropTargetBarBottomMarginPx));
|
||||
|
||||
writer.println(
|
||||
prefix + pxToDpStr("workspaceSpringLoadShrunkTop", workspaceSpringLoadShrunkTop));
|
||||
writer.println(prefix + pxToDpStr("workspaceSpringLoadShrunkBottom",
|
||||
workspaceSpringLoadShrunkBottom));
|
||||
}
|
||||
|
||||
private static Context getContext(Context c, Info info, int orientation, WindowBounds bounds) {
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
package com.android.launcher3;
|
||||
|
||||
import static com.android.launcher3.ButtonDropTarget.TOOLTIP_DEFAULT;
|
||||
import static com.android.launcher3.ButtonDropTarget.TOOLTIP_LEFT;
|
||||
import static com.android.launcher3.ButtonDropTarget.TOOLTIP_RIGHT;
|
||||
import static com.android.launcher3.anim.AlphaUpdateListener.updateVisibility;
|
||||
|
||||
import android.animation.TimeInterpolator;
|
||||
@@ -41,6 +39,8 @@ import com.android.launcher3.dragndrop.DragController.DragListener;
|
||||
import com.android.launcher3.dragndrop.DragOptions;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/*
|
||||
* The top bar containing various drop targets: Delete/App Info/Uninstall.
|
||||
*/
|
||||
@@ -94,30 +94,28 @@ public class DropTargetBar extends FrameLayout
|
||||
lp.rightMargin = insets.right;
|
||||
int tooltipLocation = TOOLTIP_DEFAULT;
|
||||
|
||||
if (grid.isVerticalBarLayout()) {
|
||||
lp.width = grid.dropTargetBarSizePx;
|
||||
lp.height = grid.availableHeightPx - 2 * grid.edgeMarginPx;
|
||||
lp.gravity = grid.isSeascape() ? Gravity.RIGHT : Gravity.LEFT;
|
||||
tooltipLocation = grid.isSeascape() ? TOOLTIP_LEFT : TOOLTIP_RIGHT;
|
||||
int horizontalMargin;
|
||||
if (grid.isTablet) {
|
||||
// XXX: If the icon size changes across orientations, we will have to take
|
||||
// that into account here too.
|
||||
horizontalMargin = ((grid.widthPx - 2 * grid.edgeMarginPx
|
||||
- (grid.inv.numColumns * grid.cellWidthPx))
|
||||
/ (2 * (grid.inv.numColumns + 1)))
|
||||
+ grid.edgeMarginPx;
|
||||
} else {
|
||||
int gap;
|
||||
if (grid.isTablet) {
|
||||
// XXX: If the icon size changes across orientations, we will have to take
|
||||
// that into account here too.
|
||||
gap = ((grid.widthPx - 2 * grid.edgeMarginPx
|
||||
- (grid.inv.numColumns * grid.cellWidthPx))
|
||||
/ (2 * (grid.inv.numColumns + 1)))
|
||||
+ grid.edgeMarginPx;
|
||||
} else {
|
||||
gap = getContext().getResources()
|
||||
.getDimensionPixelSize(R.dimen.drop_target_bar_margin_horizontal);
|
||||
}
|
||||
lp.width = grid.availableWidthPx - 2 * gap;
|
||||
|
||||
lp.topMargin += grid.edgeMarginPx;
|
||||
lp.height = grid.dropTargetBarSizePx;
|
||||
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
|
||||
horizontalMargin = getContext().getResources()
|
||||
.getDimensionPixelSize(R.dimen.drop_target_bar_margin_horizontal);
|
||||
}
|
||||
lp.topMargin += grid.dropTargetBarTopMarginPx;
|
||||
lp.bottomMargin += grid.dropTargetBarBottomMarginPx;
|
||||
lp.width = grid.availableWidthPx - 2 * horizontalMargin;
|
||||
if (mIsVertical) {
|
||||
lp.leftMargin = (grid.widthPx - lp.width) / 2;
|
||||
lp.rightMargin = (grid.widthPx - lp.width) / 2;
|
||||
}
|
||||
lp.height = grid.dropTargetBarSizePx;
|
||||
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
|
||||
|
||||
setLayoutParams(lp);
|
||||
for (ButtonDropTarget button : mDropTargets) {
|
||||
button.setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.dropTargetTextSizePx);
|
||||
@@ -139,19 +137,7 @@ public class DropTargetBar extends FrameLayout
|
||||
int height = MeasureSpec.getSize(heightMeasureSpec);
|
||||
|
||||
int visibleCount = getVisibleButtonsCount();
|
||||
if (visibleCount == 0) {
|
||||
// do nothing
|
||||
} else if (mIsVertical) {
|
||||
int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
|
||||
int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);
|
||||
|
||||
for (ButtonDropTarget button : mDropTargets) {
|
||||
if (button.getVisibility() != GONE) {
|
||||
button.setTextVisible(false);
|
||||
button.measure(widthSpec, heightSpec);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (visibleCount > 0) {
|
||||
int availableWidth = width / visibleCount;
|
||||
boolean textVisible = true;
|
||||
for (ButtonDropTarget buttons : mDropTargets) {
|
||||
@@ -176,31 +162,91 @@ public class DropTargetBar extends FrameLayout
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
int visibleCount = getVisibleButtonsCount();
|
||||
if (visibleCount == 0) {
|
||||
// do nothing
|
||||
} else if (mIsVertical) {
|
||||
int gap = getResources().getDimensionPixelSize(R.dimen.drop_target_vertical_gap);
|
||||
int start = gap;
|
||||
int end;
|
||||
return;
|
||||
}
|
||||
|
||||
for (ButtonDropTarget button : mDropTargets) {
|
||||
if (button.getVisibility() != GONE) {
|
||||
end = start + button.getMeasuredHeight();
|
||||
button.layout(0, start, button.getMeasuredWidth(), end);
|
||||
start = end + gap;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
int frameSize = (right - left) / visibleCount;
|
||||
Launcher launcher = Launcher.getLauncher(getContext());
|
||||
Workspace workspace = launcher.getWorkspace();
|
||||
DeviceProfile dp = launcher.getDeviceProfile();
|
||||
int buttonHorizontalPadding = dp.dropTargetHorizontalPaddingPx;
|
||||
int buttonVerticalPadding = dp.dropTargetVerticalPaddingPx;
|
||||
int barCenter = (right - left) / 2;
|
||||
|
||||
int start = frameSize / 2;
|
||||
int halfWidth;
|
||||
for (ButtonDropTarget button : mDropTargets) {
|
||||
if (button.getVisibility() != GONE) {
|
||||
halfWidth = button.getMeasuredWidth() / 2;
|
||||
button.layout(start - halfWidth, 0,
|
||||
start + halfWidth, button.getMeasuredHeight());
|
||||
start = start + frameSize;
|
||||
ButtonDropTarget[] visibleButtons = Arrays.stream(mDropTargets)
|
||||
.filter(b -> b.getVisibility() != GONE)
|
||||
.toArray(ButtonDropTarget[]::new);
|
||||
Arrays.stream(visibleButtons).forEach(
|
||||
b -> b.setPadding(buttonHorizontalPadding, buttonVerticalPadding,
|
||||
buttonHorizontalPadding, buttonVerticalPadding));
|
||||
|
||||
if (visibleCount == 1) {
|
||||
ButtonDropTarget button = visibleButtons[0];
|
||||
button.layout(barCenter - (button.getMeasuredWidth() / 2), 0,
|
||||
barCenter + (button.getMeasuredWidth() / 2), button.getMeasuredHeight());
|
||||
} else if (visibleCount == 2) {
|
||||
int buttonGap = dp.dropTargetGapPx;
|
||||
|
||||
if (dp.isTwoPanels) {
|
||||
ButtonDropTarget leftButton = visibleButtons[0];
|
||||
leftButton.layout(barCenter - leftButton.getMeasuredWidth() - (buttonGap / 2), 0,
|
||||
barCenter - (buttonGap / 2), leftButton.getMeasuredHeight());
|
||||
|
||||
ButtonDropTarget rightButton = visibleButtons[1];
|
||||
rightButton.layout(barCenter + (buttonGap / 2), 0,
|
||||
barCenter + rightButton.getMeasuredWidth() + (buttonGap / 2),
|
||||
rightButton.getMeasuredHeight());
|
||||
} else if (dp.isTablet) {
|
||||
int numberOfMargins = visibleCount - 1;
|
||||
int buttonWidths = Arrays.stream(mDropTargets)
|
||||
.filter(b -> b.getVisibility() != GONE)
|
||||
.mapToInt(ButtonDropTarget::getMeasuredWidth)
|
||||
.sum();
|
||||
int totalWidth = buttonWidths + (numberOfMargins * buttonGap);
|
||||
int buttonsStartMargin = barCenter - (totalWidth / 2);
|
||||
|
||||
int start = buttonsStartMargin;
|
||||
for (ButtonDropTarget button : visibleButtons) {
|
||||
int margin = (start != buttonsStartMargin) ? buttonGap : 0;
|
||||
button.layout(start + margin, 0, start + margin + button.getMeasuredWidth(),
|
||||
button.getMeasuredHeight());
|
||||
start += button.getMeasuredWidth() + margin;
|
||||
}
|
||||
} else if (mIsVertical) {
|
||||
// Center buttons over workspace, not screen.
|
||||
int verticalCenter = (workspace.getRight() - workspace.getLeft()) / 2;
|
||||
ButtonDropTarget leftButton = visibleButtons[0];
|
||||
leftButton.layout(verticalCenter - leftButton.getMeasuredWidth() - (buttonGap / 2),
|
||||
0, verticalCenter - (buttonGap / 2), leftButton.getMeasuredHeight());
|
||||
|
||||
ButtonDropTarget rightButton = visibleButtons[1];
|
||||
rightButton.layout(verticalCenter + (buttonGap / 2), 0,
|
||||
verticalCenter + rightButton.getMeasuredWidth() + (buttonGap / 2),
|
||||
rightButton.getMeasuredHeight());
|
||||
} else if (dp.isPhone) {
|
||||
// Buttons aligned to outer edges of scaled workspace.
|
||||
float shrunkTop = dp.getWorkspaceSpringLoadShrunkTop();
|
||||
float shrunkBottom = dp.getWorkspaceSpringLoadShrunkBottom();
|
||||
float scale =
|
||||
(shrunkBottom - shrunkTop) / launcher.getWorkspace().getNormalChildHeight();
|
||||
int workspaceWidth = (int) (launcher.getWorkspace().getNormalChildWidth() * scale);
|
||||
int start = barCenter - (workspaceWidth / 2);
|
||||
int end = barCenter + (workspaceWidth / 2);
|
||||
|
||||
ButtonDropTarget leftButton = visibleButtons[0];
|
||||
ButtonDropTarget rightButton = visibleButtons[1];
|
||||
|
||||
// If the text within the buttons is too long, the buttons can overlap
|
||||
int overlap = start + leftButton.getMeasuredWidth() + rightButton.getMeasuredWidth()
|
||||
- end;
|
||||
if (overlap > 0) {
|
||||
start -= overlap / 2;
|
||||
end += overlap / 2;
|
||||
}
|
||||
|
||||
leftButton.layout(start, 0, start + leftButton.getMeasuredWidth(),
|
||||
leftButton.getMeasuredHeight());
|
||||
rightButton.layout(end - rightButton.getMeasuredWidth(), 0, end,
|
||||
rightButton.getMeasuredHeight());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP
|
||||
import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.DISMISS_PREDICTION;
|
||||
import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.RECONFIGURE;
|
||||
import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.UNINSTALL;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_DISMISS_PREDICTION_UNDO;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_DONT_SUGGEST;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_UNINSTALL;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_UNINSTALL_CANCELLED;
|
||||
@@ -46,6 +47,7 @@ import com.android.launcher3.model.data.ItemInfoWithIcon;
|
||||
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
|
||||
import com.android.launcher3.util.PackageManagerHelper;
|
||||
import com.android.launcher3.util.PendingRequestArgs;
|
||||
import com.android.launcher3.views.Snackbar;
|
||||
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
|
||||
|
||||
import java.net.URISyntaxException;
|
||||
@@ -220,7 +222,8 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList
|
||||
|
||||
@Override
|
||||
public void completeDrop(final DragObject d) {
|
||||
ComponentName target = performDropAction(getViewUnderDrag(d.dragInfo), d.dragInfo);
|
||||
ComponentName target = performDropAction(getViewUnderDrag(d.dragInfo), d.dragInfo,
|
||||
d.logInstanceId);
|
||||
if (d.dragSource instanceof DeferredOnComplete) {
|
||||
DeferredOnComplete deferred = (DeferredOnComplete) d.dragSource;
|
||||
if (target != null) {
|
||||
@@ -264,7 +267,7 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList
|
||||
* Performs the drop action and returns the target component for the dragObject or null if
|
||||
* the action was not performed.
|
||||
*/
|
||||
protected ComponentName performDropAction(View view, ItemInfo info) {
|
||||
protected ComponentName performDropAction(View view, ItemInfo info, InstanceId instanceId) {
|
||||
if (mCurrentAccessibilityAction == RECONFIGURE) {
|
||||
int widgetId = getReconfigurableWidgetId(view);
|
||||
if (widgetId != INVALID_APPWIDGET_ID) {
|
||||
@@ -276,7 +279,16 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList
|
||||
return null;
|
||||
}
|
||||
if (mCurrentAccessibilityAction == DISMISS_PREDICTION) {
|
||||
// We sent the log event, nothing else left to do
|
||||
if (FeatureFlags.ENABLE_DISMISS_PREDICTION_UNDO.get()) {
|
||||
mLauncher.getDragLayer()
|
||||
.announceForAccessibility(getContext().getString(R.string.item_removed));
|
||||
Snackbar.show(mLauncher, R.string.item_removed, R.string.undo, () -> { }, () -> {
|
||||
mStatsLogManager.logger()
|
||||
.withInstanceId(instanceId)
|
||||
.withItemInfo(info)
|
||||
.log(LAUNCHER_DISMISS_PREDICTION_UNDO);
|
||||
});
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// else: mCurrentAccessibilityAction == UNINSTALL
|
||||
@@ -303,8 +315,9 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList
|
||||
|
||||
@Override
|
||||
public void onAccessibilityDrop(View view, ItemInfo item) {
|
||||
doLog(new InstanceIdSequence().newInstanceId(), item);
|
||||
performDropAction(view, item);
|
||||
InstanceId instanceId = new InstanceIdSequence().newInstanceId();
|
||||
doLog(instanceId, item);
|
||||
performDropAction(view, item, instanceId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -325,37 +325,14 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
setPageSpacing(Math.max(maxInsets, maxPadding));
|
||||
}
|
||||
|
||||
updateWorkspaceScreensPadding();
|
||||
updateCellLayoutPadding();
|
||||
updateWorkspaceWidgetsSizes();
|
||||
}
|
||||
|
||||
private void updateWorkspaceScreensPadding() {
|
||||
DeviceProfile grid = mLauncher.getDeviceProfile();
|
||||
int paddingLeftRight = grid.cellLayoutPaddingLeftRightPx;
|
||||
int paddingBottom = grid.cellLayoutBottomPaddingPx;
|
||||
|
||||
int panelCount = getPanelCount();
|
||||
int rightPanelModulus = mIsRtl ? 0 : panelCount - 1;
|
||||
int leftPanelModulus = mIsRtl ? panelCount - 1 : 0;
|
||||
int numberOfScreens = mScreenOrder.size();
|
||||
for (int i = 0; i < numberOfScreens; i++) {
|
||||
int paddingLeft = paddingLeftRight;
|
||||
int paddingRight = paddingLeftRight;
|
||||
// Add missing cellLayout border in-between panels.
|
||||
if (panelCount > 1) {
|
||||
if (i % panelCount == leftPanelModulus) {
|
||||
paddingRight += grid.cellLayoutBorderSpacePx.x / 2;
|
||||
} else if (i % panelCount == rightPanelModulus) { // right side panel
|
||||
paddingLeft += grid.cellLayoutBorderSpacePx.x / 2;
|
||||
} else { // middle panel
|
||||
paddingLeft += grid.cellLayoutBorderSpacePx.x / 2;
|
||||
paddingRight += grid.cellLayoutBorderSpacePx.x / 2;
|
||||
}
|
||||
}
|
||||
// SparseArrayMap doesn't keep the order
|
||||
mWorkspaceScreens.get(mScreenOrder.get(i))
|
||||
.setPadding(paddingLeft, 0, paddingRight, paddingBottom);
|
||||
}
|
||||
private void updateCellLayoutPadding() {
|
||||
Rect padding = mLauncher.getDeviceProfile().cellLayoutPaddingPx;
|
||||
mWorkspaceScreens.forEach(
|
||||
s -> s.setPadding(padding.left, padding.top, padding.right, padding.bottom));
|
||||
}
|
||||
|
||||
private void updateWorkspaceWidgetsSizes() {
|
||||
@@ -653,7 +630,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
mLauncher.getStateManager().getState(), newScreen, insertIndex);
|
||||
|
||||
updatePageScrollValues();
|
||||
updateWorkspaceScreensPadding();
|
||||
updateCellLayoutPadding();
|
||||
return newScreen;
|
||||
}
|
||||
|
||||
|
||||
@@ -92,8 +92,6 @@ public class WorkAdapterProvider extends BaseAdapterProvider {
|
||||
TextView title = view.findViewById(R.id.work_apps_paused_title);
|
||||
title.setText(cache.workProfileEdu);
|
||||
|
||||
Button button = view.findViewById(R.id.action_btn);
|
||||
button.setText(cache.workProfileEduAccept);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -265,6 +265,10 @@ public final class FeatureFlags {
|
||||
"USE_LOCAL_ICON_OVERRIDES", true,
|
||||
"Use inbuilt monochrome icons if app doesn't provide one");
|
||||
|
||||
public static final BooleanFlag ENABLE_DISMISS_PREDICTION_UNDO = getDebugFlag(
|
||||
"ENABLE_DISMISS_PREDICTION_UNDO", false,
|
||||
"Show an 'Undo' snackbar when users dismiss a predicted hotseat item");
|
||||
|
||||
public static void initialize(Context context) {
|
||||
synchronized (sDebugFlags) {
|
||||
for (DebugFlag flag : sDebugFlags) {
|
||||
|
||||
@@ -225,21 +225,21 @@ public class LauncherPreviewRenderer extends ContextWrapper
|
||||
mHotseat.resetLayout(false);
|
||||
|
||||
CellLayout firstScreen = mRootView.findViewById(R.id.workspace);
|
||||
firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingLeftRightPx,
|
||||
mDp.workspacePadding.top,
|
||||
firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingPx.left,
|
||||
mDp.workspacePadding.top + mDp.cellLayoutPaddingPx.top,
|
||||
(mDp.isTwoPanels ? mDp.cellLayoutBorderSpacePx.x / 2
|
||||
: mDp.workspacePadding.right) + mDp.cellLayoutPaddingLeftRightPx,
|
||||
mDp.workspacePadding.bottom
|
||||
: mDp.workspacePadding.right) + mDp.cellLayoutPaddingPx.right,
|
||||
mDp.workspacePadding.bottom + mDp.cellLayoutPaddingPx.bottom
|
||||
);
|
||||
mWorkspaceScreens.put(FIRST_SCREEN_ID, firstScreen);
|
||||
|
||||
if (mDp.isTwoPanels) {
|
||||
CellLayout rightPanel = mRootView.findViewById(R.id.workspace_right);
|
||||
rightPanel.setPadding(
|
||||
mDp.cellLayoutBorderSpacePx.x / 2 + mDp.cellLayoutPaddingLeftRightPx,
|
||||
mDp.workspacePadding.top,
|
||||
mDp.workspacePadding.right + mDp.cellLayoutPaddingLeftRightPx,
|
||||
mDp.workspacePadding.bottom
|
||||
mDp.cellLayoutBorderSpacePx.x / 2 + mDp.cellLayoutPaddingPx.left,
|
||||
mDp.workspacePadding.top + mDp.cellLayoutPaddingPx.top,
|
||||
mDp.workspacePadding.right + mDp.cellLayoutPaddingPx.right,
|
||||
mDp.workspacePadding.bottom + mDp.cellLayoutPaddingPx.bottom
|
||||
);
|
||||
mWorkspaceScreens.put(Workspace.SECOND_SCREEN_ID, rightPanel);
|
||||
}
|
||||
|
||||
@@ -579,7 +579,10 @@ public class StatsLogManager implements ResourceBasedOverride {
|
||||
LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS(1010),
|
||||
|
||||
@UiEvent(doc = "User tapped taskbar a11y button")
|
||||
LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS(1011);
|
||||
LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS(1011),
|
||||
|
||||
@UiEvent(doc = "Show an 'Undo' snackbar when users dismiss a predicted hotseat item")
|
||||
LAUNCHER_DISMISS_PREDICTION_UNDO(1035);
|
||||
|
||||
// ADD MORE
|
||||
|
||||
|
||||
@@ -113,13 +113,17 @@ public class SecondaryDragLayer extends BaseDragLayer<SecondaryDisplayLauncher>
|
||||
for (int i = 0; i < count; i++) {
|
||||
final View child = getChildAt(i);
|
||||
if (child == mAppsView) {
|
||||
int padding = 2 * (grid.desiredWorkspaceHorizontalMarginPx
|
||||
+ grid.cellLayoutPaddingLeftRightPx);
|
||||
int horizontalPadding = (2 * grid.desiredWorkspaceHorizontalMarginPx)
|
||||
+ grid.cellLayoutPaddingPx.left + grid.cellLayoutPaddingPx.right;
|
||||
int verticalPadding =
|
||||
grid.cellLayoutPaddingPx.top + grid.cellLayoutPaddingPx.bottom;
|
||||
|
||||
int maxWidth = grid.allAppsCellWidthPx * grid.numShownAllAppsColumns + padding;
|
||||
int maxWidth =
|
||||
grid.allAppsCellWidthPx * grid.numShownAllAppsColumns + horizontalPadding;
|
||||
int appsWidth = Math.min(width, maxWidth);
|
||||
|
||||
int maxHeight = grid.allAppsCellHeightPx * grid.numShownAllAppsColumns + padding;
|
||||
int maxHeight =
|
||||
grid.allAppsCellHeightPx * grid.numShownAllAppsColumns + verticalPadding;
|
||||
int appsHeight = Math.min(height, maxHeight);
|
||||
|
||||
mAppsView.measure(
|
||||
|
||||
@@ -18,7 +18,6 @@ package com.android.launcher3.states;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Launcher;
|
||||
@@ -52,28 +51,15 @@ public class SpringLoadedState extends LauncherState {
|
||||
return super.getWorkspaceScaleAndTranslation(launcher);
|
||||
}
|
||||
|
||||
if (grid.isVerticalBarLayout()) {
|
||||
float scale = grid.workspaceSpringLoadShrinkFactor;
|
||||
return new ScaleAndTranslation(scale, 0, 0);
|
||||
}
|
||||
|
||||
float scale = grid.workspaceSpringLoadShrinkFactor;
|
||||
Rect insets = launcher.getDragLayer().getInsets();
|
||||
|
||||
float scaledHeight = scale * ws.getNormalChildHeight();
|
||||
float shrunkTop = insets.top + grid.dropTargetBarSizePx;
|
||||
float shrunkBottom = ws.getMeasuredHeight() - insets.bottom
|
||||
- grid.workspacePadding.bottom
|
||||
- grid.workspaceSpringLoadedBottomSpace;
|
||||
float totalShrunkSpace = shrunkBottom - shrunkTop;
|
||||
|
||||
float desiredCellTop = shrunkTop + (totalShrunkSpace - scaledHeight) / 2;
|
||||
float shrunkTop = grid.getWorkspaceSpringLoadShrunkTop();
|
||||
float shrunkBottom = grid.getWorkspaceSpringLoadShrunkBottom();
|
||||
float scale = (shrunkBottom - shrunkTop) / ws.getNormalChildHeight();
|
||||
|
||||
float halfHeight = ws.getHeight() / 2;
|
||||
float myCenter = ws.getTop() + halfHeight;
|
||||
float cellTopFromCenter = halfHeight - ws.getChildAt(0).getTop();
|
||||
float actualCellTop = myCenter - cellTopFromCenter * scale;
|
||||
return new ScaleAndTranslation(scale, 0, (desiredCellTop - actualCellTop) / scale);
|
||||
return new ScaleAndTranslation(scale, 0, (shrunkTop - actualCellTop) / scale);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user