Merge "Removing the SearchDropTarget bar as it no longer contains the QSB" into ub-launcher3-calgary
This commit is contained in:
@@ -51,12 +51,8 @@
|
||||
android:layout_gravity="right" />
|
||||
|
||||
<include
|
||||
android:id="@+id/app_info_drop_target_bar"
|
||||
layout="@layout/drop_target_bar_vert_info" />
|
||||
|
||||
<include
|
||||
android:id="@+id/search_drop_target_bar"
|
||||
layout="@layout/drop_target_bar_vert_search" />
|
||||
android:id="@+id/drop_target_bar"
|
||||
layout="@layout/drop_target_bar_vert" />
|
||||
|
||||
<include layout="@layout/overview_panel"
|
||||
android:id="@+id/overview_panel"
|
||||
|
||||
@@ -60,15 +60,11 @@
|
||||
<com.android.launcher3.pageindicators.PageIndicatorLine
|
||||
android:id="@+id/page_indicator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp" />
|
||||
android:layout_height="@dimen/dynamic_grid_page_indicator_height" />
|
||||
|
||||
<include
|
||||
android:id="@+id/app_info_drop_target_bar"
|
||||
layout="@layout/drop_target_bar_horz_info" />
|
||||
|
||||
<include
|
||||
android:id="@+id/search_drop_target_bar"
|
||||
layout="@layout/drop_target_bar_horz_search" />
|
||||
android:id="@+id/drop_target_bar"
|
||||
layout="@layout/drop_target_bar_horz" />
|
||||
|
||||
<include layout="@layout/widgets_view"
|
||||
android:id="@+id/widgets_view"
|
||||
|
||||
@@ -51,12 +51,8 @@
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<include
|
||||
android:id="@+id/app_info_drop_target_bar"
|
||||
layout="@layout/drop_target_bar_horz_info" />
|
||||
|
||||
<include
|
||||
android:id="@+id/search_drop_target_bar"
|
||||
layout="@layout/drop_target_bar_horz_search" />
|
||||
android:id="@+id/drop_target_bar"
|
||||
layout="@layout/drop_target_bar_horz" />
|
||||
|
||||
<include layout="@layout/overview_panel"
|
||||
android:id="@+id/overview_panel"
|
||||
@@ -67,7 +63,7 @@
|
||||
<com.android.launcher3.pageindicators.PageIndicatorLine
|
||||
android:id="@+id/page_indicator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp" />
|
||||
android:layout_height="@dimen/dynamic_grid_page_indicator_height" />
|
||||
|
||||
<include layout="@layout/widgets_view"
|
||||
android:id="@+id/widgets_view"
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2015 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.
|
||||
-->
|
||||
<com.android.launcher3.DropTargetBar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:launcher="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dynamic_grid_drop_target_size"
|
||||
android:layout_gravity="center_horizontal|top"
|
||||
android:focusable="false">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" >
|
||||
|
||||
<!-- Delete target -->
|
||||
|
||||
<com.android.launcher3.DeleteDropTarget
|
||||
launcher:hideParentOnDisable="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:id="@+id/delete_target_text"
|
||||
style="@style/DropTargetButton"
|
||||
android:text="@string/remove_drop_target_label" />
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" >
|
||||
|
||||
<!-- App Info -->
|
||||
|
||||
<com.android.launcher3.InfoDropTarget
|
||||
launcher:hideParentOnDisable="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:id="@+id/info_target_text"
|
||||
style="@style/DropTargetButton"
|
||||
android:text="@string/app_info_drop_target_label" />
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" >
|
||||
|
||||
<!-- Uninstall target -->
|
||||
|
||||
<com.android.launcher3.UninstallDropTarget
|
||||
launcher:hideParentOnDisable="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:id="@+id/uninstall_target_text"
|
||||
style="@style/DropTargetButton"
|
||||
android:text="@string/uninstall_drop_target_label" />
|
||||
</FrameLayout>
|
||||
|
||||
</com.android.launcher3.DropTargetBar>
|
||||
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2016 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.
|
||||
-->
|
||||
<com.android.launcher3.AppInfoDropTargetBar xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:focusable="false" >
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/drag_target_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<!-- Info target -->
|
||||
|
||||
<com.android.launcher3.InfoDropTarget
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:id="@+id/info_target_text"
|
||||
style="@style/DropTargetButton"
|
||||
android:text="@string/app_info_drop_target_label" />
|
||||
</FrameLayout>
|
||||
</com.android.launcher3.AppInfoDropTargetBar>
|
||||
@@ -1,69 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2015 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.
|
||||
-->
|
||||
<com.android.launcher3.SearchDropTargetBar xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:launcher="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_horizontal|top"
|
||||
android:focusable="false">
|
||||
|
||||
<!-- Drag specific targets container -->
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/drag_target_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center" >
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" >
|
||||
|
||||
<!-- Delete target -->
|
||||
|
||||
<com.android.launcher3.DeleteDropTarget
|
||||
launcher:hideParentOnDisable="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:id="@+id/delete_target_text"
|
||||
style="@style/DropTargetButton"
|
||||
android:text="@string/remove_drop_target_label" />
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" >
|
||||
|
||||
<!-- Uninstall target -->
|
||||
|
||||
<com.android.launcher3.UninstallDropTarget
|
||||
launcher:hideParentOnDisable="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:id="@+id/uninstall_target_text"
|
||||
style="@style/DropTargetButton"
|
||||
android:text="@string/uninstall_drop_target_label" />
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</com.android.launcher3.SearchDropTargetBar>
|
||||
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2016 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.
|
||||
-->
|
||||
<com.android.launcher3.DropTargetBar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="@dimen/dynamic_grid_drop_target_size"
|
||||
android:orientation="vertical"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="left"
|
||||
android:focusable="false"
|
||||
android:paddingTop="@dimen/vert_drop_target_vertical_gap" >
|
||||
|
||||
<!-- Delete target -->
|
||||
<com.android.launcher3.DeleteDropTarget
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dynamic_grid_drop_target_size"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="@dimen/vert_drop_target_horizontal_gap"
|
||||
android:paddingRight="@dimen/vert_drop_target_horizontal_gap"
|
||||
android:id="@+id/delete_target_text"
|
||||
android:textColor="@android:color/white" />
|
||||
|
||||
<!-- Uninstall target -->
|
||||
<com.android.launcher3.UninstallDropTarget
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dynamic_grid_drop_target_size"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="@dimen/vert_drop_target_horizontal_gap"
|
||||
android:paddingRight="@dimen/vert_drop_target_horizontal_gap"
|
||||
android:id="@+id/uninstall_target_text"
|
||||
android:textColor="@android:color/white"
|
||||
android:layout_marginTop="@dimen/vert_drop_target_vertical_gap"/>
|
||||
|
||||
<Space
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<!-- App Info -->
|
||||
<com.android.launcher3.InfoDropTarget
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dynamic_grid_drop_target_size"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="@dimen/vert_drop_target_horizontal_gap"
|
||||
android:paddingRight="@dimen/vert_drop_target_horizontal_gap"
|
||||
android:id="@+id/info_target_text"
|
||||
android:textColor="@android:color/white"
|
||||
android:layout_marginBottom="64dp"/>
|
||||
|
||||
</com.android.launcher3.DropTargetBar>
|
||||
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2016 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.
|
||||
-->
|
||||
<com.android.launcher3.AppInfoDropTargetBar xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="match_parent"
|
||||
android:focusable="false" >
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/drag_target_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<!-- Info target -->
|
||||
<com.android.launcher3.InfoDropTarget
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="14dp"
|
||||
android:paddingRight="14dp"
|
||||
android:textColor="@android:color/white"
|
||||
android:id="@+id/info_target_text" />
|
||||
</FrameLayout>
|
||||
|
||||
</com.android.launcher3.AppInfoDropTargetBar>
|
||||
@@ -1,56 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2015 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.
|
||||
-->
|
||||
<com.android.launcher3.SearchDropTargetBar xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="match_parent"
|
||||
android:focusable="false">
|
||||
|
||||
<!-- Drag specific targets container -->
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/drag_target_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:layout_gravity="center"
|
||||
android:paddingTop="20dp">
|
||||
|
||||
<!-- Delete target -->
|
||||
<com.android.launcher3.DeleteDropTarget
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="14dp"
|
||||
android:paddingRight="14dp"
|
||||
android:id="@+id/delete_target_text"
|
||||
android:textColor="@android:color/white"
|
||||
android:layout_marginBottom="10dp" />
|
||||
|
||||
<!-- Uninstall target -->
|
||||
<com.android.launcher3.UninstallDropTarget
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="14dp"
|
||||
android:paddingRight="14dp"
|
||||
android:id="@+id/uninstall_target_text"
|
||||
android:textColor="@android:color/white"
|
||||
android:layout_marginTop="10dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
</com.android.launcher3.SearchDropTargetBar>
|
||||
+10
-13
@@ -17,19 +17,7 @@
|
||||
<resources>
|
||||
<!-- Dynamic Grid -->
|
||||
<dimen name="dynamic_grid_edge_margin">6dp</dimen>
|
||||
<dimen name="dynamic_grid_search_bar_height">48dp</dimen>
|
||||
<!-- We want 46dp extra for the tall search bar. -->
|
||||
<dimen name="dynamic_grid_search_bar_height_tall">94dp</dimen>
|
||||
<dimen name="qsb_internal_padding_top">8dp</dimen>
|
||||
<dimen name="qsb_internal_padding_bottom">8dp</dimen>
|
||||
<dimen name="dynamic_grid_search_bar_extra_top_padding">0dp</dimen>
|
||||
<!-- Reduce the space between the status bar and the search bar when the search bar is tall -->
|
||||
<dimen name="dynamic_grid_search_bar_negative_top_padding_short">-4dp</dimen>
|
||||
<dimen name="dynamic_grid_search_bar_bottom_padding">4dp</dimen>
|
||||
<!-- Reduce the padding between the search bar and workspace when the search bar is tall -->
|
||||
<dimen name="dynamic_grid_search_bar_bottom_negative_padding_short">-6dp</dimen>
|
||||
<dimen name="dynamic_grid_search_bar_bottom_padding_tablet">16dp</dimen>
|
||||
<dimen name="dynamic_grid_page_indicator_height">20dp</dimen>
|
||||
<dimen name="dynamic_grid_page_indicator_height">1dp</dimen>
|
||||
<dimen name="dynamic_grid_icon_drawable_padding">4dp</dimen>
|
||||
<dimen name="dynamic_grid_workspace_page_spacing">8dp</dimen>
|
||||
<dimen name="dynamic_grid_overview_min_icon_zone_height">80dp</dimen>
|
||||
@@ -37,6 +25,15 @@
|
||||
<dimen name="dynamic_grid_overview_bar_item_width">80dp</dimen>
|
||||
<dimen name="dynamic_grid_overview_bar_spacer_width">20dp</dimen>
|
||||
|
||||
<dimen name="dynamic_grid_workspace_top_padding">12dp</dimen>
|
||||
<!-- Minimum space between workspace and hotseat in spring loaded mode -->
|
||||
<dimen name="dynamic_grid_min_spring_loaded_space">8dp</dimen>
|
||||
|
||||
<!-- Drop target bar -->
|
||||
<dimen name="dynamic_grid_drop_target_size">48dp</dimen>
|
||||
<dimen name="vert_drop_target_vertical_gap">20dp</dimen>
|
||||
<dimen name="vert_drop_target_horizontal_gap">14dp</dimen>
|
||||
|
||||
<!-- App Widget resize frame -->
|
||||
<dimen name="default_widget_padding">8dp</dimen>
|
||||
<dimen name="widget_handle_margin">13dp</dimen>
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.launcher3;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import com.android.launcher3.dragndrop.DragController;
|
||||
|
||||
public class AppInfoDropTargetBar extends BaseDropTargetBar {
|
||||
private ButtonDropTarget mAppInfoDropTarget;
|
||||
|
||||
public AppInfoDropTargetBar(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public AppInfoDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
// Get the individual components
|
||||
mAppInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
|
||||
|
||||
mAppInfoDropTarget.setDropTargetBar(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setup(Launcher launcher, DragController dragController) {
|
||||
dragController.addDragListener(this);
|
||||
|
||||
dragController.addDragListener(mAppInfoDropTarget);
|
||||
dragController.addDropTarget(mAppInfoDropTarget);
|
||||
|
||||
mAppInfoDropTarget.setLauncher(launcher);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showDropTargets() {
|
||||
animateDropTargetBarToAlpha(1f, DEFAULT_DRAG_FADE_DURATION);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideDropTargets() {
|
||||
animateDropTargetBarToAlpha(0f, DEFAULT_DRAG_FADE_DURATION);
|
||||
}
|
||||
|
||||
private void animateDropTargetBarToAlpha(float alpha, int duration) {
|
||||
resetAnimation(duration);
|
||||
if (duration > 0) {
|
||||
animateAlpha(mDropTargetBar, alpha, DEFAULT_INTERPOLATOR);
|
||||
mCurrentAnimation.start();
|
||||
} else {
|
||||
mDropTargetBar.setAlpha(alpha);
|
||||
AlphaUpdateListener.updateVisibility(mDropTargetBar, mAccessibilityEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enableAccessibleDrag(boolean enable) {
|
||||
mAppInfoDropTarget.enableAccessibleDrag(enable);
|
||||
}
|
||||
}
|
||||
@@ -1,146 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.launcher3;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.view.animation.AccelerateInterpolator;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.android.launcher3.dragndrop.DragController;
|
||||
|
||||
/**
|
||||
* Base class for drop target bars (where you can drop apps to do actions such as uninstall).
|
||||
*/
|
||||
public abstract class BaseDropTargetBar extends FrameLayout implements DragController.DragListener {
|
||||
protected static final int DEFAULT_DRAG_FADE_DURATION = 175;
|
||||
protected static final TimeInterpolator DEFAULT_INTERPOLATOR = new AccelerateInterpolator();
|
||||
|
||||
protected View mDropTargetBar;
|
||||
protected boolean mAccessibilityEnabled = false;
|
||||
|
||||
protected AnimatorSet mCurrentAnimation;
|
||||
protected boolean mDeferOnDragEnd;
|
||||
|
||||
public BaseDropTargetBar(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public BaseDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
mDropTargetBar = findViewById(R.id.drag_target_bar);
|
||||
|
||||
// Create the various fade animations
|
||||
mDropTargetBar.setAlpha(0f);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method to animate the alpha of a view.
|
||||
*/
|
||||
protected void animateAlpha(View v, float alpha, TimeInterpolator interpolator) {
|
||||
if (Float.compare(v.getAlpha(), alpha) != 0) {
|
||||
ObjectAnimator anim = ObjectAnimator.ofFloat(v, View.ALPHA, alpha);
|
||||
anim.setInterpolator(interpolator);
|
||||
anim.addListener(new ViewVisiblilyUpdateHandler(v));
|
||||
mCurrentAnimation.play(anim);
|
||||
}
|
||||
}
|
||||
|
||||
protected void resetAnimation(int newAnimationDuration) {
|
||||
// Update the accessibility state
|
||||
AccessibilityManager am = (AccessibilityManager)
|
||||
getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
|
||||
mAccessibilityEnabled = am.isEnabled();
|
||||
|
||||
// Cancel any existing animation
|
||||
if (mCurrentAnimation != null) {
|
||||
mCurrentAnimation.cancel();
|
||||
mCurrentAnimation = null;
|
||||
}
|
||||
|
||||
if (newAnimationDuration > 0) {
|
||||
mCurrentAnimation = new AnimatorSet();
|
||||
mCurrentAnimation.setDuration(newAnimationDuration);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* DragController.DragListener implementation
|
||||
*/
|
||||
@Override
|
||||
public void onDragStart(DragSource source, ItemInfo info, int dragAction) {
|
||||
showDropTargets();
|
||||
}
|
||||
|
||||
/**
|
||||
* This is called to defer hiding the delete drop target until the drop animation has completed,
|
||||
* instead of hiding immediately when the drag has ended.
|
||||
*/
|
||||
protected void deferOnDragEnd() {
|
||||
mDeferOnDragEnd = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDragEnd() {
|
||||
if (!mDeferOnDragEnd) {
|
||||
hideDropTargets();
|
||||
} else {
|
||||
mDeferOnDragEnd = false;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void showDropTargets();
|
||||
|
||||
public abstract void hideDropTargets();
|
||||
|
||||
public abstract void enableAccessibleDrag(boolean enable);
|
||||
|
||||
public abstract void setup(Launcher launcher, DragController dragController);
|
||||
|
||||
private class ViewVisiblilyUpdateHandler extends AnimatorListenerAdapter {
|
||||
private final View mView;
|
||||
|
||||
ViewVisiblilyUpdateHandler(View v) {
|
||||
mView = v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
// Ensure that the view is visible for the animation
|
||||
mView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation){
|
||||
AlphaUpdateListener.updateVisibility(mView, mAccessibilityEnabled);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -55,10 +55,10 @@ public abstract class ButtonDropTarget extends TextView
|
||||
private static final int DRAG_VIEW_DROP_DURATION = 285;
|
||||
|
||||
private final boolean mHideParentOnDisable;
|
||||
protected final Launcher mLauncher;
|
||||
|
||||
protected Launcher mLauncher;
|
||||
private int mBottomDragPadding;
|
||||
protected BaseDropTargetBar mDropTargetBar;
|
||||
protected DropTargetBar mDropTargetBar;
|
||||
|
||||
/** Whether this drop target is active for the current drag */
|
||||
protected boolean mActive;
|
||||
@@ -80,6 +80,8 @@ public abstract class ButtonDropTarget extends TextView
|
||||
|
||||
public ButtonDropTarget(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
mLauncher = (Launcher) context;
|
||||
|
||||
Resources resources = getResources();
|
||||
mBottomDragPadding = resources.getDimensionPixelSize(R.dimen.drop_target_drag_padding);
|
||||
|
||||
@@ -109,11 +111,7 @@ public abstract class ButtonDropTarget extends TextView
|
||||
}
|
||||
}
|
||||
|
||||
public void setLauncher(Launcher launcher) {
|
||||
mLauncher = launcher;
|
||||
}
|
||||
|
||||
public void setDropTargetBar(BaseDropTargetBar dropTargetBar) {
|
||||
public void setDropTargetBar(DropTargetBar dropTargetBar) {
|
||||
mDropTargetBar = dropTargetBar;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,10 @@ public class DeviceProfile {
|
||||
public final Rect defaultWidgetPadding;
|
||||
private final int pageIndicatorHeightPx;
|
||||
private final int defaultPageSpacingPx;
|
||||
private final int topWorkspacePadding;
|
||||
private float dragViewScale;
|
||||
public float workspaceSpringLoadShrinkFactor;
|
||||
public final int workspaceSpringLoadedBottomSpace;
|
||||
|
||||
// Workspace icons
|
||||
public int iconSizePx;
|
||||
@@ -92,8 +95,7 @@ public class DeviceProfile {
|
||||
public int hotseatCellWidthPx;
|
||||
public int hotseatCellHeightPx;
|
||||
public int hotseatIconSizePx;
|
||||
private int normalHotseatBarHeightPx, shortHotseatBarHeightPx;
|
||||
private int hotseatBarHeightPx; // One of the above.
|
||||
private int hotseatBarHeightPx;
|
||||
|
||||
// All apps
|
||||
public int allAppsNumCols;
|
||||
@@ -102,15 +104,8 @@ public class DeviceProfile {
|
||||
public final int allAppsIconSizePx;
|
||||
public final float allAppsIconTextSizeSp;
|
||||
|
||||
// QSB
|
||||
private int searchBarWidgetInternalPaddingTop, searchBarWidgetInternalPaddingBottom;
|
||||
private int searchBarTopPaddingPx;
|
||||
private int tallSearchBarNegativeTopPaddingPx, normalSearchBarTopExtraPaddingPx;
|
||||
private int searchBarTopExtraPaddingPx; // One of the above.
|
||||
private int normalSearchBarBottomPaddingPx, tallSearchBarBottomPaddingPx;
|
||||
private int searchBarBottomPaddingPx; // One of the above.
|
||||
private int normalSearchBarSpaceHeightPx, tallSearchBarSpaceHeightPx;
|
||||
private int searchBarSpaceHeightPx; // One of the above.
|
||||
// Drop Target
|
||||
public int dropTargetBarSizePx;
|
||||
|
||||
public DeviceProfile(Context context, InvariantDeviceProfile inv,
|
||||
Point minSize, Point maxSize,
|
||||
@@ -140,6 +135,8 @@ public class DeviceProfile {
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_page_indicator_height);
|
||||
defaultPageSpacingPx =
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_workspace_page_spacing);
|
||||
topWorkspacePadding =
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_workspace_top_padding);
|
||||
overviewModeMinIconZoneHeightPx =
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_min_icon_zone_height);
|
||||
overviewModeMaxIconZoneHeightPx =
|
||||
@@ -152,6 +149,9 @@ public class DeviceProfile {
|
||||
res.getInteger(R.integer.config_dynamic_grid_overview_icon_zone_percentage) / 100f;
|
||||
iconDrawablePaddingOriginalPx =
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding);
|
||||
dropTargetBarSizePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_drop_target_size);
|
||||
workspaceSpringLoadedBottomSpace =
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_min_spring_loaded_space);
|
||||
|
||||
// AllApps uses the original non-scaled icon text size
|
||||
allAppsIconTextSizeSp = inv.iconTextSize;
|
||||
@@ -195,7 +195,7 @@ public class DeviceProfile {
|
||||
float usedHeight = (cellHeightPx * inv.numRows);
|
||||
|
||||
// We only care about the top and bottom workspace padding, which is not affected by RTL.
|
||||
Rect workspacePadding = getWorkspacePadding(false /* isLayoutRtl */);
|
||||
Rect workspacePadding = getWorkspacePadding();
|
||||
int maxHeight = (availableHeightPx - workspacePadding.top - workspacePadding.bottom);
|
||||
if (usedHeight > maxHeight) {
|
||||
scale = maxHeight / usedHeight;
|
||||
@@ -211,33 +211,6 @@ public class DeviceProfile {
|
||||
iconDrawablePaddingPx = drawablePadding;
|
||||
hotseatIconSizePx = (int) (Utilities.pxFromDp(inv.hotseatIconSize, dm) * scale);
|
||||
|
||||
// Search Bar
|
||||
normalSearchBarSpaceHeightPx = res.getDimensionPixelSize(
|
||||
R.dimen.dynamic_grid_search_bar_height);
|
||||
tallSearchBarSpaceHeightPx = res.getDimensionPixelSize(
|
||||
R.dimen.dynamic_grid_search_bar_height_tall);
|
||||
searchBarWidgetInternalPaddingTop = res.getDimensionPixelSize(
|
||||
R.dimen.qsb_internal_padding_top);
|
||||
searchBarWidgetInternalPaddingBottom = res.getDimensionPixelSize(
|
||||
R.dimen.qsb_internal_padding_bottom);
|
||||
normalSearchBarTopExtraPaddingPx = res.getDimensionPixelSize(
|
||||
R.dimen.dynamic_grid_search_bar_extra_top_padding);
|
||||
tallSearchBarNegativeTopPaddingPx = res.getDimensionPixelSize(
|
||||
R.dimen.dynamic_grid_search_bar_negative_top_padding_short);
|
||||
if (isTablet && !isVerticalBarLayout()) {
|
||||
searchBarTopPaddingPx = searchBarWidgetInternalPaddingTop;
|
||||
normalSearchBarBottomPaddingPx = searchBarWidgetInternalPaddingBottom +
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_bottom_padding_tablet);
|
||||
tallSearchBarBottomPaddingPx = normalSearchBarBottomPaddingPx;
|
||||
} else {
|
||||
searchBarTopPaddingPx = searchBarWidgetInternalPaddingTop;
|
||||
normalSearchBarBottomPaddingPx = searchBarWidgetInternalPaddingBottom +
|
||||
res.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_bottom_padding);
|
||||
tallSearchBarBottomPaddingPx = searchBarWidgetInternalPaddingBottom
|
||||
+ res.getDimensionPixelSize(
|
||||
R.dimen.dynamic_grid_search_bar_bottom_negative_padding_short);
|
||||
}
|
||||
|
||||
// Calculate the actual text height
|
||||
Paint textPaint = new Paint();
|
||||
textPaint.setTextSize(iconTextSizePx);
|
||||
@@ -249,11 +222,22 @@ public class DeviceProfile {
|
||||
dragViewScale = (iconSizePx + scaleDps) / iconSizePx;
|
||||
|
||||
// Hotseat
|
||||
normalHotseatBarHeightPx = iconSizePx + 4 * edgeMarginPx;
|
||||
shortHotseatBarHeightPx = iconSizePx + 2 * edgeMarginPx;
|
||||
hotseatBarHeightPx = iconSizePx + 4 * edgeMarginPx;
|
||||
hotseatCellWidthPx = iconSizePx;
|
||||
hotseatCellHeightPx = iconSizePx;
|
||||
|
||||
if (!isVerticalBarLayout()) {
|
||||
int expectedWorkspaceHeight = availableHeightPx - hotseatBarHeightPx
|
||||
- pageIndicatorHeightPx - topWorkspacePadding;
|
||||
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
|
||||
int folderCellPadding = isTablet || isLandscape ? 6 * edgeMarginPx : 3 * edgeMarginPx;
|
||||
// Don't let the folder get too close to the edges of the screen.
|
||||
@@ -281,60 +265,33 @@ public class DeviceProfile {
|
||||
allAppsNumPredictiveCols = numPredictiveAppCols;
|
||||
}
|
||||
|
||||
/** Returns the amount of extra space to allocate to the search bar for vertical padding. */
|
||||
private int getSearchBarTotalVerticalPadding() {
|
||||
return searchBarTopPaddingPx + searchBarTopExtraPaddingPx + searchBarBottomPaddingPx;
|
||||
}
|
||||
|
||||
/** Returns the width and height of the search bar, ignoring any padding. */
|
||||
public Point getSearchBarDimensForWidgetOpts(Resources res) {
|
||||
Rect searchBarBounds = getSearchBarBounds(Utilities.isRtl(res));
|
||||
public Point getSearchBarDimensForWidgetOpts() {
|
||||
if (isVerticalBarLayout()) {
|
||||
return new Point(searchBarBounds.width(), searchBarBounds.height());
|
||||
}
|
||||
int widgetInternalPadding = searchBarWidgetInternalPaddingTop +
|
||||
searchBarWidgetInternalPaddingBottom;
|
||||
return new Point(searchBarBounds.width(), searchBarSpaceHeightPx + widgetInternalPadding);
|
||||
}
|
||||
|
||||
/** Returns the search bar bounds in the current orientation */
|
||||
public Rect getSearchBarBounds(boolean isLayoutRtl) {
|
||||
Rect bounds = new Rect();
|
||||
if (isVerticalBarLayout()) {
|
||||
if (isLayoutRtl) {
|
||||
bounds.set(availableWidthPx - normalSearchBarSpaceHeightPx, edgeMarginPx,
|
||||
availableWidthPx, availableHeightPx - edgeMarginPx);
|
||||
} else {
|
||||
bounds.set(0, edgeMarginPx, normalSearchBarSpaceHeightPx,
|
||||
availableHeightPx - edgeMarginPx);
|
||||
}
|
||||
return new Point(dropTargetBarSizePx, availableHeightPx - 2 * edgeMarginPx);
|
||||
} else {
|
||||
int boundsBottom = searchBarSpaceHeightPx + getSearchBarTotalVerticalPadding();
|
||||
int gap;
|
||||
if (isTablet) {
|
||||
// Pad the left and right of the workspace to ensure consistent spacing
|
||||
// between all icons
|
||||
int width = getCurrentWidth();
|
||||
// XXX: If the icon size changes across orientations, we will have to take
|
||||
// that into account here too.
|
||||
int gap = (int) ((width - 2 * edgeMarginPx -
|
||||
(inv.numColumns * cellWidthPx)) / (2 * (inv.numColumns + 1)));
|
||||
bounds.set(edgeMarginPx + gap, 0,
|
||||
availableWidthPx - (edgeMarginPx + gap), boundsBottom);
|
||||
gap = ((width - 2 * edgeMarginPx
|
||||
- (inv.numColumns * cellWidthPx)) / (2 * (inv.numColumns + 1)))
|
||||
+ edgeMarginPx;
|
||||
} else {
|
||||
bounds.set(desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.left,
|
||||
0,
|
||||
availableWidthPx - (desiredWorkspaceLeftRightMarginPx -
|
||||
defaultWidgetPadding.right), boundsBottom);
|
||||
gap = desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.right;
|
||||
}
|
||||
return new Point(availableWidthPx - 2 * gap, dropTargetBarSizePx);
|
||||
}
|
||||
return bounds;
|
||||
}
|
||||
|
||||
public Point getCellSize() {
|
||||
Point result = new Point();
|
||||
// Since we are only concerned with the overall padding, layout direction does
|
||||
// not matter.
|
||||
Rect padding = getWorkspacePadding(false /* isLayoutRtl */ );
|
||||
Rect padding = getWorkspacePadding();
|
||||
result.x = calculateCellWidth(availableWidthPx - padding.left - padding.right,
|
||||
inv.numColumns);
|
||||
result.y = calculateCellHeight(availableHeightPx - padding.top - padding.bottom,
|
||||
@@ -343,20 +300,13 @@ public class DeviceProfile {
|
||||
}
|
||||
|
||||
/** Returns the workspace padding in the specified orientation */
|
||||
public Rect getWorkspacePadding(boolean isLayoutRtl) {
|
||||
Rect searchBarBounds = getSearchBarBounds(isLayoutRtl);
|
||||
public Rect getWorkspacePadding() {
|
||||
Rect padding = new Rect();
|
||||
if (isVerticalBarLayout()) {
|
||||
// Pad the left and right of the workspace with search/hotseat bar sizes
|
||||
if (isLayoutRtl) {
|
||||
padding.set(normalHotseatBarHeightPx, edgeMarginPx,
|
||||
searchBarBounds.width(), edgeMarginPx);
|
||||
} else {
|
||||
padding.set(searchBarBounds.width(), edgeMarginPx,
|
||||
normalHotseatBarHeightPx, edgeMarginPx);
|
||||
}
|
||||
// in case of isVerticalBarLayout, the hotseat is always on the right and the drop
|
||||
// target bar is on the left, independent of the layout direction.
|
||||
padding.set(dropTargetBarSizePx, edgeMarginPx, hotseatBarHeightPx, edgeMarginPx);
|
||||
} else {
|
||||
int paddingTop = searchBarBounds.bottom;
|
||||
int paddingBottom = hotseatBarHeightPx + pageIndicatorHeightPx;
|
||||
if (isTablet) {
|
||||
// Pad the left and right of the workspace to ensure consistent spacing
|
||||
@@ -369,14 +319,14 @@ public class DeviceProfile {
|
||||
((inv.numColumns - 1) * gapScale * cellWidthPx)));
|
||||
availablePaddingX = (int) Math.min(availablePaddingX,
|
||||
width * MAX_HORIZONTAL_PADDING_PERCENT);
|
||||
int availablePaddingY = Math.max(0, height - paddingTop - paddingBottom
|
||||
int availablePaddingY = Math.max(0, height - topWorkspacePadding - paddingBottom
|
||||
- (int) (2 * inv.numRows * cellHeightPx));
|
||||
padding.set(availablePaddingX / 2, paddingTop + availablePaddingY / 2,
|
||||
padding.set(availablePaddingX / 2, topWorkspacePadding + availablePaddingY / 2,
|
||||
availablePaddingX / 2, paddingBottom + availablePaddingY / 2);
|
||||
} else {
|
||||
// Pad the top and bottom of the workspace with search/hotseat bar sizes
|
||||
padding.set(desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.left,
|
||||
paddingTop,
|
||||
topWorkspacePadding,
|
||||
desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.right,
|
||||
paddingBottom);
|
||||
}
|
||||
@@ -384,7 +334,7 @@ public class DeviceProfile {
|
||||
return padding;
|
||||
}
|
||||
|
||||
private int getWorkspacePageSpacing(boolean isLayoutRtl) {
|
||||
private int getWorkspacePageSpacing() {
|
||||
if (isVerticalBarLayout() || isLargeTablet) {
|
||||
// In landscape mode the page spacing is set to the default.
|
||||
return defaultPageSpacingPx;
|
||||
@@ -392,7 +342,7 @@ public class DeviceProfile {
|
||||
// In portrait, we want the pages spaced such that there is no
|
||||
// overhang of the previous / next page into the current page viewport.
|
||||
// We assume symmetrical padding in portrait mode.
|
||||
return Math.max(defaultPageSpacingPx, 2 * getWorkspacePadding(isLayoutRtl).left);
|
||||
return Math.max(defaultPageSpacingPx, 2 * getWorkspacePadding().left);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -444,50 +394,28 @@ public class DeviceProfile {
|
||||
return visibleChildren;
|
||||
}
|
||||
|
||||
// TODO(twickham): b/25154513
|
||||
public void setSearchBarHeight(int searchBarHeight) {
|
||||
if (searchBarHeight == LauncherCallbacks.SEARCH_BAR_HEIGHT_TALL) {
|
||||
hotseatBarHeightPx = shortHotseatBarHeightPx;
|
||||
searchBarSpaceHeightPx = tallSearchBarSpaceHeightPx;
|
||||
searchBarBottomPaddingPx = tallSearchBarBottomPaddingPx;
|
||||
searchBarTopExtraPaddingPx = isPhone ? tallSearchBarNegativeTopPaddingPx
|
||||
: normalSearchBarTopExtraPaddingPx;
|
||||
} else {
|
||||
hotseatBarHeightPx = normalHotseatBarHeightPx;
|
||||
searchBarSpaceHeightPx = normalSearchBarSpaceHeightPx;
|
||||
searchBarBottomPaddingPx = normalSearchBarBottomPaddingPx;
|
||||
searchBarTopExtraPaddingPx = normalSearchBarTopExtraPaddingPx;
|
||||
}
|
||||
}
|
||||
|
||||
public void layout(Launcher launcher) {
|
||||
FrameLayout.LayoutParams lp;
|
||||
boolean hasVerticalBarLayout = isVerticalBarLayout();
|
||||
final boolean isLayoutRtl = Utilities.isRtl(launcher.getResources());
|
||||
|
||||
// Layout the search bar space
|
||||
Rect searchBarBounds = getSearchBarBounds(isLayoutRtl);
|
||||
View searchBar = launcher.getSearchDropTargetBar();
|
||||
Point searchBarBounds = getSearchBarDimensForWidgetOpts();
|
||||
View searchBar = launcher.getDropTargetBar();
|
||||
lp = (FrameLayout.LayoutParams) searchBar.getLayoutParams();
|
||||
lp.width = searchBarBounds.width();
|
||||
lp.height = searchBarBounds.height();
|
||||
lp.topMargin = searchBarTopExtraPaddingPx;
|
||||
lp.width = searchBarBounds.x;
|
||||
lp.height = searchBarBounds.y;
|
||||
lp.topMargin = edgeMarginPx;
|
||||
searchBar.setLayoutParams(lp);
|
||||
|
||||
// Layout the app info bar space
|
||||
View appInfoBar = launcher.getAppInfoDropTargetBar();
|
||||
lp = (FrameLayout.LayoutParams) appInfoBar.getLayoutParams();
|
||||
lp.bottomMargin = hotseatBarHeightPx;
|
||||
appInfoBar.setLayoutParams(lp);
|
||||
|
||||
// Layout the workspace
|
||||
PagedView workspace = (PagedView) launcher.findViewById(R.id.workspace);
|
||||
lp = (FrameLayout.LayoutParams) workspace.getLayoutParams();
|
||||
lp.gravity = Gravity.CENTER;
|
||||
Rect padding = getWorkspacePadding(isLayoutRtl);
|
||||
Rect padding = getWorkspacePadding();
|
||||
workspace.setLayoutParams(lp);
|
||||
workspace.setPadding(padding.left, padding.top, padding.right, padding.bottom);
|
||||
workspace.setPageSpacing(getWorkspacePageSpacing(isLayoutRtl));
|
||||
workspace.setPageSpacing(getWorkspacePageSpacing());
|
||||
|
||||
// Layout the hotseat
|
||||
View hotseat = launcher.findViewById(R.id.hotseat);
|
||||
@@ -503,7 +431,7 @@ public class DeviceProfile {
|
||||
// Vertical hotseat -- The hotseat is fixed in the layout to be on the right of the
|
||||
// screen regardless of RTL
|
||||
lp.gravity = Gravity.RIGHT;
|
||||
lp.width = normalHotseatBarHeightPx;
|
||||
lp.width = hotseatBarHeightPx;
|
||||
lp.height = LayoutParams.MATCH_PARENT;
|
||||
hotseat.findViewById(R.id.layout).setPadding(0, 2 * edgeMarginPx, 0, 2 * edgeMarginPx);
|
||||
} else if (isTablet) {
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.launcher3;
|
||||
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewDebug;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.view.animation.AccelerateInterpolator;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.android.launcher3.dragndrop.DragController;
|
||||
|
||||
/*
|
||||
* The top bar containing various drop targets: Delete/App Info/Uninstall.
|
||||
*/
|
||||
public class DropTargetBar extends LinearLayout implements DragController.DragListener {
|
||||
|
||||
protected static final int DEFAULT_DRAG_FADE_DURATION = 175;
|
||||
protected static final TimeInterpolator DEFAULT_INTERPOLATOR = new AccelerateInterpolator();
|
||||
|
||||
private final Runnable mFadeAnimationEndRunnable = new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
AccessibilityManager am = (AccessibilityManager)
|
||||
getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
|
||||
boolean accessibilityEnabled = am.isEnabled();
|
||||
AlphaUpdateListener.updateVisibility(DropTargetBar.this, accessibilityEnabled);
|
||||
}
|
||||
};
|
||||
|
||||
@ViewDebug.ExportedProperty(category = "launcher")
|
||||
protected boolean mDeferOnDragEnd;
|
||||
|
||||
@ViewDebug.ExportedProperty(category = "launcher")
|
||||
protected boolean mVisible = false;
|
||||
|
||||
private ViewPropertyAnimator mCurrentAnimation;
|
||||
|
||||
// Drop targets
|
||||
private ButtonDropTarget mDeleteDropTarget;
|
||||
private ButtonDropTarget mAppInfoDropTarget;
|
||||
private ButtonDropTarget mUninstallDropTarget;
|
||||
|
||||
public DropTargetBar(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public DropTargetBar(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
// Get the individual components
|
||||
mDeleteDropTarget = (ButtonDropTarget) findViewById(R.id.delete_target_text);
|
||||
mAppInfoDropTarget = (ButtonDropTarget) findViewById(R.id.info_target_text);
|
||||
mUninstallDropTarget = (ButtonDropTarget) findViewById(R.id.uninstall_target_text);
|
||||
|
||||
mDeleteDropTarget.setDropTargetBar(this);
|
||||
mAppInfoDropTarget.setDropTargetBar(this);
|
||||
mUninstallDropTarget.setDropTargetBar(this);
|
||||
|
||||
// Initialize with hidden state
|
||||
setAlpha(0f);
|
||||
}
|
||||
|
||||
public void setup(DragController dragController) {
|
||||
dragController.addDragListener(this);
|
||||
dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
|
||||
|
||||
dragController.addDragListener(mDeleteDropTarget);
|
||||
dragController.addDragListener(mAppInfoDropTarget);
|
||||
dragController.addDragListener(mUninstallDropTarget);
|
||||
|
||||
dragController.addDropTarget(mDeleteDropTarget);
|
||||
dragController.addDropTarget(mAppInfoDropTarget);
|
||||
dragController.addDropTarget(mUninstallDropTarget);
|
||||
}
|
||||
|
||||
private void animateToVisibility(boolean isVisible) {
|
||||
if (mVisible != isVisible) {
|
||||
mVisible = isVisible;
|
||||
|
||||
// Cancel any existing animation
|
||||
if (mCurrentAnimation != null) {
|
||||
mCurrentAnimation.cancel();
|
||||
mCurrentAnimation = null;
|
||||
}
|
||||
|
||||
float finalAlpha = mVisible ? 1 : 0;
|
||||
if (Float.compare(getAlpha(), finalAlpha) != 0) {
|
||||
setVisibility(View.VISIBLE);
|
||||
mCurrentAnimation = animate().alpha(finalAlpha)
|
||||
.setInterpolator(DEFAULT_INTERPOLATOR)
|
||||
.setDuration(DEFAULT_DRAG_FADE_DURATION)
|
||||
.withEndAction(mFadeAnimationEndRunnable);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void enableAccessibleDrag(boolean enable) {
|
||||
mDeleteDropTarget.enableAccessibleDrag(enable);
|
||||
mAppInfoDropTarget.enableAccessibleDrag(enable);
|
||||
mUninstallDropTarget.enableAccessibleDrag(enable);
|
||||
}
|
||||
|
||||
/*
|
||||
* DragController.DragListener implementation
|
||||
*/
|
||||
@Override
|
||||
public void onDragStart(DragSource source, ItemInfo info, int dragAction) {
|
||||
animateToVisibility(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* This is called to defer hiding the delete drop target until the drop animation has completed,
|
||||
* instead of hiding immediately when the drag has ended.
|
||||
*/
|
||||
protected void deferOnDragEnd() {
|
||||
mDeferOnDragEnd = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDragEnd() {
|
||||
if (!mDeferOnDragEnd) {
|
||||
animateToVisibility(false);
|
||||
} else {
|
||||
mDeferOnDragEnd = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -356,7 +356,7 @@ public class FocusHelper {
|
||||
CellLayout iconLayout = (CellLayout) parent.getParent();
|
||||
final Workspace workspace = (Workspace) iconLayout.getParent();
|
||||
final ViewGroup dragLayer = (ViewGroup) workspace.getParent();
|
||||
final ViewGroup tabs = (ViewGroup) dragLayer.findViewById(R.id.search_drop_target_bar);
|
||||
final ViewGroup tabs = (ViewGroup) dragLayer.findViewById(R.id.drop_target_bar);
|
||||
final Hotseat hotseat = (Hotseat) dragLayer.findViewById(R.id.hotseat);
|
||||
|
||||
final ItemInfo itemInfo = (ItemInfo) v.getTag();
|
||||
|
||||
@@ -252,8 +252,7 @@ public class Launcher extends Activity
|
||||
private View mAllAppsButton;
|
||||
private View mWidgetsButton;
|
||||
|
||||
private SearchDropTargetBar mSearchDropTargetBar;
|
||||
private AppInfoDropTargetBar mAppInfoDropTargetBar;
|
||||
private DropTargetBar mDropTargetBar;
|
||||
|
||||
// Main container view for the all apps screen.
|
||||
@Thunk AllAppsContainerView mAppsView;
|
||||
@@ -435,8 +434,6 @@ public class Launcher extends Activity
|
||||
|
||||
setContentView(R.layout.launcher);
|
||||
|
||||
app.getInvariantDeviceProfile().landscapeProfile.setSearchBarHeight(getSearchBarHeight());
|
||||
app.getInvariantDeviceProfile().portraitProfile.setSearchBarHeight(getSearchBarHeight());
|
||||
setupViews();
|
||||
mDeviceProfile.layout(this);
|
||||
mExtractedColors = new ExtractedColors();
|
||||
@@ -1374,11 +1371,7 @@ public class Launcher extends Activity
|
||||
mDragController.addDragListener(mWorkspace);
|
||||
|
||||
// Get the search/delete/uninstall bar
|
||||
mSearchDropTargetBar = (SearchDropTargetBar)
|
||||
mDragLayer.findViewById(R.id.search_drop_target_bar);
|
||||
// Get the app info bar
|
||||
mAppInfoDropTargetBar = (AppInfoDropTargetBar)
|
||||
mDragLayer.findViewById(R.id.app_info_drop_target_bar);
|
||||
mDropTargetBar = (DropTargetBar) mDragLayer.findViewById(R.id.drop_target_bar);
|
||||
|
||||
// Setup Apps and Widgets
|
||||
mAppsView = (AllAppsContainerView) findViewById(R.id.apps_view);
|
||||
@@ -1394,12 +1387,7 @@ public class Launcher extends Activity
|
||||
mDragController.setScrollView(mDragLayer);
|
||||
mDragController.setMoveTarget(mWorkspace);
|
||||
mDragController.addDropTarget(mWorkspace);
|
||||
if (mSearchDropTargetBar != null) {
|
||||
mSearchDropTargetBar.setup(this, mDragController);
|
||||
}
|
||||
if (mAppInfoDropTargetBar != null) {
|
||||
mAppInfoDropTargetBar.setup(this, mDragController);
|
||||
}
|
||||
mDropTargetBar.setup(mDragController);
|
||||
|
||||
if (TestingUtils.MEMORY_DUMP_ENABLED) {
|
||||
TestingUtils.addWeightWatcher(this);
|
||||
@@ -1808,12 +1796,8 @@ public class Launcher extends Activity
|
||||
return mOverviewPanel;
|
||||
}
|
||||
|
||||
public SearchDropTargetBar getSearchDropTargetBar() {
|
||||
return mSearchDropTargetBar;
|
||||
}
|
||||
|
||||
public AppInfoDropTargetBar getAppInfoDropTargetBar() {
|
||||
return mAppInfoDropTargetBar;
|
||||
public DropTargetBar getDropTargetBar() {
|
||||
return mDropTargetBar;
|
||||
}
|
||||
|
||||
public LauncherAppWidgetHost getAppWidgetHost() {
|
||||
@@ -4039,11 +4023,6 @@ public class Launcher extends Activity
|
||||
return mDeviceProfile.isVerticalBarLayout();
|
||||
}
|
||||
|
||||
/** Returns the search bar bounds in pixels. */
|
||||
protected Rect getSearchBarBounds() {
|
||||
return mDeviceProfile.getSearchBarBounds(Utilities.isRtl(getResources()));
|
||||
}
|
||||
|
||||
public int getSearchBarHeight() {
|
||||
if (mLauncherCallbacks != null) {
|
||||
return mLauncherCallbacks.getSearchBarHeight();
|
||||
|
||||
@@ -63,9 +63,8 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo {
|
||||
LauncherAppState app = LauncherAppState.getInstance();
|
||||
InvariantDeviceProfile idp = app.getInvariantDeviceProfile();
|
||||
|
||||
// We only care out the cell size, which is independent of the the layout direction.
|
||||
Rect paddingLand = idp.landscapeProfile.getWorkspacePadding(false /* isLayoutRtl */);
|
||||
Rect paddingPort = idp.portraitProfile.getWorkspacePadding(false /* isLayoutRtl */);
|
||||
Rect paddingLand = idp.landscapeProfile.getWorkspacePadding();
|
||||
Rect paddingPort = idp.portraitProfile.getWorkspacePadding();
|
||||
|
||||
// Always assume we're working with the smallest span to make sure we
|
||||
// reserve enough space in both orientations.
|
||||
|
||||
@@ -460,12 +460,6 @@ public class LauncherStateTransitionAnimation {
|
||||
Animator workspaceAnim = mLauncher.startWorkspaceStateChangeAnimation(toWorkspaceState,
|
||||
animated, layerViews);
|
||||
|
||||
// Animate the search bar
|
||||
final SearchDropTargetBar.State toSearchBarState =
|
||||
toWorkspaceState.searchDropTargetBarState;
|
||||
mLauncher.getSearchDropTargetBar().animateToState(toSearchBarState,
|
||||
animated ? revealDuration : 0, animation);
|
||||
|
||||
if (animated && initialized) {
|
||||
// Play the workspace animation
|
||||
if (workspaceAnim != null) {
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.launcher3;
|
||||
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewDebug;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
|
||||
import com.android.launcher3.dragndrop.DragController;
|
||||
import com.android.launcher3.util.Thunk;
|
||||
|
||||
/*
|
||||
* This bar will manage the transition between the QSB search bar and the delete/uninstall drop
|
||||
* targets so that each of the individual ButtonDropTargets don't have to.
|
||||
*/
|
||||
public class SearchDropTargetBar extends BaseDropTargetBar {
|
||||
|
||||
/** The different states that the search bar space can be in. */
|
||||
public enum State {
|
||||
INVISIBLE (0f),
|
||||
DROP_TARGET (1f);
|
||||
|
||||
private final float mDropTargetBarAlpha;
|
||||
|
||||
State(float dtbAlpha) {
|
||||
mDropTargetBarAlpha = dtbAlpha;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ViewDebug.ExportedProperty(category = "launcher")
|
||||
private State mState = State.INVISIBLE;
|
||||
|
||||
// Drop targets
|
||||
private ButtonDropTarget mDeleteDropTarget;
|
||||
private ButtonDropTarget mUninstallDropTarget;
|
||||
|
||||
public SearchDropTargetBar(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
// Get the individual components
|
||||
mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
|
||||
mUninstallDropTarget = (ButtonDropTarget) mDropTargetBar
|
||||
.findViewById(R.id.uninstall_target_text);
|
||||
|
||||
mDeleteDropTarget.setDropTargetBar(this);
|
||||
mUninstallDropTarget.setDropTargetBar(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setup(Launcher launcher, DragController dragController) {
|
||||
dragController.addDragListener(this);
|
||||
dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
|
||||
|
||||
dragController.addDragListener(mDeleteDropTarget);
|
||||
dragController.addDragListener(mUninstallDropTarget);
|
||||
|
||||
dragController.addDropTarget(mDeleteDropTarget);
|
||||
dragController.addDropTarget(mUninstallDropTarget);
|
||||
|
||||
mDeleteDropTarget.setLauncher(launcher);
|
||||
mUninstallDropTarget.setLauncher(launcher);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showDropTargets() {
|
||||
animateToState(State.DROP_TARGET, DEFAULT_DRAG_FADE_DURATION);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideDropTargets() {
|
||||
animateToState(State.INVISIBLE, DEFAULT_DRAG_FADE_DURATION);
|
||||
}
|
||||
|
||||
/**
|
||||
* Animates the current search bar state to a new state. If the {@param duration} is 0, then
|
||||
* the state is applied immediately.
|
||||
*/
|
||||
public void animateToState(State newState, int duration) {
|
||||
animateToState(newState, duration, null);
|
||||
}
|
||||
|
||||
public void animateToState(State newState, int duration, AnimatorSet animation) {
|
||||
if (mState != newState) {
|
||||
mState = newState;
|
||||
|
||||
resetAnimation(duration);
|
||||
if (duration > 0) {
|
||||
animateAlpha(mDropTargetBar, mState.mDropTargetBarAlpha, DEFAULT_INTERPOLATOR);
|
||||
} else {
|
||||
mDropTargetBar.setAlpha(mState.mDropTargetBarAlpha);
|
||||
AlphaUpdateListener.updateVisibility(mDropTargetBar, mAccessibilityEnabled);
|
||||
}
|
||||
|
||||
// Start the final animation
|
||||
if (duration > 0) {
|
||||
if (animation != null) {
|
||||
animation.play(mCurrentAnimation);
|
||||
} else {
|
||||
mCurrentAnimation.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enableAccessibleDrag(boolean enable) {
|
||||
mDeleteDropTarget.enableAccessibleDrag(enable);
|
||||
mUninstallDropTarget.enableAccessibleDrag(enable);
|
||||
}
|
||||
}
|
||||
@@ -176,26 +176,22 @@ public class Workspace extends PagedView
|
||||
private Matrix mTempMatrix = new Matrix();
|
||||
|
||||
private SpringLoadedDragController mSpringLoadedDragController;
|
||||
private float mSpringLoadedShrinkFactor;
|
||||
private float mOverviewModeShrinkFactor;
|
||||
|
||||
// State variable that indicates whether the pages are small (ie when you're
|
||||
// in all apps or customize mode)
|
||||
|
||||
enum State {
|
||||
NORMAL (SearchDropTargetBar.State.INVISIBLE, false, false),
|
||||
NORMAL_HIDDEN (SearchDropTargetBar.State.INVISIBLE, false, false),
|
||||
SPRING_LOADED (SearchDropTargetBar.State.DROP_TARGET, false, true),
|
||||
OVERVIEW (SearchDropTargetBar.State.INVISIBLE, true, true),
|
||||
OVERVIEW_HIDDEN (SearchDropTargetBar.State.INVISIBLE, true, false);
|
||||
NORMAL (false, false),
|
||||
NORMAL_HIDDEN (false, false),
|
||||
SPRING_LOADED (false, true),
|
||||
OVERVIEW (true, true),
|
||||
OVERVIEW_HIDDEN (true, false);
|
||||
|
||||
public final SearchDropTargetBar.State searchDropTargetBarState;
|
||||
public final boolean shouldUpdateWidget;
|
||||
public final boolean hasMultipleVisiblePages;
|
||||
|
||||
State(SearchDropTargetBar.State searchBarState, boolean shouldUpdateWidget,
|
||||
boolean hasMultipleVisiblePages) {
|
||||
searchDropTargetBarState = searchBarState;
|
||||
State(boolean shouldUpdateWidget, boolean hasMultipleVisiblePages) {
|
||||
this.shouldUpdateWidget = shouldUpdateWidget;
|
||||
this.hasMultipleVisiblePages = hasMultipleVisiblePages;
|
||||
}
|
||||
@@ -316,9 +312,6 @@ public class Workspace extends PagedView
|
||||
mWallpaperManager = WallpaperManager.getInstance(context);
|
||||
|
||||
mWallpaperOffset = new WallpaperOffsetInterpolator(this);
|
||||
|
||||
mSpringLoadedShrinkFactor =
|
||||
res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f;
|
||||
mOverviewModeShrinkFactor =
|
||||
res.getInteger(R.integer.config_workspaceOverviewShrinkPercentage) / 100f;
|
||||
|
||||
@@ -347,6 +340,7 @@ public class Workspace extends PagedView
|
||||
// estimate the size of a widget with spans hSpan, vSpan. return MAX_VALUE for each
|
||||
// dimension if unsuccessful
|
||||
public int[] estimateItemSize(ItemInfo itemInfo, boolean springLoaded) {
|
||||
float shrinkFactor = mLauncher.getDeviceProfile().workspaceSpringLoadShrinkFactor;
|
||||
int[] size = new int[2];
|
||||
if (getChildCount() > 0) {
|
||||
// Use the first non-custom page to estimate the child position
|
||||
@@ -355,8 +349,8 @@ public class Workspace extends PagedView
|
||||
size[0] = r.width();
|
||||
size[1] = r.height();
|
||||
if (springLoaded) {
|
||||
size[0] *= mSpringLoadedShrinkFactor;
|
||||
size[1] *= mSpringLoadedShrinkFactor;
|
||||
size[0] *= shrinkFactor;
|
||||
size[1] *= shrinkFactor;
|
||||
}
|
||||
return size;
|
||||
} else {
|
||||
@@ -1380,7 +1374,6 @@ public class Workspace extends PagedView
|
||||
// TODO(adamcohen): figure out a final effect here. We may need to recommend
|
||||
// different effects based on device performance. On at least one relatively high-end
|
||||
// device I've tried, translating the launcher causes things to get quite laggy.
|
||||
setTranslationAndAlpha(mLauncher.getSearchDropTargetBar(), transX, alpha);
|
||||
setTranslationAndAlpha(getPageIndicator(), transX, alpha);
|
||||
setTranslationAndAlpha(getChildAt(getCurrentPage()), transX, alpha);
|
||||
setTranslationAndAlpha(mLauncher.getHotseat(), transX, alpha);
|
||||
@@ -1536,8 +1529,7 @@ public class Workspace extends PagedView
|
||||
// Reset our click listener
|
||||
setOnClickListener(mLauncher);
|
||||
}
|
||||
mLauncher.getSearchDropTargetBar().enableAccessibleDrag(enable);
|
||||
mLauncher.getAppInfoDropTargetBar().enableAccessibleDrag(enable);
|
||||
mLauncher.getDropTargetBar().enableAccessibleDrag(enable);
|
||||
mLauncher.getHotseat().getLayout()
|
||||
.enableAccessibleDrag(enable, CellLayout.WORKSPACE_ACCESSIBILITY_DRAG);
|
||||
}
|
||||
@@ -1938,7 +1930,7 @@ public class Workspace extends PagedView
|
||||
|
||||
int getOverviewModeTranslationY() {
|
||||
DeviceProfile grid = mLauncher.getDeviceProfile();
|
||||
Rect workspacePadding = grid.getWorkspacePadding(Utilities.isRtl(getResources()));
|
||||
Rect workspacePadding = grid.getWorkspacePadding();
|
||||
int overviewButtonBarHeight = grid.getOverviewModeButtonBarHeight();
|
||||
|
||||
int scaledHeight = (int) (mOverviewModeShrinkFactor * getNormalChildHeight());
|
||||
@@ -1951,15 +1943,26 @@ public class Workspace extends PagedView
|
||||
return -workspaceOffsetTopEdge + overviewOffsetTopEdge;
|
||||
}
|
||||
|
||||
int getSpringLoadedTranslationY() {
|
||||
float getSpringLoadedTranslationY() {
|
||||
DeviceProfile grid = mLauncher.getDeviceProfile();
|
||||
Rect workspacePadding = grid.getWorkspacePadding(Utilities.isRtl(getResources()));
|
||||
int scaledHeight = (int) (mSpringLoadedShrinkFactor * getNormalChildHeight());
|
||||
int workspaceTop = mInsets.top + workspacePadding.top;
|
||||
int workspaceBottom = getViewportHeight() - mInsets.bottom - workspacePadding.bottom;
|
||||
int workspaceHeight = workspaceBottom - workspaceTop;
|
||||
// Center the spring-loaded pages by translating it up by half of the reduced height.
|
||||
return -(workspaceHeight - scaledHeight) / 2;
|
||||
if (grid.isVerticalBarLayout() || getChildCount() == 0) {
|
||||
return 0;
|
||||
}
|
||||
Rect workspacePadding = grid.getWorkspacePadding();
|
||||
|
||||
float scaledHeight = grid.workspaceSpringLoadShrinkFactor * getNormalChildHeight();
|
||||
float shrunkTop = mInsets.top + grid.dropTargetBarSizePx;
|
||||
float shrunkBottom = getViewportHeight() - mInsets.bottom
|
||||
- workspacePadding.bottom - grid.workspaceSpringLoadedBottomSpace;
|
||||
float totalShrunkSpace = shrunkBottom - shrunkTop;
|
||||
|
||||
float desiredCellTop = shrunkTop + (totalShrunkSpace - scaledHeight) / 2;
|
||||
|
||||
float halfHeight = getHeight() / 2;
|
||||
float myCenter = getTop() + halfHeight;
|
||||
float cellTopFromCenter = halfHeight - getChildAt(0).getTop();
|
||||
float actualCellTop = myCenter - cellTopFromCenter * grid.workspaceSpringLoadShrinkFactor;
|
||||
return (desiredCellTop - actualCellTop) / grid.workspaceSpringLoadShrinkFactor;
|
||||
}
|
||||
|
||||
float getOverviewModeShrinkFactor() {
|
||||
|
||||
@@ -211,8 +211,7 @@ public class WorkspaceStateTransitionAnimation {
|
||||
mOverviewTransitionTime = res.getInteger(R.integer.config_overviewTransitionTime);
|
||||
mOverlayTransitionTime = res.getInteger(R.integer.config_overlayTransitionTime);
|
||||
mSpringLoadedTransitionTime = mOverlayTransitionTime / 2;
|
||||
mSpringLoadedShrinkFactor =
|
||||
res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100f;
|
||||
mSpringLoadedShrinkFactor = mLauncher.getDeviceProfile().workspaceSpringLoadShrinkFactor;
|
||||
mOverviewModeShrinkFactor =
|
||||
res.getInteger(R.integer.config_workspaceOverviewShrinkPercentage) / 100f;
|
||||
mWorkspaceScrimAlpha = res.getInteger(R.integer.config_workspaceScrimAlpha) / 100f;
|
||||
|
||||
@@ -29,7 +29,6 @@ import android.graphics.Rect;
|
||||
import android.graphics.Region;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.DragEvent;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
@@ -52,7 +51,7 @@ import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.LauncherAppWidgetHostView;
|
||||
import com.android.launcher3.PinchToOverviewListener;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.SearchDropTargetBar;
|
||||
import com.android.launcher3.DropTargetBar;
|
||||
import com.android.launcher3.ShortcutAndWidgetContainer;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.Workspace;
|
||||
@@ -184,31 +183,17 @@ public class DragLayer extends InsettableFrameLayout {
|
||||
|
||||
private boolean isEventOverFolderTextRegion(Folder folder, MotionEvent ev) {
|
||||
getDescendantRectRelativeToSelf(folder.getEditTextRegion(), mHitRect);
|
||||
if (mHitRect.contains((int) ev.getX(), (int) ev.getY())) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return mHitRect.contains((int) ev.getX(), (int) ev.getY());
|
||||
}
|
||||
|
||||
private boolean isEventOverFolder(Folder folder, MotionEvent ev) {
|
||||
getDescendantRectRelativeToSelf(folder, mHitRect);
|
||||
if (mHitRect.contains((int) ev.getX(), (int) ev.getY())) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return mHitRect.contains((int) ev.getX(), (int) ev.getY());
|
||||
}
|
||||
|
||||
private boolean isEventOverDropTargetBar(MotionEvent ev) {
|
||||
getDescendantRectRelativeToSelf(mLauncher.getSearchDropTargetBar(), mHitRect);
|
||||
if (mHitRect.contains((int) ev.getX(), (int) ev.getY())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
getDescendantRectRelativeToSelf(mLauncher.getAppInfoDropTargetBar(), mHitRect);
|
||||
if (mHitRect.contains((int) ev.getX(), (int) ev.getY())) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
getDescendantRectRelativeToSelf(mLauncher.getDropTargetBar(), mHitRect);
|
||||
return mHitRect.contains((int) ev.getX(), (int) ev.getY());
|
||||
}
|
||||
|
||||
private boolean handleTouchDown(MotionEvent ev, boolean intercept) {
|
||||
@@ -356,7 +341,7 @@ public class DragLayer extends InsettableFrameLayout {
|
||||
return super.onRequestSendAccessibilityEvent(child, event);
|
||||
}
|
||||
|
||||
if (isInAccessibleDrag() && child instanceof SearchDropTargetBar) {
|
||||
if (isInAccessibleDrag() && child instanceof DropTargetBar) {
|
||||
return super.onRequestSendAccessibilityEvent(child, event);
|
||||
}
|
||||
// Skip propagating onRequestSendAccessibilityEvent all for other children
|
||||
@@ -374,8 +359,7 @@ public class DragLayer extends InsettableFrameLayout {
|
||||
childrenForAccessibility.add(currentFolder);
|
||||
|
||||
if (isInAccessibleDrag()) {
|
||||
childrenForAccessibility.add(mLauncher.getSearchDropTargetBar());
|
||||
childrenForAccessibility.add(mLauncher.getAppInfoDropTargetBar());
|
||||
childrenForAccessibility.add(mLauncher.getDropTargetBar());
|
||||
}
|
||||
} else {
|
||||
super.addChildrenForAccessibility(childrenForAccessibility);
|
||||
|
||||
@@ -318,7 +318,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
|
||||
@Override
|
||||
public void enableAccessibleDrag(boolean enable) {
|
||||
mLauncher.getSearchDropTargetBar().enableAccessibleDrag(enable);
|
||||
mLauncher.getDropTargetBar().enableAccessibleDrag(enable);
|
||||
for (int i = 0; i < mContent.getChildCount(); i++) {
|
||||
mContent.getPageAt(i).enableAccessibleDrag(enable, CellLayout.FOLDER_ACCESSIBILITY_DRAG);
|
||||
}
|
||||
@@ -1054,7 +1054,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
int top = Math.min(Math.max(sTempRect.top, centeredTop),
|
||||
sTempRect.top + sTempRect.height() - height);
|
||||
|
||||
int distFromEdgeOfScreen = grid.getWorkspacePadding(isLayoutRtl()).left + getPaddingLeft();
|
||||
int distFromEdgeOfScreen = grid.getWorkspacePadding().left + getPaddingLeft();
|
||||
|
||||
if (grid.isPhone && (grid.availableWidthPx - width) < 4 * distFromEdgeOfScreen) {
|
||||
// Center the folder if it is very close to being centered anyway, by virtue of
|
||||
@@ -1093,7 +1093,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
|
||||
private int getContentAreaHeight() {
|
||||
DeviceProfile grid = mLauncher.getDeviceProfile();
|
||||
Rect workspacePadding = grid.getWorkspacePadding(mContent.mIsRtl);
|
||||
Rect workspacePadding = grid.getWorkspacePadding();
|
||||
int maxContentAreaHeight = grid.availableHeightPx -
|
||||
workspacePadding.top - workspacePadding.bottom -
|
||||
mFooterHeight;
|
||||
|
||||
@@ -116,75 +116,4 @@ public class InvariantDeviceProfileTest extends AndroidTestCase {
|
||||
// Add more tests for other devices, however, running them once on a single device is enough
|
||||
// for verifying that for a platform version, the WindowManager and DisplayMetrics is
|
||||
// working as intended.
|
||||
|
||||
/**
|
||||
* Make sure that the height for the QSB is what we expect in normal mode.
|
||||
*/
|
||||
public void testQsbNormalHeight() {
|
||||
Resources resources = getContext().getResources();
|
||||
DeviceProfile landscapeProfile = mInvariantProfile.landscapeProfile;
|
||||
DeviceProfile portraitProfile = mInvariantProfile.portraitProfile;
|
||||
landscapeProfile.setSearchBarHeight(LauncherCallbacks.SEARCH_BAR_HEIGHT_NORMAL);
|
||||
portraitProfile.setSearchBarHeight(LauncherCallbacks.SEARCH_BAR_HEIGHT_NORMAL);
|
||||
Rect portraitBounds = portraitProfile.getSearchBarBounds(true); // RTL shouldn't matter.
|
||||
int portraitHeight = (int) Utilities.dpiFromPx(portraitBounds.height(),
|
||||
resources.getDisplayMetrics());
|
||||
Rect landscapeBounds = landscapeProfile.getSearchBarBounds(true); // RTL shouldn't matter.
|
||||
int landscapeHeight = (int) Utilities.dpiFromPx(landscapeBounds.height(),
|
||||
resources.getDisplayMetrics());
|
||||
if (portraitProfile.isTablet) {
|
||||
assertEquals(8 + 48 + 24, portraitHeight);
|
||||
} else {
|
||||
assertEquals(8 + 48 + 12, portraitHeight);
|
||||
}
|
||||
// Make sure the height that we pass in the widget options bundle is the height of the
|
||||
// search bar + 8dps padding top and bottom.
|
||||
Point portraitDimens = portraitProfile.getSearchBarDimensForWidgetOpts(resources);
|
||||
int portraitWidgetOptsHeight = portraitDimens.y;
|
||||
Point landscapeDimens = landscapeProfile.getSearchBarDimensForWidgetOpts(resources);
|
||||
int landscapeWidgetOptsHeight = landscapeDimens.y;
|
||||
assertEquals(8 + 48 + 8, (int) Utilities.dpiFromPx(portraitWidgetOptsHeight,
|
||||
resources.getDisplayMetrics()));
|
||||
if (!landscapeProfile.isVerticalBarLayout()) {
|
||||
assertEquals(portraitHeight, landscapeHeight);
|
||||
assertEquals(portraitWidgetOptsHeight, landscapeWidgetOptsHeight);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure that the height for the QSB is what we expect in tall mode.
|
||||
*/
|
||||
public void testQsbTallHeight() {
|
||||
Resources resources = getContext().getResources();
|
||||
DeviceProfile landscapeProfile = mInvariantProfile.landscapeProfile;
|
||||
DeviceProfile portraitProfile = mInvariantProfile.portraitProfile;
|
||||
landscapeProfile.setSearchBarHeight(LauncherCallbacks.SEARCH_BAR_HEIGHT_TALL);
|
||||
portraitProfile.setSearchBarHeight(LauncherCallbacks.SEARCH_BAR_HEIGHT_TALL);
|
||||
Rect portraitBounds = portraitProfile.getSearchBarBounds(true); // RTL shouldn't matter.
|
||||
int portraitHeight = (int) Utilities.dpiFromPx(portraitBounds.height(),
|
||||
resources.getDisplayMetrics());
|
||||
Rect landscapeBounds = landscapeProfile.getSearchBarBounds(true); // RTL shouldn't matter.
|
||||
int landscapeHeight = (int) Utilities.dpiFromPx(landscapeBounds.height(),
|
||||
resources.getDisplayMetrics());
|
||||
if (portraitProfile.isPhone) {
|
||||
// This fails on some devices due to http://b/26884580 (portraitHeight is 101, not 100).
|
||||
// TODO: Remove the comparision against 101 once b/26884580 is fixed
|
||||
// assertEquals(4 + 94 + 2, portraitHeight);
|
||||
assertTrue(portraitHeight == (4 + 94 + 2) || portraitHeight == (4 + 95 + 2));
|
||||
} else {
|
||||
assertEquals(8 + 94 + 24, portraitHeight);
|
||||
}
|
||||
// Make sure the height that we pass in the widget options bundle is the height of the
|
||||
// search bar + 8dps padding top and bottom.
|
||||
Point portraitDimens = portraitProfile.getSearchBarDimensForWidgetOpts(resources);
|
||||
int portraitWidgetOptsHeight = portraitDimens.y;
|
||||
Point landscapeDimens = landscapeProfile.getSearchBarDimensForWidgetOpts(resources);
|
||||
int landscapeWidgetOptsHeight = landscapeDimens.y;
|
||||
assertEquals(8 + 94 + 8, (int) Utilities.dpiFromPx(portraitWidgetOptsHeight,
|
||||
resources.getDisplayMetrics()));
|
||||
if (!landscapeProfile.isVerticalBarLayout()) {
|
||||
assertEquals(portraitHeight, landscapeHeight);
|
||||
assertEquals(portraitWidgetOptsHeight, landscapeWidgetOptsHeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user