Snap for 9390188 from 9a6a2c8a2d to tm-qpr2-release
Change-Id: Id09b62b43ad0de35851b518fae46ba0e10a0309b
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 5.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 5.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 5.5 KiB |
@@ -40,68 +40,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="378dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
launcher:pageIndicator="@+id/content_page_indicator">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/page_switch_apps"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:text="@string/taskbar_edu_switch_apps"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="322dp"
|
||||
android:layout_height="282dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@drawable/taskbar_edu_switch_apps"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/page_splitscreen"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:text="@string/taskbar_edu_splitscreen"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="322dp"
|
||||
android:layout_height="282dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@drawable/taskbar_edu_splitscreen"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/page_stashing"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:text="@string/taskbar_edu_stashing"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="322dp"
|
||||
android:layout_height="282dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@drawable/taskbar_edu_stashing"/>
|
||||
</LinearLayout>
|
||||
</com.android.launcher3.taskbar.TaskbarEduPagedView>
|
||||
launcher:pageIndicator="@+id/content_page_indicator" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/edu_start_button"
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/taskbar_edu_splitscreen" />
|
||||
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@+id/animation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
app:lottie_rawRes="@raw/taskbar_edu_splitscreen_persistent" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/taskbar_edu_suggestions" />
|
||||
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@id/animation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
app:lottie_rawRes="@raw/taskbar_edu_suggestions_persistent" />
|
||||
</LinearLayout>
|
||||
</merge>
|
||||
@@ -0,0 +1,78 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/taskbar_edu_stashing" />
|
||||
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@+id/animation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
app:lottie_rawRes="@raw/taskbar_edu_stashing_transient" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/taskbar_edu_splitscreen" />
|
||||
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@id/animation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
app:lottie_rawRes="@raw/taskbar_edu_splitscreen_transient" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
style="@style/TextAppearance.TaskbarEdu.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/taskbar_edu_suggestions" />
|
||||
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@id/animation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
app:lottie_rawRes="@raw/taskbar_edu_suggestions_transient" />
|
||||
</LinearLayout>
|
||||
</merge>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -78,10 +78,8 @@
|
||||
<string name="allset_title" msgid="5021126669778966707">"എല്ലാം സജ്ജീകരിച്ചു!"</string>
|
||||
<string name="allset_hint" msgid="2384632994739392447">"ഹോമിലേക്ക് പോകാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string>
|
||||
<string name="allset_button_hint" msgid="2395219947744706291">"നിങ്ങളുടെ ഹോം സ്ക്രീനിലേക്ക് പോകാൻ ഹോം ബട്ടൺ ടാപ്പ് ചെയ്യുക"</string>
|
||||
<!-- no translation found for allset_description_generic (5385500062202019855) -->
|
||||
<skip />
|
||||
<!-- no translation found for default_device_name (6660656727127422487) -->
|
||||
<skip />
|
||||
<string name="allset_description_generic" msgid="5385500062202019855">"നിങ്ങൾക്ക് <xliff:g id="DEVICE">%1$s</xliff:g> ഉപയോഗിച്ചു തുടങ്ങാം"</string>
|
||||
<string name="default_device_name" msgid="6660656727127422487">"ഉപകരണം"</string>
|
||||
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"സിസ്റ്റം നാവിഗേഷൻ ക്രമീകരണം"</annotation></string>
|
||||
<string name="action_share" msgid="2648470652637092375">"പങ്കിടുക"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"സ്ക്രീൻഷോട്ട്"</string>
|
||||
@@ -94,8 +92,7 @@
|
||||
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"റദ്ദാക്കുക"</string>
|
||||
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"ഒഴിവാക്കുക"</string>
|
||||
<string name="accessibility_rotate_button" msgid="4771825231336502943">"സ്ക്രീൻ റൊട്ടേറ്റ് ചെയ്യുക"</string>
|
||||
<!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
|
||||
<skip />
|
||||
<string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"ടാസ്ക്ബാർ മാർഗ്ഗനിർദ്ദേശ വിൻഡോ"</string>
|
||||
<string name="taskbar_edu_opened" msgid="3950252793551919129">"ടാസ്ക്ക്ബാർ വിവര പാനൽ ദൃശ്യമായി"</string>
|
||||
<string name="taskbar_edu_closed" msgid="126643734478892862">"ടാസ്ക്ക്ബാർ വിവര പാനൽ അടച്ചു"</string>
|
||||
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"ആപ്പുകൾ മാറാൻ ടാസ്ക്ക്ബാർ ഉപയോഗിക്കുക"</string>
|
||||
@@ -112,10 +109,8 @@
|
||||
<string name="taskbar_button_recents" msgid="7273376136216613134">"അടുത്തിടെയുള്ളവ"</string>
|
||||
<string name="taskbar_button_notifications" msgid="7471740351507357318">"അറിയിപ്പുകൾ"</string>
|
||||
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"ദ്രുത ക്രമീകരണം"</string>
|
||||
<!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
|
||||
<skip />
|
||||
<!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
|
||||
<skip />
|
||||
<string name="taskbar_a11y_title" msgid="6432169809852243110">"ടാസ്ക്ബാർ"</string>
|
||||
<string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"നാവിഗേഷൻ ബാർ"</string>
|
||||
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"മുകളിലേക്കോ ഇടത്തേക്കോ നീക്കുക"</string>
|
||||
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"താഴേക്കോ വലത്തേക്കോ നീക്കുക"</string>
|
||||
</resources>
|
||||
|
||||
@@ -78,10 +78,8 @@
|
||||
<string name="allset_title" msgid="5021126669778966707">"அனைத்தையும் அமைத்துவிட்டீர்கள்!"</string>
|
||||
<string name="allset_hint" msgid="2384632994739392447">"முகப்புத் திரைக்குச் செல்ல மேல்நோக்கி ஸ்வைப் செய்யுங்கள்"</string>
|
||||
<string name="allset_button_hint" msgid="2395219947744706291">"முகப்புத் திரைக்குச் செல்வதற்கு முகப்பு பட்டனைத் தட்டவும்"</string>
|
||||
<!-- no translation found for allset_description_generic (5385500062202019855) -->
|
||||
<skip />
|
||||
<!-- no translation found for default_device_name (6660656727127422487) -->
|
||||
<skip />
|
||||
<string name="allset_description_generic" msgid="5385500062202019855">"உங்கள் <xliff:g id="DEVICE">%1$s</xliff:g> சாதனத்தைப் பயன்படுத்தத் தயாராகிவிட்டீர்கள்"</string>
|
||||
<string name="default_device_name" msgid="6660656727127422487">"சாதனம்"</string>
|
||||
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"சிஸ்டம் வழிசெலுத்தல் அமைப்புகள்"</annotation></string>
|
||||
<string name="action_share" msgid="2648470652637092375">"பகிர்"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"ஸ்கிரீன்ஷாட்"</string>
|
||||
@@ -94,8 +92,7 @@
|
||||
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ரத்துசெய்"</string>
|
||||
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"தவிர்"</string>
|
||||
<string name="accessibility_rotate_button" msgid="4771825231336502943">"திரையைச் சுழற்றும்"</string>
|
||||
<!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
|
||||
<skip />
|
||||
<string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"செயல் பட்டியைப் பயன்படுத்தும் விதம்"</string>
|
||||
<string name="taskbar_edu_opened" msgid="3950252793551919129">"பணிப்பட்டியை எவ்வாறு பயன்படுத்துவது என்பது பற்றிய பலகம் காட்டப்படுகிறது"</string>
|
||||
<string name="taskbar_edu_closed" msgid="126643734478892862">"பணிப்பட்டியை எவ்வாறு பயன்படுத்துவது என்பது பற்றிய பலகம் மூடப்பட்டது"</string>
|
||||
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"ஆப்ஸிற்கு இடையே மாற பணிப்பட்டியைப் பயன்படுத்தவும்"</string>
|
||||
@@ -112,10 +109,8 @@
|
||||
<string name="taskbar_button_recents" msgid="7273376136216613134">"சமீபத்தியவை"</string>
|
||||
<string name="taskbar_button_notifications" msgid="7471740351507357318">"அறிவிப்புகள்"</string>
|
||||
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"விரைவு அமைப்புகள்"</string>
|
||||
<!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
|
||||
<skip />
|
||||
<!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
|
||||
<skip />
|
||||
<string name="taskbar_a11y_title" msgid="6432169809852243110">"செயல் பட்டி"</string>
|
||||
<string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"வழிசெலுத்தல் பட்டி"</string>
|
||||
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"மேலே/இடதுபுறம் நகர்த்தும்"</string>
|
||||
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"கீழே/வலதுபுறம் நகர்த்தும்"</string>
|
||||
</resources>
|
||||
|
||||
@@ -230,15 +230,12 @@
|
||||
<string name="taskbar_edu_opened">Taskbar education appeared</string>
|
||||
<!-- Accessibility text spoken when the taskbar education panel disappears [CHAR_LIMIT=NONE] -->
|
||||
<string name="taskbar_edu_closed">Taskbar education closed</string>
|
||||
<!-- Text in dialog that lets a user know how they can use the taskbar to switch apps on their device.
|
||||
[CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_switch_apps">Use the taskbar to switch apps</string>
|
||||
<!-- Text in dialog that lets a user know how they can use the taskbar to use multiple apps at once on their device.
|
||||
[CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_splitscreen">Drag to the side to use two apps at once</string>
|
||||
<!-- Text in dialog that lets a user know how they can hide the taskbar on their device.
|
||||
[CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_stashing">Touch & hold to hide the taskbar</string>
|
||||
<!-- Text in dialog that lets a user know how they can use the taskbar to use multiple apps at once on their device. [CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_splitscreen">Drag to the side to use 2 apps at once</string>
|
||||
<!-- Text in dialog that lets a user know how they can show the taskbar on their device. [CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_stashing">Short swipe up to show the taskbar</string>
|
||||
<!-- Text in dialog that lets a user know how the taskbar suggests apps based on their usage. [CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_suggestions">The taskbar suggests apps based on your routine</string>
|
||||
<!-- Text on button to go to the next screen of a tutorial [CHAR_LIMIT=16] -->
|
||||
<string name="taskbar_edu_next">Next</string>
|
||||
<!-- Text on button to go to the previous screen of a tutorial [CHAR_LIMIT=16] -->
|
||||
|
||||
@@ -30,7 +30,6 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.BubbleTextView;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
@@ -51,7 +50,7 @@ import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.P)
|
||||
public class PredictionRowView<T extends Context & ActivityContext & DeviceProfileListenable>
|
||||
public class PredictionRowView<T extends Context & ActivityContext>
|
||||
extends LinearLayout implements OnDeviceProfileChangeListener, FloatingHeaderRow {
|
||||
|
||||
private final T mActivityContext;
|
||||
|
||||
@@ -42,7 +42,8 @@ public class DesktopVisibilityController {
|
||||
* Whether desktop mode is supported.
|
||||
*/
|
||||
private boolean isDesktopModeSupported() {
|
||||
return SystemProperties.getBoolean("persist.wm.debug.desktop_mode", false);
|
||||
return SystemProperties.getBoolean("persist.wm.debug.desktop_mode", false)
|
||||
|| SystemProperties.getBoolean("persist.wm.debug.desktop_mode_2", false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -19,18 +19,16 @@ import android.content.Context;
|
||||
import android.view.ContextThemeWrapper;
|
||||
import android.view.LayoutInflater;
|
||||
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.util.Themes;
|
||||
import com.android.launcher3.views.AppLauncher;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
// TODO(b/218912746): Share more behavior to avoid all apps context depending directly on taskbar.
|
||||
/** Base for common behavior between taskbar window contexts. */
|
||||
public abstract class BaseTaskbarContext extends ContextThemeWrapper implements AppLauncher,
|
||||
DeviceProfileListenable {
|
||||
public abstract class BaseTaskbarContext extends ContextThemeWrapper implements ActivityContext {
|
||||
|
||||
protected final LayoutInflater mLayoutInflater;
|
||||
private final List<OnDeviceProfileChangeListener> mDPChangeListeners = new ArrayList<>();
|
||||
|
||||
@@ -38,6 +38,7 @@ import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.QuickstepTransitionManager;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.logging.InstanceId;
|
||||
import com.android.launcher3.logging.InstanceIdSequence;
|
||||
@@ -45,7 +46,6 @@ import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.uioverrides.QuickstepLauncher;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.OnboardingPrefs;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.RecentsAnimationCallbacks;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ import com.android.launcher3.LauncherAnimUtils;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AlphaUpdateListener;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarButton;
|
||||
import com.android.launcher3.taskbar.navbutton.NavButtonLayoutFactory;
|
||||
import com.android.launcher3.taskbar.navbutton.NavButtonLayoutFactory.NavButtonLayoutter;
|
||||
@@ -89,7 +90,6 @@ import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
|
||||
import com.android.launcher3.util.MultiValueAlpha;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
import com.android.launcher3.views.BaseDragLayer;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.systemui.shared.rotation.FloatingRotationButton;
|
||||
import com.android.systemui.shared.rotation.RotationButton;
|
||||
import com.android.systemui.shared.rotation.RotationButtonController;
|
||||
|
||||
@@ -28,13 +28,13 @@ import android.view.ViewOutlineProvider;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.LauncherPrefs;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.RevealOutlineAnimation;
|
||||
import com.android.launcher3.anim.RoundedRectRevealOutlineProvider;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.Executors;
|
||||
import com.android.launcher3.util.MultiPropertyFactory;
|
||||
import com.android.launcher3.util.MultiValueAlpha;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.systemui.shared.navigationbar.RegionSamplingHelper;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -21,9 +21,9 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController;
|
||||
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.systemui.shared.rotation.RotationButtonController;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -23,11 +23,11 @@ import android.view.ViewTreeObserver;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.testing.shared.ResourceUtils;
|
||||
import com.android.launcher3.util.DimensionUtils;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
|
||||
@@ -18,9 +18,14 @@ package com.android.launcher3.taskbar;
|
||||
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IN_APP_EDU;
|
||||
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
|
||||
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
|
||||
import com.airbnb.lottie.LottieAnimationView;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -33,6 +38,7 @@ public class TaskbarEduController implements TaskbarControllers.LoggableTaskbarC
|
||||
TaskbarControllers mControllers;
|
||||
|
||||
private TaskbarEduView mTaskbarEduView;
|
||||
private TaskbarEduPagedView mPagedView;
|
||||
|
||||
public TaskbarEduController(TaskbarActivityContext activity) {
|
||||
mActivity = activity;
|
||||
@@ -45,11 +51,20 @@ public class TaskbarEduController implements TaskbarControllers.LoggableTaskbarC
|
||||
void showEdu() {
|
||||
TaskbarOverlayController overlayController = mControllers.taskbarOverlayController;
|
||||
TaskbarOverlayContext overlayContext = overlayController.requestWindow();
|
||||
mTaskbarEduView = (TaskbarEduView) overlayContext.getLayoutInflater().inflate(
|
||||
R.layout.taskbar_edu, overlayContext.getDragLayer(), false);
|
||||
mTaskbarEduView.init(new TaskbarEduCallbacks());
|
||||
mControllers.navbarButtonsViewController.setSlideInViewVisible(true);
|
||||
LayoutInflater layoutInflater = overlayContext.getLayoutInflater();
|
||||
|
||||
mTaskbarEduView = (TaskbarEduView) layoutInflater.inflate(
|
||||
R.layout.taskbar_edu, overlayContext.getDragLayer(), false);
|
||||
mPagedView = mTaskbarEduView.findViewById(R.id.content);
|
||||
layoutInflater.inflate(
|
||||
DisplayController.isTransientTaskbar(overlayContext)
|
||||
? R.layout.taskbar_edu_pages_transient
|
||||
: R.layout.taskbar_edu_pages_persistent,
|
||||
mPagedView,
|
||||
true);
|
||||
mTaskbarEduView.init(new TaskbarEduCallbacks());
|
||||
|
||||
mControllers.navbarButtonsViewController.setSlideInViewVisible(true);
|
||||
TaskbarStashController stashController = mControllers.taskbarStashController;
|
||||
stashController.updateStateForFlag(FLAG_STASHED_IN_APP_EDU, true);
|
||||
stashController.applyState(overlayController.getOpenDuration());
|
||||
@@ -75,7 +90,17 @@ public class TaskbarEduController implements TaskbarControllers.LoggableTaskbarC
|
||||
* Callbacks for {@link TaskbarEduView} to interact with its controller.
|
||||
*/
|
||||
class TaskbarEduCallbacks {
|
||||
void onPageChanged(int currentPage, int pageCount) {
|
||||
void onPageChanged(int prevPage, int currentPage, int pageCount) {
|
||||
// Reset previous pages' animation.
|
||||
LottieAnimationView prevAnimation = mPagedView.getChildAt(prevPage)
|
||||
.findViewById(R.id.animation);
|
||||
prevAnimation.cancelAnimation();
|
||||
prevAnimation.setFrame(0);
|
||||
|
||||
mPagedView.getChildAt(currentPage)
|
||||
.<LottieAnimationView>findViewById(R.id.animation)
|
||||
.playAnimation();
|
||||
|
||||
if (currentPage == 0) {
|
||||
mTaskbarEduView.updateStartButton(R.string.taskbar_edu_close,
|
||||
v -> mTaskbarEduView.close(true /* animate */));
|
||||
|
||||
@@ -48,7 +48,7 @@ public class TaskbarEduPagedView extends PagedView<PageIndicatorDots> {
|
||||
|
||||
void setControllerCallbacks(TaskbarEduCallbacks controllerCallbacks) {
|
||||
mControllerCallbacks = controllerCallbacks;
|
||||
mControllerCallbacks.onPageChanged(getCurrentPage(), getPageCount());
|
||||
mControllerCallbacks.onPageChanged(getCurrentPage(), getCurrentPage(), getPageCount());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -67,7 +67,7 @@ public class TaskbarEduPagedView extends PagedView<PageIndicatorDots> {
|
||||
@Override
|
||||
protected void notifyPageSwitchListener(int prevPage) {
|
||||
super.notifyPageSwitchListener(prevPage);
|
||||
mControllerCallbacks.onPageChanged(getCurrentPage(), getPageCount());
|
||||
mControllerCallbacks.onPageChanged(prevPage, getCurrentPage(), getPageCount());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -30,10 +30,10 @@ import android.os.Looper;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.compat.AccessibilityManagerCompat;
|
||||
import com.android.launcher3.util.MultiPropertyFactory;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
|
||||
/**
|
||||
* Controller for taskbar when force visible in immersive mode is set.
|
||||
|
||||
@@ -35,12 +35,12 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.QuickstepTransitionManager;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorListeners;
|
||||
import com.android.launcher3.statemanager.StateManager;
|
||||
import com.android.launcher3.uioverrides.QuickstepLauncher;
|
||||
import com.android.launcher3.uioverrides.states.OverviewState;
|
||||
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.RecentsAnimationCallbacks;
|
||||
import com.android.quickstep.RecentsAnimationController;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
|
||||
@@ -22,7 +22,7 @@ import android.animation.ObjectAnimator;
|
||||
import android.view.animation.Interpolator;
|
||||
import android.view.animation.PathInterpolator;
|
||||
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -52,11 +52,11 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.LauncherPrefs;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorListeners;
|
||||
import com.android.launcher3.testing.shared.TestProtocol;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
*/
|
||||
package com.android.launcher3.taskbar;
|
||||
|
||||
import static com.android.launcher3.anim.AnimatedFloat.VALUE;
|
||||
import static com.android.launcher3.anim.AnimatorListeners.forEndCallback;
|
||||
import static com.android.quickstep.AnimatedFloat.VALUE;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
@@ -26,10 +26,10 @@ import android.animation.ValueAnimator;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.dynamicanimation.animation.SpringForce;
|
||||
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.anim.SpringAnimationBuilder;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
|
||||
@@ -19,13 +19,13 @@ import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
|
||||
import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA;
|
||||
import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y;
|
||||
import static com.android.launcher3.Utilities.squaredHypot;
|
||||
import static com.android.launcher3.anim.AnimatedFloat.VALUE;
|
||||
import static com.android.launcher3.anim.Interpolators.FINAL_FRAME;
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_ALLAPPS_BUTTON_TAP;
|
||||
import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode;
|
||||
import static com.android.launcher3.touch.SingleAxisSwipeDetector.DIRECTION_NEGATIVE;
|
||||
import static com.android.launcher3.touch.SingleAxisSwipeDetector.VERTICAL;
|
||||
import static com.android.quickstep.AnimatedFloat.VALUE;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.graphics.Rect;
|
||||
@@ -45,6 +45,7 @@ import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AlphaUpdateListener;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
@@ -59,7 +60,6 @@ import com.android.launcher3.util.ItemInfoMatcher;
|
||||
import com.android.launcher3.util.LauncherBindableItemsContainer;
|
||||
import com.android.launcher3.util.MultiPropertyFactory;
|
||||
import com.android.launcher3.util.MultiValueAlpha;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@@ -20,12 +20,11 @@ import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_ALLAP
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.util.Themes;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
/**
|
||||
* Definition for AllApps state
|
||||
@@ -40,7 +39,7 @@ public class AllAppsState extends LauncherState {
|
||||
}
|
||||
|
||||
@Override
|
||||
public <DEVICE_PROFILE_CONTEXT extends Context & DeviceProfileListenable>
|
||||
public <DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
||||
int getTransitionDuration(DEVICE_PROFILE_CONTEXT context, boolean isToState) {
|
||||
return isToState
|
||||
? context.getDeviceProfile().allAppsOpenDuration
|
||||
@@ -78,7 +77,7 @@ public class AllAppsState extends LauncherState {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected <DEVICE_PROFILE_CONTEXT extends Context & DeviceProfile.DeviceProfileListenable>
|
||||
protected <DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
||||
float getDepthUnchecked(DEVICE_PROFILE_CONTEXT context) {
|
||||
if (context.getDeviceProfile().isTablet) {
|
||||
return context.getDeviceProfile().bottomSheetDepth;
|
||||
|
||||
+1
-1
@@ -62,6 +62,7 @@ import android.view.animation.Interpolator;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
@@ -69,7 +70,6 @@ import com.android.launcher3.touch.BaseSwipeDetector;
|
||||
import com.android.launcher3.touch.BothAxesSwipeDetector;
|
||||
import com.android.launcher3.uioverrides.QuickstepLauncher;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
import com.android.quickstep.util.AnimatorControllerWithResistance;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
|
||||
@@ -58,6 +58,7 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.anim.SpringAnimationBuilder;
|
||||
|
||||
@@ -31,6 +31,7 @@ import androidx.annotation.UiThread;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
|
||||
@@ -303,7 +303,8 @@ public interface TaskShortcutFactory {
|
||||
|
||||
private boolean isAvailable(BaseDraggingActivity activity, int displayId) {
|
||||
return ActivityManagerWrapper.getInstance().supportsFreeformMultiWindow(activity)
|
||||
&& !SystemProperties.getBoolean("persist.wm.debug.desktop_mode", false);
|
||||
&& !SystemProperties.getBoolean("persist.wm.debug.desktop_mode", false)
|
||||
&& !SystemProperties.getBoolean("persist.wm.debug.desktop_mode_2", false);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.BaseActivity;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
|
||||
@@ -73,6 +73,7 @@ import com.android.launcher3.BaseDraggingActivity;
|
||||
import com.android.launcher3.LauncherPrefs;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.provider.RestoreDbTask;
|
||||
import com.android.launcher3.statehandlers.DesktopVisibilityController;
|
||||
|
||||
@@ -41,11 +41,11 @@ import android.view.RemoteAnimationTarget;
|
||||
import android.view.VelocityTracker;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.testing.TestLogging;
|
||||
import com.android.launcher3.testing.shared.TestProtocol;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.GestureState;
|
||||
import com.android.quickstep.InputConsumer;
|
||||
import com.android.quickstep.MultiStateCallback;
|
||||
|
||||
+1
-1
@@ -28,12 +28,12 @@ import android.content.Intent;
|
||||
import android.graphics.Point;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorListeners;
|
||||
import com.android.launcher3.testing.TestLogging;
|
||||
import com.android.launcher3.testing.shared.TestProtocol;
|
||||
import com.android.launcher3.touch.SingleAxisSwipeDetector;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.GestureState;
|
||||
import com.android.quickstep.InputConsumer;
|
||||
import com.android.quickstep.MultiStateCallback;
|
||||
|
||||
@@ -58,9 +58,9 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.InvariantDeviceProfile;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.util.Executors;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.GestureState;
|
||||
import com.android.quickstep.TouchInteractionService.TISBinder;
|
||||
import com.android.quickstep.util.TISBindHelper;
|
||||
|
||||
+1
-1
@@ -24,8 +24,8 @@ import android.graphics.PointF;
|
||||
import android.os.Build;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.SwipeUpAnimationLogic;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
|
||||
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult;
|
||||
|
||||
+1
-1
@@ -42,10 +42,10 @@ import androidx.annotation.Nullable;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.InvariantDeviceProfile;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorListeners;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.GestureState;
|
||||
import com.android.quickstep.OverviewComponentObserver;
|
||||
import com.android.quickstep.RecentsAnimationDeviceState;
|
||||
|
||||
@@ -41,10 +41,10 @@ import androidx.annotation.NonNull;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds;
|
||||
import com.android.launcher3.util.TraceHelper;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.BaseActivityInterface;
|
||||
import com.android.quickstep.TaskAnimationManager;
|
||||
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||
|
||||
@@ -59,9 +59,10 @@ import java.util.function.Consumer;
|
||||
// TODO(b/249371338): TaskView needs to be refactored to have better support for N tasks.
|
||||
public class DesktopTaskView extends TaskView {
|
||||
|
||||
/** Flag to indicate whether desktop mode is available on the device */
|
||||
public static final boolean DESKTOP_MODE_SUPPORTED = SystemProperties.getBoolean(
|
||||
"persist.wm.debug.desktop_mode", false);
|
||||
/** Flags to indicate whether desktop mode is available on the device */
|
||||
public static final boolean DESKTOP_MODE_SUPPORTED =
|
||||
SystemProperties.getBoolean("persist.wm.debug.desktop_mode", false)
|
||||
|| SystemProperties.getBoolean("persist.wm.debug.desktop_mode_2", false);
|
||||
|
||||
private static final String TAG = DesktopTaskView.class.getSimpleName();
|
||||
|
||||
|
||||
@@ -135,6 +135,7 @@ import com.android.launcher3.InvariantDeviceProfile;
|
||||
import com.android.launcher3.PagedView;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatedFloat;
|
||||
import com.android.launcher3.anim.AnimatorListeners;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
@@ -159,7 +160,6 @@ import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
|
||||
import com.android.launcher3.util.Themes;
|
||||
import com.android.launcher3.util.TranslateEdgeEffect;
|
||||
import com.android.launcher3.util.ViewPool;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.BaseActivityInterface;
|
||||
import com.android.quickstep.GestureState;
|
||||
import com.android.quickstep.RecentsAnimationController;
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
<string name="add_item_request_drag_hint" msgid="8730547755622776606">"לוחצים לחיצה ארוכה על הווידג\'ט כדי להזיז אותו במסך הבית"</string>
|
||||
<string name="add_to_home_screen" msgid="9168649446635919791">"הוספה למסך הבית"</string>
|
||||
<string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"הווידג\'ט <xliff:g id="WIDGET_NAME">%1$s</xliff:g> נוסף למסך הבית"</string>
|
||||
<string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{ווידג\'ט אחד}two{# ווידג\'טים}many{# ווידג\'טים}other{# ווידג\'טים}}"</string>
|
||||
<string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{קיצור דרך אחד}two{# קיצורי דרך}many{# קיצורי דרך}other{# קיצורי דרך}}"</string>
|
||||
<string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{ווידג\'ט אחד}one{# ווידג\'טים}two{# ווידג\'טים}other{# ווידג\'טים}}"</string>
|
||||
<string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{קיצור דרך אחד}one{# קיצורי דרך}two{# קיצורי דרך}other{# קיצורי דרך}}"</string>
|
||||
<string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"ווידג\'טים"</string>
|
||||
<string name="widgets_full_sheet_search_bar_hint" msgid="8484659090860596457">"חיפוש"</string>
|
||||
@@ -89,7 +89,7 @@
|
||||
<string name="uninstall_system_app_text" msgid="4172046090762920660">"זוהי אפליקציית מערכת ולא ניתן להסיר את התקנתה."</string>
|
||||
<string name="folder_hint_text" msgid="5174843001373488816">"עריכת השם"</string>
|
||||
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> מושבתת"</string>
|
||||
<string name="dotted_app_label" msgid="1865617679843363410">"{count,plural, =1{לאפליקציה {app_name} יש התראה אחת}two{לאפליקציה {app_name} יש # התראות}many{לאפליקציה {app_name} יש # התראות}other{לאפליקציה {app_name} יש # התראות}}"</string>
|
||||
<string name="dotted_app_label" msgid="1865617679843363410">"{count,plural, =1{לאפליקציה {app_name} יש התראה אחת}one{לאפליקציה {app_name} יש # התראות}two{לאפליקציה {app_name} יש # התראות}other{לאפליקציה {app_name} יש # התראות}}"</string>
|
||||
<string name="default_scroll_format" msgid="7475544710230993317">"דף %1$d מתוך %2$d"</string>
|
||||
<string name="workspace_scroll_format" msgid="8458889198184077399">"מסך הבית %1$d מתוך %2$d"</string>
|
||||
<string name="workspace_new_page" msgid="257366611030256142">"מסך הבית חדש"</string>
|
||||
|
||||
@@ -30,14 +30,13 @@ import android.window.OnBackInvokedDispatcher;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.testing.TestLogging;
|
||||
import com.android.launcher3.testing.shared.TestProtocol;
|
||||
import com.android.launcher3.util.SystemUiController;
|
||||
import com.android.launcher3.util.ViewCache;
|
||||
import com.android.launcher3.views.AppLauncher;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
import com.android.launcher3.views.ScrimView;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
@@ -48,8 +47,7 @@ import java.util.List;
|
||||
/**
|
||||
* Launcher BaseActivity
|
||||
*/
|
||||
public abstract class BaseActivity extends Activity implements AppLauncher,
|
||||
DeviceProfileListenable {
|
||||
public abstract class BaseActivity extends Activity implements ActivityContext {
|
||||
|
||||
private static final String TAG = "BaseActivity";
|
||||
|
||||
|
||||
@@ -55,7 +55,6 @@ import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.WindowBounds;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
@@ -1631,35 +1630,6 @@ public class DeviceProfile {
|
||||
void onDeviceProfileChanged(DeviceProfile dp);
|
||||
}
|
||||
|
||||
/** Allows registering listeners for {@link DeviceProfile} changes. */
|
||||
public interface DeviceProfileListenable {
|
||||
|
||||
/** The current device profile. */
|
||||
DeviceProfile getDeviceProfile();
|
||||
|
||||
/** Registered {@link OnDeviceProfileChangeListener} instances. */
|
||||
List<OnDeviceProfileChangeListener> getOnDeviceProfileChangeListeners();
|
||||
|
||||
/** Notifies listeners of a {@link DeviceProfile} change. */
|
||||
default void dispatchDeviceProfileChanged() {
|
||||
DeviceProfile deviceProfile = getDeviceProfile();
|
||||
List<OnDeviceProfileChangeListener> listeners = getOnDeviceProfileChangeListeners();
|
||||
for (int i = listeners.size() - 1; i >= 0; i--) {
|
||||
listeners.get(i).onDeviceProfileChanged(deviceProfile);
|
||||
}
|
||||
}
|
||||
|
||||
/** Register listener for {@link DeviceProfile} changes. */
|
||||
default void addOnDeviceProfileChangeListener(OnDeviceProfileChangeListener listener) {
|
||||
getOnDeviceProfileChangeListeners().add(listener);
|
||||
}
|
||||
|
||||
/** Unregister listener for {@link DeviceProfile} changes. */
|
||||
default void removeOnDeviceProfileChangeListener(OnDeviceProfileChangeListener listener) {
|
||||
getOnDeviceProfileChangeListeners().remove(listener);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler that deals with ItemInfo of the views for the DeviceProfile
|
||||
*/
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.android.launcher3.states.SpringLoadedState;
|
||||
import com.android.launcher3.testing.shared.TestProtocol;
|
||||
import com.android.launcher3.uioverrides.states.AllAppsState;
|
||||
import com.android.launcher3.uioverrides.states.OverviewState;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -261,7 +262,7 @@ public abstract class LauncherState implements BaseState<LauncherState> {
|
||||
*
|
||||
* 0 means completely zoomed in, without blurs. 1 is zoomed out, with blurs.
|
||||
*/
|
||||
public final <DEVICE_PROFILE_CONTEXT extends Context & DeviceProfile.DeviceProfileListenable>
|
||||
public final <DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
||||
float getDepth(DEVICE_PROFILE_CONTEXT context) {
|
||||
return getDepth(context,
|
||||
BaseDraggingActivity.fromContext(context).getDeviceProfile().isMultiWindowMode);
|
||||
@@ -272,7 +273,7 @@ public abstract class LauncherState implements BaseState<LauncherState> {
|
||||
*
|
||||
* @see #getDepth(Context).
|
||||
*/
|
||||
public final <DEVICE_PROFILE_CONTEXT extends Context & DeviceProfile.DeviceProfileListenable>
|
||||
public final <DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
||||
float getDepth(DEVICE_PROFILE_CONTEXT context, boolean isMultiWindowMode) {
|
||||
if (isMultiWindowMode) {
|
||||
return 0;
|
||||
@@ -280,7 +281,7 @@ public abstract class LauncherState implements BaseState<LauncherState> {
|
||||
return getDepthUnchecked(context);
|
||||
}
|
||||
|
||||
protected <DEVICE_PROFILE_CONTEXT extends Context & DeviceProfile.DeviceProfileListenable>
|
||||
protected <DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
||||
float getDepthUnchecked(DEVICE_PROFILE_CONTEXT context) {
|
||||
return 0f;
|
||||
}
|
||||
|
||||
@@ -27,13 +27,12 @@ import android.widget.RelativeLayout;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.allapps.BaseAllAppsAdapter.AdapterItem;
|
||||
import com.android.launcher3.allapps.search.SearchAdapterProvider;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.views.AppLauncher;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -42,8 +41,8 @@ import java.util.ArrayList;
|
||||
*
|
||||
* @param <T> Type of context inflating all apps.
|
||||
*/
|
||||
public class ActivityAllAppsContainerView<T extends Context & AppLauncher
|
||||
& DeviceProfileListenable> extends BaseAllAppsContainerView<T> {
|
||||
public class ActivityAllAppsContainerView<T extends Context & ActivityContext>
|
||||
extends BaseAllAppsContainerView<T> {
|
||||
|
||||
private static final long DEFAULT_SEARCH_TRANSITION_DURATION_MS = 300;
|
||||
|
||||
|
||||
@@ -48,7 +48,6 @@ import androidx.core.graphics.ColorUtils;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.DragSource;
|
||||
import com.android.launcher3.DropTarget.DragObject;
|
||||
@@ -81,8 +80,8 @@ import java.util.stream.Stream;
|
||||
*
|
||||
* @param <T> Type of context inflating all apps.
|
||||
*/
|
||||
public abstract class BaseAllAppsContainerView<T extends Context & ActivityContext
|
||||
& DeviceProfileListenable> extends SpringRelativeLayout implements DragSource, Insettable,
|
||||
public abstract class BaseAllAppsContainerView<T extends Context & ActivityContext>
|
||||
extends SpringRelativeLayout implements DragSource, Insettable,
|
||||
OnDeviceProfileChangeListener, OnActivePageChangedListener,
|
||||
ScrimView.ScrimDrawingController {
|
||||
|
||||
|
||||
@@ -26,17 +26,17 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.android.launcher3.BubbleTextView;
|
||||
import com.android.launcher3.allapps.AllAppsGridAdapter;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.views.AppLauncher;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
/**
|
||||
* Provides views for local search results.
|
||||
*/
|
||||
public class DefaultSearchAdapterProvider extends SearchAdapterProvider<AppLauncher> {
|
||||
public class DefaultSearchAdapterProvider extends SearchAdapterProvider<ActivityContext> {
|
||||
|
||||
private final RecyclerView.ItemDecoration mDecoration;
|
||||
private View mHighlightedView;
|
||||
|
||||
public DefaultSearchAdapterProvider(AppLauncher launcher) {
|
||||
public DefaultSearchAdapterProvider(ActivityContext launcher) {
|
||||
super(launcher);
|
||||
mDecoration = new RecyclerView.ItemDecoration() {
|
||||
@Override
|
||||
|
||||
+8
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
* 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.
|
||||
@@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.quickstep;
|
||||
package com.android.launcher3.anim;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
@@ -98,12 +98,18 @@ public class AnimatedFloat {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels the animation.
|
||||
*/
|
||||
public void cancelAnimation() {
|
||||
if (mValueAnimator != null) {
|
||||
mValueAnimator.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ends the animation.
|
||||
*/
|
||||
public void finishAnimation() {
|
||||
if (mValueAnimator != null && mValueAnimator.isRunning()) {
|
||||
mValueAnimator.end();
|
||||
@@ -63,6 +63,7 @@ import androidx.annotation.Nullable;
|
||||
import com.android.launcher3.BubbleTextView;
|
||||
import com.android.launcher3.CellLayout;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.Hotseat;
|
||||
import com.android.launcher3.InsettableFrameLayout;
|
||||
import com.android.launcher3.InvariantDeviceProfile;
|
||||
@@ -174,6 +175,7 @@ public class LauncherPreviewRenderer extends ContextWrapper
|
||||
}
|
||||
}
|
||||
|
||||
private final List<OnDeviceProfileChangeListener> mDpChangeListeners = new ArrayList<>();
|
||||
private final Handler mUiHandler;
|
||||
private final Context mContext;
|
||||
private final InvariantDeviceProfile mIdp;
|
||||
@@ -330,6 +332,11 @@ public class LauncherPreviewRenderer extends ContextWrapper
|
||||
return mDp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OnDeviceProfileChangeListener> getOnDeviceProfileChangeListeners() {
|
||||
return mDpChangeListeners;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Hotseat getHotseat() {
|
||||
return mHotseat;
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.launcher3.statemanager;
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
/**
|
||||
* Interface representing a state of a StatefulActivity
|
||||
@@ -37,7 +37,7 @@ public interface BaseState<T extends BaseState> {
|
||||
/**
|
||||
* @return How long the animation to this state should take (or from this state to NORMAL).
|
||||
*/
|
||||
<DEVICE_PROFILE_CONTEXT extends Context & DeviceProfileListenable>
|
||||
<DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
||||
int getTransitionDuration(DEVICE_PROFILE_CONTEXT context, boolean isToState);
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,23 +17,41 @@ package com.android.launcher3.views;
|
||||
|
||||
import static com.android.launcher3.logging.KeyboardStateManager.KeyboardState.HIDE;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_KEYBOARD_CLOSED;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP;
|
||||
import static com.android.launcher3.model.WidgetsModel.GO_DISABLE_WIDGETS;
|
||||
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
|
||||
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
|
||||
import android.app.ActivityOptions;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.LauncherApps;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.os.Process;
|
||||
import android.os.StrictMode;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
import android.view.Display;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.AccessibilityDelegate;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.WindowInsetsController;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.BubbleTextView;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.LauncherSettings;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.allapps.ActivityAllAppsContainerView;
|
||||
import com.android.launcher3.allapps.search.SearchAdapterProvider;
|
||||
@@ -41,20 +59,30 @@ import com.android.launcher3.dot.DotInfo;
|
||||
import com.android.launcher3.dragndrop.DragController;
|
||||
import com.android.launcher3.folder.FolderIcon;
|
||||
import com.android.launcher3.logger.LauncherAtom;
|
||||
import com.android.launcher3.logging.InstanceId;
|
||||
import com.android.launcher3.logging.InstanceIdSequence;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.model.StringCache;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.model.data.WorkspaceItemInfo;
|
||||
import com.android.launcher3.popup.PopupDataProvider;
|
||||
import com.android.launcher3.util.ActivityOptionsWrapper;
|
||||
import com.android.launcher3.util.OnboardingPrefs;
|
||||
import com.android.launcher3.util.PackageManagerHelper;
|
||||
import com.android.launcher3.util.Preconditions;
|
||||
import com.android.launcher3.util.RunnableList;
|
||||
import com.android.launcher3.util.ViewCache;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* An interface to be used along with a context for various activities in Launcher. This allows a
|
||||
* generic class to depend on Context subclass instead of an Activity.
|
||||
*/
|
||||
public interface ActivityContext {
|
||||
|
||||
String TAG = "ActivityContext";
|
||||
|
||||
default boolean finishAutoCancelActionMode() {
|
||||
return false;
|
||||
}
|
||||
@@ -117,6 +145,28 @@ public interface ActivityContext {
|
||||
|
||||
DeviceProfile getDeviceProfile();
|
||||
|
||||
/** Registered {@link OnDeviceProfileChangeListener} instances. */
|
||||
List<OnDeviceProfileChangeListener> getOnDeviceProfileChangeListeners();
|
||||
|
||||
/** Notifies listeners of a {@link DeviceProfile} change. */
|
||||
default void dispatchDeviceProfileChanged() {
|
||||
DeviceProfile deviceProfile = getDeviceProfile();
|
||||
List<OnDeviceProfileChangeListener> listeners = getOnDeviceProfileChangeListeners();
|
||||
for (int i = listeners.size() - 1; i >= 0; i--) {
|
||||
listeners.get(i).onDeviceProfileChanged(deviceProfile);
|
||||
}
|
||||
}
|
||||
|
||||
/** Register listener for {@link DeviceProfile} changes. */
|
||||
default void addOnDeviceProfileChangeListener(OnDeviceProfileChangeListener listener) {
|
||||
getOnDeviceProfileChangeListeners().add(listener);
|
||||
}
|
||||
|
||||
/** Unregister listener for {@link DeviceProfile} changes. */
|
||||
default void removeOnDeviceProfileChangeListener(OnDeviceProfileChangeListener listener) {
|
||||
getOnDeviceProfileChangeListeners().remove(listener);
|
||||
}
|
||||
|
||||
default ViewCache getViewCache() {
|
||||
return new ViewCache();
|
||||
}
|
||||
@@ -162,32 +212,6 @@ public interface ActivityContext {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ActivityContext associated with the given Context, or throws an exception if
|
||||
* the Context is not associated with any ActivityContext.
|
||||
*/
|
||||
static <T extends Context & ActivityContext> T lookupContext(Context context) {
|
||||
T activityContext = lookupContextNoThrow(context);
|
||||
if (activityContext == null) {
|
||||
throw new IllegalArgumentException("Cannot find ActivityContext in parent tree");
|
||||
}
|
||||
return activityContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ActivityContext associated with the given Context, or null if
|
||||
* the Context is not associated with any ActivityContext.
|
||||
*/
|
||||
static <T extends Context & ActivityContext> T lookupContextNoThrow(Context context) {
|
||||
if (context instanceof ActivityContext) {
|
||||
return (T) context;
|
||||
} else if (context instanceof ContextWrapper) {
|
||||
return lookupContextNoThrow(((ContextWrapper) context).getBaseContext());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
default View.OnClickListener getItemOnClickListener() {
|
||||
return v -> {
|
||||
// No op.
|
||||
@@ -256,4 +280,187 @@ public interface ActivityContext {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Safely starts an activity.
|
||||
*
|
||||
* @param v View starting the activity.
|
||||
* @param intent Base intent being launched.
|
||||
* @param item Item associated with the view.
|
||||
* @return {@code true} if the activity starts successfully.
|
||||
*/
|
||||
default boolean startActivitySafely(
|
||||
View v, Intent intent, @Nullable ItemInfo item) {
|
||||
|
||||
Context context = (Context) this;
|
||||
if (isAppBlockedForSafeMode() && !PackageManagerHelper.isSystemApp(context, intent)) {
|
||||
Toast.makeText(context, R.string.safemode_shortcut_error, Toast.LENGTH_SHORT).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
Bundle optsBundle = (v != null) ? getActivityLaunchOptions(v, item).toBundle() : null;
|
||||
UserHandle user = item == null ? null : item.user;
|
||||
|
||||
// Prepare intent
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
if (v != null) {
|
||||
intent.setSourceBounds(Utilities.getViewBounds(v));
|
||||
}
|
||||
try {
|
||||
boolean isShortcut = (item instanceof WorkspaceItemInfo)
|
||||
&& (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT
|
||||
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT)
|
||||
&& !((WorkspaceItemInfo) item).isPromise();
|
||||
if (isShortcut) {
|
||||
// Shortcuts need some special checks due to legacy reasons.
|
||||
startShortcutIntentSafely(intent, optsBundle, item);
|
||||
} else if (user == null || user.equals(Process.myUserHandle())) {
|
||||
// Could be launching some bookkeeping activity
|
||||
context.startActivity(intent, optsBundle);
|
||||
} else {
|
||||
context.getSystemService(LauncherApps.class).startMainActivity(
|
||||
intent.getComponent(), user, intent.getSourceBounds(), optsBundle);
|
||||
}
|
||||
if (item != null) {
|
||||
InstanceId instanceId = new InstanceIdSequence().newInstanceId();
|
||||
logAppLaunch(getStatsLogManager(), item, instanceId);
|
||||
}
|
||||
return true;
|
||||
} catch (NullPointerException | ActivityNotFoundException | SecurityException e) {
|
||||
Toast.makeText(context, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
|
||||
Log.e(TAG, "Unable to launch. tag=" + item + " intent=" + intent, e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Returns {@code true} if an app launch is blocked due to safe mode. */
|
||||
default boolean isAppBlockedForSafeMode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and logs a new app launch event.
|
||||
*/
|
||||
default void logAppLaunch(StatsLogManager statsLogManager, ItemInfo info,
|
||||
InstanceId instanceId) {
|
||||
statsLogManager.logger().withItemInfo(info).withInstanceId(instanceId)
|
||||
.log(LAUNCHER_APP_LAUNCH_TAP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns launch options for an Activity.
|
||||
*
|
||||
* @param v View initiating a launch.
|
||||
* @param item Item associated with the view.
|
||||
*/
|
||||
default ActivityOptionsWrapper getActivityLaunchOptions(View v, @Nullable ItemInfo item) {
|
||||
int left = 0, top = 0;
|
||||
int width = v.getMeasuredWidth(), height = v.getMeasuredHeight();
|
||||
if (v instanceof BubbleTextView) {
|
||||
// Launch from center of icon, not entire view
|
||||
Drawable icon = ((BubbleTextView) v).getIcon();
|
||||
if (icon != null) {
|
||||
Rect bounds = icon.getBounds();
|
||||
left = (width - bounds.width()) / 2;
|
||||
top = v.getPaddingTop();
|
||||
width = bounds.width();
|
||||
height = bounds.height();
|
||||
}
|
||||
}
|
||||
ActivityOptions options =
|
||||
ActivityOptions.makeClipRevealAnimation(v, left, top, width, height);
|
||||
|
||||
options.setLaunchDisplayId(
|
||||
(v != null && v.getDisplay() != null) ? v.getDisplay().getDisplayId()
|
||||
: Display.DEFAULT_DISPLAY);
|
||||
RunnableList callback = new RunnableList();
|
||||
return new ActivityOptionsWrapper(options, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Safely launches an intent for a shortcut.
|
||||
*
|
||||
* @param intent Intent to start.
|
||||
* @param optsBundle Optional launch arguments.
|
||||
* @param info Shortcut information.
|
||||
*/
|
||||
default void startShortcutIntentSafely(Intent intent, Bundle optsBundle, ItemInfo info) {
|
||||
try {
|
||||
StrictMode.VmPolicy oldPolicy = StrictMode.getVmPolicy();
|
||||
try {
|
||||
// Temporarily disable deathPenalty on all default checks. For eg, shortcuts
|
||||
// containing file Uri's would cause a crash as penaltyDeathOnFileUriExposure
|
||||
// is enabled by default on NYC.
|
||||
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
|
||||
.penaltyLog().build());
|
||||
|
||||
if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
|
||||
String id = ((WorkspaceItemInfo) info).getDeepShortcutId();
|
||||
String packageName = intent.getPackage();
|
||||
startShortcut(packageName, id, intent.getSourceBounds(), optsBundle, info.user);
|
||||
} else {
|
||||
// Could be launching some bookkeeping activity
|
||||
((Context) this).startActivity(intent, optsBundle);
|
||||
}
|
||||
} finally {
|
||||
StrictMode.setVmPolicy(oldPolicy);
|
||||
}
|
||||
} catch (SecurityException e) {
|
||||
if (!onErrorStartingShortcut(intent, info)) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A wrapper around the platform method with Launcher specific checks.
|
||||
*/
|
||||
default void startShortcut(String packageName, String id, Rect sourceBounds,
|
||||
Bundle startActivityOptions, UserHandle user) {
|
||||
if (GO_DISABLE_WIDGETS) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
((Context) this).getSystemService(LauncherApps.class).startShortcut(packageName, id,
|
||||
sourceBounds, startActivityOptions, user);
|
||||
} catch (SecurityException | IllegalStateException e) {
|
||||
Log.e(TAG, "Failed to start shortcut", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when a shortcut fails to launch.
|
||||
* @param intent Shortcut intent that failed to start.
|
||||
* @param info Shortcut information.
|
||||
* @return {@code true} if the error is handled by this callback.
|
||||
*/
|
||||
default boolean onErrorStartingShortcut(Intent intent, ItemInfo info) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ActivityContext associated with the given Context, or throws an exception if
|
||||
* the Context is not associated with any ActivityContext.
|
||||
*/
|
||||
static <T extends Context & ActivityContext> T lookupContext(Context context) {
|
||||
T activityContext = lookupContextNoThrow(context);
|
||||
if (activityContext == null) {
|
||||
throw new IllegalArgumentException("Cannot find ActivityContext in parent tree");
|
||||
}
|
||||
return activityContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ActivityContext associated with the given Context, or null if
|
||||
* the Context is not associated with any ActivityContext.
|
||||
*/
|
||||
static <T extends Context & ActivityContext> T lookupContextNoThrow(Context context) {
|
||||
if (context instanceof ActivityContext) {
|
||||
return (T) context;
|
||||
} else if (context instanceof ContextWrapper) {
|
||||
return lookupContextNoThrow(((ContextWrapper) context).getBaseContext());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,213 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
package com.android.launcher3.views;
|
||||
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP;
|
||||
import static com.android.launcher3.model.WidgetsModel.GO_DISABLE_WIDGETS;
|
||||
|
||||
import android.app.ActivityOptions;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.LauncherApps;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.Process;
|
||||
import android.os.StrictMode;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
import android.view.Display;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.BubbleTextView;
|
||||
import com.android.launcher3.LauncherSettings;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.logging.InstanceId;
|
||||
import com.android.launcher3.logging.InstanceIdSequence;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.model.data.WorkspaceItemInfo;
|
||||
import com.android.launcher3.util.ActivityOptionsWrapper;
|
||||
import com.android.launcher3.util.PackageManagerHelper;
|
||||
import com.android.launcher3.util.RunnableList;
|
||||
|
||||
/** An {@link ActivityContext} that can also launch app activities and shortcuts safely. */
|
||||
public interface AppLauncher extends ActivityContext {
|
||||
|
||||
String TAG = "AppLauncher";
|
||||
|
||||
/**
|
||||
* Safely starts an activity.
|
||||
*
|
||||
* @param v View starting the activity.
|
||||
* @param intent Base intent being launched.
|
||||
* @param item Item associated with the view.
|
||||
* @return {@code true} if the activity starts successfully.
|
||||
*/
|
||||
default boolean startActivitySafely(
|
||||
View v, Intent intent, @Nullable ItemInfo item) {
|
||||
|
||||
Context context = (Context) this;
|
||||
if (isAppBlockedForSafeMode() && !PackageManagerHelper.isSystemApp(context, intent)) {
|
||||
Toast.makeText(context, R.string.safemode_shortcut_error, Toast.LENGTH_SHORT).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
Bundle optsBundle = (v != null) ? getActivityLaunchOptions(v, item).toBundle() : null;
|
||||
UserHandle user = item == null ? null : item.user;
|
||||
|
||||
// Prepare intent
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
if (v != null) {
|
||||
intent.setSourceBounds(Utilities.getViewBounds(v));
|
||||
}
|
||||
try {
|
||||
boolean isShortcut = (item instanceof WorkspaceItemInfo)
|
||||
&& (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT
|
||||
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT)
|
||||
&& !((WorkspaceItemInfo) item).isPromise();
|
||||
if (isShortcut) {
|
||||
// Shortcuts need some special checks due to legacy reasons.
|
||||
startShortcutIntentSafely(intent, optsBundle, item);
|
||||
} else if (user == null || user.equals(Process.myUserHandle())) {
|
||||
// Could be launching some bookkeeping activity
|
||||
context.startActivity(intent, optsBundle);
|
||||
} else {
|
||||
context.getSystemService(LauncherApps.class).startMainActivity(
|
||||
intent.getComponent(), user, intent.getSourceBounds(), optsBundle);
|
||||
}
|
||||
if (item != null) {
|
||||
InstanceId instanceId = new InstanceIdSequence().newInstanceId();
|
||||
logAppLaunch(getStatsLogManager(), item, instanceId);
|
||||
}
|
||||
return true;
|
||||
} catch (NullPointerException | ActivityNotFoundException | SecurityException e) {
|
||||
Toast.makeText(context, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
|
||||
Log.e(TAG, "Unable to launch. tag=" + item + " intent=" + intent, e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Returns {@code true} if an app launch is blocked due to safe mode. */
|
||||
default boolean isAppBlockedForSafeMode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and logs a new app launch event.
|
||||
*/
|
||||
default void logAppLaunch(StatsLogManager statsLogManager, ItemInfo info,
|
||||
InstanceId instanceId) {
|
||||
statsLogManager.logger().withItemInfo(info).withInstanceId(instanceId)
|
||||
.log(LAUNCHER_APP_LAUNCH_TAP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns launch options for an Activity.
|
||||
*
|
||||
* @param v View initiating a launch.
|
||||
* @param item Item associated with the view.
|
||||
*/
|
||||
default ActivityOptionsWrapper getActivityLaunchOptions(View v, @Nullable ItemInfo item) {
|
||||
int left = 0, top = 0;
|
||||
int width = v.getMeasuredWidth(), height = v.getMeasuredHeight();
|
||||
if (v instanceof BubbleTextView) {
|
||||
// Launch from center of icon, not entire view
|
||||
Drawable icon = ((BubbleTextView) v).getIcon();
|
||||
if (icon != null) {
|
||||
Rect bounds = icon.getBounds();
|
||||
left = (width - bounds.width()) / 2;
|
||||
top = v.getPaddingTop();
|
||||
width = bounds.width();
|
||||
height = bounds.height();
|
||||
}
|
||||
}
|
||||
ActivityOptions options =
|
||||
ActivityOptions.makeClipRevealAnimation(v, left, top, width, height);
|
||||
|
||||
options.setLaunchDisplayId(
|
||||
(v != null && v.getDisplay() != null) ? v.getDisplay().getDisplayId()
|
||||
: Display.DEFAULT_DISPLAY);
|
||||
RunnableList callback = new RunnableList();
|
||||
return new ActivityOptionsWrapper(options, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Safely launches an intent for a shortcut.
|
||||
*
|
||||
* @param intent Intent to start.
|
||||
* @param optsBundle Optional launch arguments.
|
||||
* @param info Shortcut information.
|
||||
*/
|
||||
default void startShortcutIntentSafely(Intent intent, Bundle optsBundle, ItemInfo info) {
|
||||
try {
|
||||
StrictMode.VmPolicy oldPolicy = StrictMode.getVmPolicy();
|
||||
try {
|
||||
// Temporarily disable deathPenalty on all default checks. For eg, shortcuts
|
||||
// containing file Uri's would cause a crash as penaltyDeathOnFileUriExposure
|
||||
// is enabled by default on NYC.
|
||||
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
|
||||
.penaltyLog().build());
|
||||
|
||||
if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
|
||||
String id = ((WorkspaceItemInfo) info).getDeepShortcutId();
|
||||
String packageName = intent.getPackage();
|
||||
startShortcut(packageName, id, intent.getSourceBounds(), optsBundle, info.user);
|
||||
} else {
|
||||
// Could be launching some bookkeeping activity
|
||||
((Context) this).startActivity(intent, optsBundle);
|
||||
}
|
||||
} finally {
|
||||
StrictMode.setVmPolicy(oldPolicy);
|
||||
}
|
||||
} catch (SecurityException e) {
|
||||
if (!onErrorStartingShortcut(intent, info)) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A wrapper around the platform method with Launcher specific checks.
|
||||
*/
|
||||
default void startShortcut(String packageName, String id, Rect sourceBounds,
|
||||
Bundle startActivityOptions, UserHandle user) {
|
||||
if (GO_DISABLE_WIDGETS) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
((Context) this).getSystemService(LauncherApps.class).startShortcut(packageName, id,
|
||||
sourceBounds, startActivityOptions, user);
|
||||
} catch (SecurityException | IllegalStateException e) {
|
||||
Log.e(TAG, "Failed to start shortcut", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when a shortcut fails to launch.
|
||||
* @param intent Shortcut intent that failed to start.
|
||||
* @param info Shortcut information.
|
||||
* @return {@code true} if the error is handled by this callback.
|
||||
*/
|
||||
default boolean onErrorStartingShortcut(Intent intent, ItemInfo info) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -139,12 +139,12 @@ public class OptionsPopupView extends ArrowPopup<Launcher>
|
||||
mTargetRect.roundOut(outPos);
|
||||
}
|
||||
|
||||
public static OptionsPopupView show(AppLauncher launcher, RectF targetRect,
|
||||
public static OptionsPopupView show(ActivityContext launcher, RectF targetRect,
|
||||
List<OptionItem> items, boolean shouldAddArrow) {
|
||||
return show(launcher, targetRect, items, shouldAddArrow, 0 /* width */);
|
||||
}
|
||||
|
||||
public static OptionsPopupView show(AppLauncher launcher, RectF targetRect,
|
||||
public static OptionsPopupView show(ActivityContext launcher, RectF targetRect,
|
||||
List<OptionItem> items, boolean shouldAddArrow, int width) {
|
||||
OptionsPopupView popup = (OptionsPopupView) launcher.getLayoutInflater()
|
||||
.inflate(R.layout.longpress_options_menu, launcher.getDragLayer(), false);
|
||||
|
||||
@@ -20,11 +20,11 @@ import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_ALLAP
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.launcher3.DeviceProfile.DeviceProfileListenable;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.util.Themes;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
/**
|
||||
* Definition for AllApps state
|
||||
@@ -40,7 +40,7 @@ public class AllAppsState extends LauncherState {
|
||||
}
|
||||
|
||||
@Override
|
||||
public <DEVICE_PROFILE_CONTEXT extends Context & DeviceProfileListenable>
|
||||
public <DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
||||
int getTransitionDuration(DEVICE_PROFILE_CONTEXT context, boolean isToState) {
|
||||
return isToState
|
||||
? context.getDeviceProfile().allAppsOpenDuration
|
||||
|
||||
@@ -20,15 +20,21 @@ import android.content.ContextWrapper;
|
||||
import android.view.ContextThemeWrapper;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.InvariantDeviceProfile;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
import com.android.launcher3.views.BaseDragLayer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* {@link ContextWrapper} with internal Launcher interface for testing
|
||||
*/
|
||||
public class ActivityContextWrapper extends ContextThemeWrapper implements ActivityContext {
|
||||
|
||||
private final List<OnDeviceProfileChangeListener> mDpChangeListeners = new ArrayList<>();
|
||||
|
||||
private final DeviceProfile mProfile;
|
||||
private final MyDragLayer mMyDragLayer;
|
||||
|
||||
@@ -43,6 +49,11 @@ public class ActivityContextWrapper extends ContextThemeWrapper implements Activ
|
||||
return mMyDragLayer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OnDeviceProfileChangeListener> getOnDeviceProfileChangeListeners() {
|
||||
return mDpChangeListeners;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeviceProfile getDeviceProfile() {
|
||||
return mProfile;
|
||||
|
||||
Reference in New Issue
Block a user