From 7fbc503b9a29fdc141218620d690334d5e38273c Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 31 Oct 2018 13:57:15 -0700 Subject: [PATCH 01/20] Simplifying scrim drawable initialization. Scrim drawable is initialized as null in certain cases in code, but it is also initialized as null in sytle. Only using the style definition as source of truth to avoid missing null checks Bug: 118450709 Change-Id: I9dab18405932d1b5c0e697838738a1392f97021c --- .../graphics/WorkspaceAndHotseatScrim.java | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index 00cc1a7e2c..6c98d16b42 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -121,7 +121,6 @@ public class WorkspaceAndHotseatScrim implements private Workspace mWorkspace; - private final boolean mHasSysUiScrim; private boolean mDrawTopScrim, mDrawBottomScrim; private final RectF mFinalMaskRect = new RectF(); @@ -149,15 +148,9 @@ public class WorkspaceAndHotseatScrim implements mMaskHeight = Utilities.pxFromDp(ALPHA_MASK_BITMAP_DP, view.getResources().getDisplayMetrics()); - - mHasSysUiScrim = !mWallpaperColorInfo.supportsDarkText(); - if (mHasSysUiScrim) { - mTopScrim = Themes.getAttrDrawable(view.getContext(), R.attr.workspaceStatusBarScrim); - mBottomMask = createDitheredAlphaMask(); - } else { - mTopScrim = null; - mBottomMask = null; - } + mTopScrim = Themes.getAttrDrawable(view.getContext(), R.attr.workspaceStatusBarScrim); + mBottomMask = mTopScrim == null ? null : createDitheredAlphaMask(); + mHideSysUiScrim = mTopScrim == null; view.addOnAttachStateChangeListener(this); onExtractedColorsChanged(mWallpaperColorInfo); @@ -185,7 +178,7 @@ public class WorkspaceAndHotseatScrim implements canvas.restore(); } - if (!mHideSysUiScrim && mHasSysUiScrim) { + if (!mHideSysUiScrim) { if (mSysUiProgress <= 0) { mAnimateScrimOnNextDraw = false; return; @@ -213,8 +206,9 @@ public class WorkspaceAndHotseatScrim implements } public void onInsetsChanged(Rect insets) { - mDrawTopScrim = insets.top > 0; - mDrawBottomScrim = !mLauncher.getDeviceProfile().isVerticalBarLayout(); + mDrawTopScrim = mTopScrim != null && insets.top > 0; + mDrawBottomScrim = mBottomMask != null && + !mLauncher.getDeviceProfile().isVerticalBarLayout(); } private void setScrimProgress(float progress) { @@ -230,7 +224,7 @@ public class WorkspaceAndHotseatScrim implements mWallpaperColorInfo.addOnChangeListener(this); onExtractedColorsChanged(mWallpaperColorInfo); - if (mHasSysUiScrim) { + if (mTopScrim != null) { IntentFilter filter = new IntentFilter(ACTION_SCREEN_OFF); filter.addAction(ACTION_USER_PRESENT); // When the device wakes up + keyguard is gone mRoot.getContext().registerReceiver(mReceiver, filter); @@ -240,7 +234,7 @@ public class WorkspaceAndHotseatScrim implements @Override public void onViewDetachedFromWindow(View view) { mWallpaperColorInfo.removeOnChangeListener(this); - if (mHasSysUiScrim) { + if (mTopScrim != null) { mRoot.getContext().unregisterReceiver(mReceiver); } } @@ -259,14 +253,14 @@ public class WorkspaceAndHotseatScrim implements } public void setSize(int w, int h) { - if (mHasSysUiScrim) { + if (mTopScrim != null) { mTopScrim.setBounds(0, 0, w, h); mFinalMaskRect.set(0, h - mMaskHeight, w, h); } } public void hideSysUiScrim(boolean hideSysUiScrim) { - mHideSysUiScrim = hideSysUiScrim; + mHideSysUiScrim = hideSysUiScrim || (mTopScrim == null); if (!hideSysUiScrim) { mAnimateScrimOnNextDraw = true; } @@ -281,18 +275,18 @@ public class WorkspaceAndHotseatScrim implements } private void reapplySysUiAlpha() { - if (mHasSysUiScrim) { - reapplySysUiAlphaNoInvalidate(); - if (!mHideSysUiScrim) { - invalidate(); - } + reapplySysUiAlphaNoInvalidate(); + if (!mHideSysUiScrim) { + invalidate(); } } private void reapplySysUiAlphaNoInvalidate() { float factor = mSysUiProgress * mSysUiAnimMultiplier; mBottomMaskPaint.setAlpha(Math.round(MAX_HOTSEAT_SCRIM_ALPHA * factor)); - mTopScrim.setAlpha(Math.round(255 * factor)); + if (mTopScrim != null) { + mTopScrim.setAlpha(Math.round(255 * factor)); + } } public void invalidate() { From ba8957b3c215cf92376cafbdd52d08c2b0852420 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 23 Aug 2018 13:37:38 -0700 Subject: [PATCH 02/20] Converting ShortcutsLaunchTest gesture-stable By converting to TAPL. Bug: 110103162 Test; TaplTests Change-Id: I788405f2e52cc0e29ebf69e58feda46b408e9eb9 --- .../launcher3/ui/AbstractLauncherUiTest.java | 5 -- .../launcher3/ui/ShortcutsLaunchTest.java | 64 +++++++------------ .../com/android/launcher3/tapl/AppIcon.java | 12 ++++ .../android/launcher3/tapl/AppIconMenu.java | 46 +++++++++++++ .../launcher3/tapl/AppIconMenuItem.java | 52 +++++++++++++++ .../tapl/LauncherInstrumentation.java | 19 ++++-- 6 files changed, 146 insertions(+), 52 deletions(-) create mode 100644 tests/tapl/com/android/launcher3/tapl/AppIconMenu.java create mode 100644 tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 532d3e8b00..bc5aaeeb75 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -296,11 +296,6 @@ public abstract class AbstractLauncherUiTest { Process.myUserHandle()).get(0); } - protected LauncherActivityInfo getChromeApp() { - return LauncherAppsCompat.getInstance(mTargetContext) - .getActivityList("com.android.chrome", Process.myUserHandle()).get(0); - } - /** * Broadcast receiver which blocks until the result is received. */ diff --git a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java index d7a7f6bbe7..e95801a00e 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java @@ -1,22 +1,20 @@ package com.android.launcher3.ui; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import android.content.pm.LauncherActivityInfo; -import android.graphics.Point; + import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; import androidx.test.uiautomator.Until; -import android.view.MotionEvent; -import com.android.launcher3.R; -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; +import com.android.launcher3.Launcher; +import com.android.launcher3.popup.ArrowPopup; +import com.android.launcher3.tapl.AppIconMenu; +import com.android.launcher3.tapl.AppIconMenuItem; +import com.android.launcher3.views.OptionsPopupView; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -27,47 +25,33 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class ShortcutsLaunchTest extends AbstractLauncherUiTest { - @Test - @Ignore - public void testAppLauncher_portrait() throws Exception { - lockRotation(true); - performTest(); + private boolean isOptionsPopupVisible(Launcher launcher) { + final ArrowPopup popup = OptionsPopupView.getOptionsPopup(launcher); + return popup != null && popup.isShown(); } @Test - @Ignore - public void testAppLauncher_landscape() throws Exception { - lockRotation(false); - performTest(); - } - - private void performTest() throws Exception { + @PortraitLandscape + public void testAppLauncher() throws Exception { mActivityMonitor.startLauncher(); - LauncherActivityInfo testApp = getSettingsApp(); + final LauncherActivityInfo testApp = getSettingsApp(); - // Open all apps and wait for load complete - final UiObject2 appsContainer = TestViewHelpers.openAllApps(); - Wait.atMost(null, Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT); + final AppIconMenu menu = mLauncher. + pressHome(). + switchToAllApps(). + getAppIcon(testApp.getLabel().toString()). + openMenu(); - // Find settings app and verify shortcuts appear when long pressed - UiObject2 icon = scrollAndFind(appsContainer, By.text(testApp.getLabel().toString())); - // Press icon center until shortcuts appear - Point iconCenter = icon.getVisibleCenter(); - TestViewHelpers.sendPointer(MotionEvent.ACTION_DOWN, iconCenter); - UiObject2 deepShortcutsContainer = TestViewHelpers.findViewById( - R.id.deep_shortcuts_container); - assertNotNull(deepShortcutsContainer); - TestViewHelpers.sendPointer(MotionEvent.ACTION_UP, iconCenter); + executeOnLauncher( + launcher -> assertTrue("Launcher internal state didn't switch to Showing Menu", + isOptionsPopupVisible(launcher))); - // Verify that launching a shortcut opens a page with the same text - assertTrue(deepShortcutsContainer.getChildCount() > 0); + final AppIconMenuItem menuItem = menu.getMenuItem(1); + final String itemName = menuItem.getText(); - // Pick second children as it starts showing shortcuts. - UiObject2 shortcut = deepShortcutsContainer.getChildren().get(1) - .findObject(TestViewHelpers.getSelectorForId(R.id.bubble_text)); - shortcut.click(); + menuItem.launch(); assertTrue(mDevice.wait(Until.hasObject(By.pkg( testApp.getComponentName().getPackageName()) - .text(shortcut.getText())), DEFAULT_UI_TIMEOUT)); + .text(itemName)), DEFAULT_UI_TIMEOUT)); } } diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java index b7ae9f1497..1c0ecb9339 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java @@ -16,6 +16,7 @@ package com.android.launcher3.tapl; +import android.graphics.Point; import android.widget.TextView; import androidx.test.uiautomator.By; @@ -56,4 +57,15 @@ public final class AppIcon { UiObject2 getIcon() { return mIcon; } + + /** + * Long-clicks the icon to open its menu. + */ + public AppIconMenu openMenu() { + final Point iconCenter = mIcon.getVisibleCenter(); + mLauncher.longTap(iconCenter.x, iconCenter.y); + final UiObject2 deepShortcutsContainer = mLauncher.waitForLauncherObject( + "deep_shortcuts_container"); + return new AppIconMenu(mLauncher, deepShortcutsContainer); + } } diff --git a/tests/tapl/com/android/launcher3/tapl/AppIconMenu.java b/tests/tapl/com/android/launcher3/tapl/AppIconMenu.java new file mode 100644 index 0000000000..2a03f9a089 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/AppIconMenu.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 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.tapl; + +import static org.junit.Assert.assertTrue; + +import androidx.test.uiautomator.UiObject2; + +/** + * Context menu of an app icon. + */ +public class AppIconMenu { + private final LauncherInstrumentation mLauncher; + private final UiObject2 mDeepShortcutsContainer; + + AppIconMenu(LauncherInstrumentation launcher, + UiObject2 deepShortcutsContainer) { + mLauncher = launcher; + mDeepShortcutsContainer = deepShortcutsContainer; + } + + /** + * Returns a menu item with a given number. Fails if it doesn't exist. + */ + public AppIconMenuItem getMenuItem(int itemNumber) { + assertTrue(mDeepShortcutsContainer.getChildCount() > itemNumber); + + final UiObject2 shortcut = mLauncher.waitForObjectInContainer( + mDeepShortcutsContainer.getChildren().get(itemNumber), "bubble_text"); + return new AppIconMenuItem(mLauncher, shortcut); + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java new file mode 100644 index 0000000000..7b2abeb756 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2018 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.tapl; + +import static org.junit.Assert.assertTrue; + +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; + +/** + * Menu item in an app icon menu. + */ +public class AppIconMenuItem { + private final LauncherInstrumentation mLauncher; + final UiObject2 mShortcut; + + AppIconMenuItem(LauncherInstrumentation launcher, + UiObject2 shortcut) { + mLauncher = launcher; + mShortcut = shortcut; + } + + /** + * Returns the visible text of the menu item. + */ + public String getText() { + return mShortcut.getText(); + } + + /** + * Launches the action for the menu item. + */ + public Background launch() { + assertTrue("Clicking a menu item didn't open a new window: " + mShortcut.getText(), + mShortcut.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); + return new Background(mLauncher); + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 31abc53c91..67106f7eac 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -28,6 +28,13 @@ import android.util.Log; import android.view.Surface; import android.view.accessibility.AccessibilityEvent; +import androidx.annotation.NonNull; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; + import com.android.launcher3.TestProtocol; import com.android.quickstep.SwipeUpSetting; @@ -36,13 +43,6 @@ import org.junit.Assert; import java.lang.ref.WeakReference; import java.util.concurrent.TimeoutException; -import androidx.annotation.NonNull; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.BySelector; -import androidx.test.uiautomator.UiDevice; -import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; - /** * The main tapl object. The only object that can be explicitly constructed by the using code. It * produces all other objects. @@ -394,6 +394,11 @@ public final class LauncherInstrumentation { return mDevice; } + void longTap(int x, int y) { + mDevice.drag(x, y, x, y, 0); + } + + void swipe(int startX, int startY, int endX, int endY) { executeAndWaitForEvent( () -> mDevice.swipe(startX, startY, endX, endY, 60), From 719eee2be266bd84bba33ce35142b0cad46e40ea Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 1 Nov 2018 23:12:54 -0700 Subject: [PATCH 03/20] Create iconloader library Bug: 115891474 Test: Builds everything Change-Id: I1d75702d4e5a10d694eeb839784a629de2f74dd2 --- Android.bp | 20 -------- Android.mk | 3 +- build.gradle | 24 +++++---- gradle.properties | 13 +++++ iconloaderlib/Android.bp | 28 +++++++++++ iconloaderlib/AndroidManifest.xml | 20 ++++++++ iconloaderlib/build.gradle | 50 +++++++++++++++++++ .../adaptive_icon_drawable_wrapper.xml | 0 .../res}/drawable/ic_instant_app_badge.xml | 6 +-- iconloaderlib/res/values/colors.xml | 21 ++++++++ iconloaderlib/res/values/dimens.xml | 19 +++++++ .../icons/BaseIconFactory.java | 2 +- .../android.launcher3}/icons/BitmapInfo.java | 0 .../icons/ColorExtractor.java | 0 .../icons/FixedScaleDrawable.java | 0 .../icons/IconNormalizer.java | 3 -- .../icons/ShadowGenerator.java | 0 res/values/colors.xml | 1 - settings.gradle | 2 + 19 files changed, 171 insertions(+), 41 deletions(-) create mode 100644 gradle.properties create mode 100644 iconloaderlib/Android.bp create mode 100644 iconloaderlib/AndroidManifest.xml create mode 100644 iconloaderlib/build.gradle rename {res => iconloaderlib/res}/drawable-v26/adaptive_icon_drawable_wrapper.xml (100%) rename {res => iconloaderlib/res}/drawable/ic_instant_app_badge.xml (93%) create mode 100644 iconloaderlib/res/values/colors.xml create mode 100644 iconloaderlib/res/values/dimens.xml rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/BaseIconFactory.java (99%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/BitmapInfo.java (100%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/ColorExtractor.java (100%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/FixedScaleDrawable.java (100%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/IconNormalizer.java (98%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/ShadowGenerator.java (100%) create mode 100644 settings.gradle diff --git a/Android.bp b/Android.bp index e3dd5e56ad..c5832441c7 100644 --- a/Android.bp +++ b/Android.bp @@ -29,23 +29,3 @@ java_library_static { ], platform_apis: true, } - - -android_library { - name: "icon-loader", - sdk_version: "28", - static_libs: [ - "androidx.core_core", - ], - resource_dirs: [ - "res", - ], - srcs: [ - "src/com/android/launcher3/icons/BaseIconFactory.java", - "src/com/android/launcher3/icons/BitmapInfo.java", - "src/com/android/launcher3/icons/IconNormalizer.java", - "src/com/android/launcher3/icons/FixedScaleDrawable.java", - "src/com/android/launcher3/icons/ShadowGenerator.java", - "src/com/android/launcher3/icons/ColorExtractor.java", - ], -} diff --git a/Android.mk b/Android.mk index 5614e25cac..9d6e629a0d 100644 --- a/Android.mk +++ b/Android.mk @@ -67,7 +67,8 @@ LOCAL_MODULE_TAGS := optional LOCAL_STATIC_ANDROID_LIBRARIES := \ androidx.recyclerview_recyclerview \ androidx.dynamicanimation_dynamicanimation \ - androidx.preference_preference + androidx.preference_preference \ + iconloader LOCAL_STATIC_JAVA_LIBRARIES := LauncherPluginLib diff --git a/build.gradle b/build.gradle index 476e92bf67..33409c5d02 100644 --- a/build.gradle +++ b/build.gradle @@ -4,19 +4,17 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6' + classpath GRADLE_CLASS_PATH + classpath PROTOBUF_CLASS_PATH } } -final String SUPPORT_LIBS_VERSION = '1.0.0-alpha1' - apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' android { - compileSdkVersion 28 - buildToolsVersion '28.0.3' + compileSdkVersion COMPILE_SDK.toInteger() + buildToolsVersion BUILD_TOOLS_VERSION defaultConfig { minSdkVersion 21 @@ -120,9 +118,15 @@ repositories { } dependencies { - implementation "androidx.dynamicanimation:dynamicanimation:${SUPPORT_LIBS_VERSION}" - implementation "androidx.recyclerview:recyclerview:${SUPPORT_LIBS_VERSION}" - implementation 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' + implementation "androidx.dynamicanimation:dynamicanimation:${ANDROID_X_VERSION}" + implementation "androidx.recyclerview:recyclerview:${ANDROID_X_VERSION}" + implementation "androidx.preference:preference:${ANDROID_X_VERSION}" + implementation PROTOBUF_DEPENDENCY + implementation project(':IconLoader') + + // This is already included in sysui_shared + aospImplementation fileTree(dir: "libs", include: 'plugin_core.jar') + l3goImplementation fileTree(dir: "libs", include: 'plugin_core.jar') quickstepImplementation fileTree(dir: "quickstep/libs", include: 'sysui_shared.jar') @@ -133,7 +137,7 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.0' androidTestImplementation 'com.android.support.test:rules:1.0.0' androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' - androidTestImplementation "androidx.annotation:annotation:${SUPPORT_LIBS_VERSION}" + androidTestImplementation "androidx.annotation:annotation:${ANDROID_X_VERSION}" } protobuf { diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..b299cfe516 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,13 @@ +# Until all the dependencies move to android X +android.useAndroidX = true +android.enableJetifier = true + +ANDROID_X_VERSION=1.0.0-beta01 + +GRADLE_CLASS_PATH=com.android.tools.build:gradle:3.2.0-rc03 + +PROTOBUF_CLASS_PATH=com.google.protobuf:protobuf-gradle-plugin:0.8.6 +PROTOBUF_DEPENDENCY=com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7 + +BUILD_TOOLS_VERSION=28.0.3 +COMPILE_SDK=28 \ No newline at end of file diff --git a/iconloaderlib/Android.bp b/iconloaderlib/Android.bp new file mode 100644 index 0000000000..8a71f94ed8 --- /dev/null +++ b/iconloaderlib/Android.bp @@ -0,0 +1,28 @@ +// Copyright (C) 2018 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. + +android_library { + name: "iconloader", + sdk_version: "28", + min_sdk_version: "21", + static_libs: [ + "androidx.core_core", + ], + resource_dirs: [ + "res", + ], + srcs: [ + "src/**/*.java", + ], +} diff --git a/iconloaderlib/AndroidManifest.xml b/iconloaderlib/AndroidManifest.xml new file mode 100644 index 0000000000..b30258da2a --- /dev/null +++ b/iconloaderlib/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/iconloaderlib/build.gradle b/iconloaderlib/build.gradle new file mode 100644 index 0000000000..d08029386a --- /dev/null +++ b/iconloaderlib/build.gradle @@ -0,0 +1,50 @@ +buildscript { + repositories { + mavenCentral() + google() + } + dependencies { + classpath GRADLE_CLASS_PATH + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion COMPILE_SDK.toInteger() + buildToolsVersion BUILD_TOOLS_VERSION + publishNonDefault true + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + } + + sourceSets { + main { + java.srcDirs = ['src'] + manifest.srcFile 'AndroidManifest.xml' + res.srcDirs = ['res'] + } + } + + lintOptions { + abortOnError false + } + + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + } +} + + +repositories { + mavenCentral() + google() +} + +dependencies { + implementation "androidx.core:core:${ANDROID_X_VERSION}" +} diff --git a/res/drawable-v26/adaptive_icon_drawable_wrapper.xml b/iconloaderlib/res/drawable-v26/adaptive_icon_drawable_wrapper.xml similarity index 100% rename from res/drawable-v26/adaptive_icon_drawable_wrapper.xml rename to iconloaderlib/res/drawable-v26/adaptive_icon_drawable_wrapper.xml diff --git a/res/drawable/ic_instant_app_badge.xml b/iconloaderlib/res/drawable/ic_instant_app_badge.xml similarity index 93% rename from res/drawable/ic_instant_app_badge.xml rename to iconloaderlib/res/drawable/ic_instant_app_badge.xml index cc532309c9..b74317e5f2 100644 --- a/res/drawable/ic_instant_app_badge.xml +++ b/iconloaderlib/res/drawable/ic_instant_app_badge.xml @@ -21,23 +21,19 @@ - \ No newline at end of file + diff --git a/iconloaderlib/res/values/colors.xml b/iconloaderlib/res/values/colors.xml new file mode 100644 index 0000000000..873b2fc5fb --- /dev/null +++ b/iconloaderlib/res/values/colors.xml @@ -0,0 +1,21 @@ + + + + #FFFFFF + diff --git a/iconloaderlib/res/values/dimens.xml b/iconloaderlib/res/values/dimens.xml new file mode 100644 index 0000000000..e8c0c44f72 --- /dev/null +++ b/iconloaderlib/res/values/dimens.xml @@ -0,0 +1,19 @@ + + + + + 24dp + diff --git a/src/com/android/launcher3/icons/BaseIconFactory.java b/iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java similarity index 99% rename from src/com/android/launcher3/icons/BaseIconFactory.java rename to iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java index cd60de55a8..681c03c7ca 100644 --- a/src/com/android/launcher3/icons/BaseIconFactory.java +++ b/iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java @@ -18,7 +18,7 @@ import android.os.Build; import android.os.Process; import android.os.UserHandle; -import com.android.launcher3.R; +import com.android.launcher3.icons.R; import static android.graphics.Paint.DITHER_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; diff --git a/src/com/android/launcher3/icons/BitmapInfo.java b/iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java similarity index 100% rename from src/com/android/launcher3/icons/BitmapInfo.java rename to iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java diff --git a/src/com/android/launcher3/icons/ColorExtractor.java b/iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java similarity index 100% rename from src/com/android/launcher3/icons/ColorExtractor.java rename to iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java diff --git a/src/com/android/launcher3/icons/FixedScaleDrawable.java b/iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java similarity index 100% rename from src/com/android/launcher3/icons/FixedScaleDrawable.java rename to iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java diff --git a/src/com/android/launcher3/icons/IconNormalizer.java b/iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java similarity index 98% rename from src/com/android/launcher3/icons/IconNormalizer.java rename to iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java index 8eb82524e8..05908df99b 100644 --- a/src/com/android/launcher3/icons/IconNormalizer.java +++ b/iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java @@ -20,9 +20,6 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AdaptiveIconDrawable; diff --git a/src/com/android/launcher3/icons/ShadowGenerator.java b/iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java similarity index 100% rename from src/com/android/launcher3/icons/ShadowGenerator.java rename to iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java diff --git a/res/values/colors.xml b/res/values/colors.xml index eb207af1eb..3c8fe1e253 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -34,7 +34,6 @@ #757575 #E0E0E0 - #FFFFFF #E5E5E5 #9AA0A6 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..b52bd4f784 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +include ':IconLoader' +project(':IconLoader').projectDir = new File(rootDir, 'iconloaderlib') From 0a926c1d67e63a2b2cdc682b8ae69e06bff8ca07 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Thu, 1 Nov 2018 18:53:42 -0700 Subject: [PATCH 04/20] Create a launcher model override. This change disables shortcuts/widgets loading on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I2c40f87a8f5d752525c99d254693a4e0a9eeeb2b --- .../android/launcher3/model/WidgetsModel.java | 67 +++++++++++++++++++ .../android/launcher3/model/WidgetsModel.java | 0 2 files changed, 67 insertions(+) create mode 100644 go/src/com/android/launcher3/model/WidgetsModel.java rename {src => src_shortcuts_overrides}/com/android/launcher3/model/WidgetsModel.java (100%) diff --git a/go/src/com/android/launcher3/model/WidgetsModel.java b/go/src/com/android/launcher3/model/WidgetsModel.java new file mode 100644 index 0000000000..18f3f9d91c --- /dev/null +++ b/go/src/com/android/launcher3/model/WidgetsModel.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 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.model; + +import android.content.Context; +import android.os.UserHandle; + +import com.android.launcher3.icons.ComponentWithLabel; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.widget.WidgetListRowEntry; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import androidx.annotation.Nullable; + +/** + * Widgets data model that is used by the adapters of the widget views and controllers. + * + *

The widgets and shortcuts are organized using package name as its index. + */ +public class WidgetsModel { + private static final ArrayList EMPTY_WIDGET_LIST = new ArrayList<>(); + + /** + * Returns a list of {@link WidgetListRowEntry}. All {@link WidgetItem} in a single row + * are sorted (based on label and user), but the overall list of {@link WidgetListRowEntry}s + * is not sorted. This list is sorted at the UI when using + * {@link com.android.launcher3.widget.WidgetsDiffReporter} + * + * @see com.android.launcher3.widget.WidgetsListAdapter#setWidgets(ArrayList) + */ + public synchronized ArrayList getWidgetsList(Context context) { + return EMPTY_WIDGET_LIST; + } + + /** + * @param packageUser If null, all widgets and shortcuts are updated and returned, otherwise + * only widgets and shortcuts associated with the package/user are. + */ + public List update(LauncherAppState app, + @Nullable PackageUserKey packageUser) { + return Collections.emptyList(); + } + + + public void onPackageIconsUpdated(Set packageNames, UserHandle user, + LauncherAppState app) { + } +} \ No newline at end of file diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java similarity index 100% rename from src/com/android/launcher3/model/WidgetsModel.java rename to src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java From f4c42bc79ab0ea3d4e39a20dacd596f94dbff3ce Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Mon, 5 Nov 2018 10:52:40 -0500 Subject: [PATCH 05/20] Migrate GridOccupancyTest to Robolectric This allows it to run fast locally on the JVM without an emulator or physical device. Change-Id: I416877d7c335a7b9c8dc7a216ecfeb1013f66891 --- .../com/android/launcher3/util/GridOccupancyTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) rename {tests => robolectric_tests}/src/com/android/launcher3/util/GridOccupancyTest.java (92%) diff --git a/tests/src/com/android/launcher3/util/GridOccupancyTest.java b/robolectric_tests/src/com/android/launcher3/util/GridOccupancyTest.java similarity index 92% rename from tests/src/com/android/launcher3/util/GridOccupancyTest.java rename to robolectric_tests/src/com/android/launcher3/util/GridOccupancyTest.java index cbf30b1788..aa51ad20c6 100644 --- a/tests/src/com/android/launcher3/util/GridOccupancyTest.java +++ b/robolectric_tests/src/com/android/launcher3/util/GridOccupancyTest.java @@ -1,10 +1,8 @@ package com.android.launcher3.util; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -13,8 +11,7 @@ import static org.junit.Assert.assertTrue; /** * Unit tests for {@link GridOccupancy} */ -@SmallTest -@RunWith(AndroidJUnit4.class) +@RunWith(RobolectricTestRunner.class) public class GridOccupancyTest { @Test @@ -24,7 +21,7 @@ public class GridOccupancyTest { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 - ); + ); int[] vacant = new int[2]; assertTrue(grid.findVacantCell(vacant, 2, 2)); From 499a0c932e7f8d3fe8236f9d0e073e693a3a6476 Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Mon, 5 Nov 2018 10:38:17 -0500 Subject: [PATCH 06/20] Make FileLogTest use robolectric This allows it to run fast locally on the JVM without an emulator or physical device. Change-Id: Idb9c94e6f3fce94a86978ea0709eadd72280432c --- .../com/android/launcher3/logging/FileLogTest.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) rename {tests => robolectric_tests}/src/com/android/launcher3/logging/FileLogTest.java (89%) diff --git a/tests/src/com/android/launcher3/logging/FileLogTest.java b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java similarity index 89% rename from tests/src/com/android/launcher3/logging/FileLogTest.java rename to robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java index e031f1d34a..096db57f90 100644 --- a/tests/src/com/android/launcher3/logging/FileLogTest.java +++ b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java @@ -1,13 +1,11 @@ package com.android.launcher3.logging; -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; import java.io.File; import java.io.PrintWriter; @@ -20,8 +18,7 @@ import static org.junit.Assert.assertTrue; /** * Tests for {@link FileLog} */ -@SmallTest -@RunWith(AndroidJUnit4.class) +@RunWith(RobolectricTestRunner.class) public class FileLogTest { private File mTempDir; @@ -30,9 +27,9 @@ public class FileLogTest { public void setUp() throws Exception { int count = 0; do { - mTempDir = new File(InstrumentationRegistry.getTargetContext().getCacheDir(), + mTempDir = new File(RuntimeEnvironment.application.getCacheDir(), "log-test-" + (count++)); - } while(!mTempDir.mkdir()); + } while (!mTempDir.mkdir()); FileLog.setDir(mTempDir); } From fdd1905e27c3741b6a9c6b4d2904047e21bca67f Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 2 Nov 2018 17:38:07 -0700 Subject: [PATCH 07/20] Convert more tests to TAPL Bug: 110103162 Test: running these tests Change-Id: I76b145eb4d16aca20ce30a5abca8f4568e3297e4 --- .../launcher3/ui/AllAppsIconToHomeTest.java | 48 +++-------- .../launcher3/ui/ShortcutsLaunchTest.java | 7 +- .../launcher3/ui/ShortcutsToHomeTest.java | 75 +++++------------ .../com/android/launcher3/tapl/AppIcon.java | 29 +------ .../launcher3/tapl/AppIconMenuItem.java | 25 +----- .../android/launcher3/tapl/Launchable.java | 81 +++++++++++++++++++ .../com/android/launcher3/tapl/Workspace.java | 21 ++++- 7 files changed, 142 insertions(+), 144 deletions(-) create mode 100644 tests/tapl/com/android/launcher3/tapl/Launchable.java diff --git a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java index 916007607f..9354862487 100644 --- a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java @@ -1,18 +1,10 @@ package com.android.launcher3.ui; -import static org.junit.Assert.assertTrue; - import android.content.pm.LauncherActivityInfo; + import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; - -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,37 +16,23 @@ import org.junit.runner.RunWith; public class AllAppsIconToHomeTest extends AbstractLauncherUiTest { @Test - @Ignore - public void testDragIcon_portrait() throws Throwable { - lockRotation(true); - performTest(); - } - - @Test - @Ignore - public void testDragIcon_landscape() throws Throwable { - lockRotation(false); - performTest(); - } - - private void performTest() throws Throwable { + @PortraitLandscape + public void testDragIcon() throws Throwable { LauncherActivityInfo settingsApp = getSettingsApp(); clearHomescreen(); mDevice.pressHome(); mDevice.waitForIdle(); - // Open all apps and wait for load complete. - final UiObject2 appsContainer = TestViewHelpers.openAllApps(); - Wait.atMost(null, Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT); - - // Drag icon to homescreen. - UiObject2 icon = scrollAndFind(appsContainer, By.text(settingsApp.getLabel().toString())); - TestViewHelpers.dragToWorkspace(icon, true); - - // Verify that the icon works on homescreen. - mDevice.findObject(By.text(settingsApp.getLabel().toString())).click(); - assertTrue(mDevice.wait(Until.hasObject(By.pkg( - settingsApp.getComponentName().getPackageName()).depth(0)), DEFAULT_UI_TIMEOUT)); + final String appName = settingsApp.getLabel().toString(); + // 1. Open all apps and wait for load complete. + // 2. Drag icon to homescreen. + // 3. Verify that the icon works on homescreen. + mLauncher.getWorkspace(). + switchToAllApps(). + getAppIcon(appName). + dragToWorkspace(). + getWorkspaceAppIcon(appName). + launch(settingsApp.getComponentName().getPackageName()); } } diff --git a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java index e95801a00e..1fea4d5c88 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java @@ -6,8 +6,6 @@ import android.content.pm.LauncherActivityInfo; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.Until; import com.android.launcher3.Launcher; import com.android.launcher3.popup.ArrowPopup; @@ -49,9 +47,6 @@ public class ShortcutsLaunchTest extends AbstractLauncherUiTest { final AppIconMenuItem menuItem = menu.getMenuItem(1); final String itemName = menuItem.getText(); - menuItem.launch(); - assertTrue(mDevice.wait(Until.hasObject(By.pkg( - testApp.getComponentName().getPackageName()) - .text(itemName)), DEFAULT_UI_TIMEOUT)); + menuItem.launch(testApp.getComponentName().getPackageName(), itemName); } } diff --git a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java index 436c6991db..4c2c959b72 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java @@ -1,22 +1,12 @@ package com.android.launcher3.ui; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - import android.content.pm.LauncherActivityInfo; -import android.graphics.Point; + import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; -import android.view.MotionEvent; -import com.android.launcher3.R; -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; +import com.android.launcher3.tapl.AppIconMenuItem; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -28,51 +18,30 @@ import org.junit.runner.RunWith; public class ShortcutsToHomeTest extends AbstractLauncherUiTest { @Test - @Ignore - public void testDragIcon_portrait() throws Throwable { - lockRotation(true); - performTest(); - } - - @Test - @Ignore - public void testDragIcon_landscape() throws Throwable { - lockRotation(false); - performTest(); - } - - private void performTest() throws Throwable { + @PortraitLandscape + public void testDragIcon() throws Throwable { clearHomescreen(); mActivityMonitor.startLauncher(); - LauncherActivityInfo testApp = getSettingsApp(); + LauncherActivityInfo testApp = getSettingsApp(); - // Open all apps and wait for load complete. - final UiObject2 appsContainer = TestViewHelpers.openAllApps(); - Wait.atMost(null, Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT); + // 1. Open all apps and wait for load complete. + // 2. Find the app and long press it to show shortcuts. + // 3. Press icon center until shortcuts appear + final AppIconMenuItem menuItem = mLauncher. + getWorkspace(). + switchToAllApps(). + getAppIcon(testApp.getLabel().toString()). + openMenu(). + getMenuItem(0); + final String shortcutName = menuItem.getText(); - // Find the app and long press it to show shortcuts. - UiObject2 icon = scrollAndFind(appsContainer, By.text(testApp.getLabel().toString())); - // Press icon center until shortcuts appear - Point iconCenter = icon.getVisibleCenter(); - TestViewHelpers.sendPointer(MotionEvent.ACTION_DOWN, iconCenter); - UiObject2 deepShortcutsContainer = TestViewHelpers.findViewById( - R.id.deep_shortcuts_container); - assertNotNull(deepShortcutsContainer); - TestViewHelpers.sendPointer(MotionEvent.ACTION_UP, iconCenter); - - // Drag the first shortcut to the home screen. - assertTrue(deepShortcutsContainer.getChildCount() > 0); - UiObject2 shortcut = deepShortcutsContainer.getChildren().get(1) - .findObject(TestViewHelpers.getSelectorForId(R.id.bubble_text)); - String shortcutName = shortcut.getText(); - TestViewHelpers.dragToWorkspace(shortcut, false); - - // Verify that the shortcut works on home screen - // (the app opens and has the same text as the shortcut). - mDevice.findObject(By.text(shortcutName)).click(); - assertTrue(mDevice.wait(Until.hasObject(By.pkg( - testApp.getComponentName().getPackageName()) - .text(shortcutName)), DEFAULT_UI_TIMEOUT)); + // 4. Drag the first shortcut to the home screen. + // 5. Verify that the shortcut works on home screen + // (the app opens and has the same text as the shortcut). + menuItem. + dragToWorkspace(). + getWorkspaceAppIcon(shortcutName). + launch(testApp.getComponentName().getPackageName(), shortcutName); } } diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java index 1c0ecb9339..efefc0dca2 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java @@ -22,47 +22,24 @@ import android.widget.TextView; import androidx.test.uiautomator.By; import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; /** * App icon, whether in all apps or in workspace/ */ -public final class AppIcon { - private final LauncherInstrumentation mLauncher; - private final UiObject2 mIcon; - +public final class AppIcon extends Launchable { AppIcon(LauncherInstrumentation launcher, UiObject2 icon) { - mLauncher = launcher; - mIcon = icon; + super(launcher, icon); } static BySelector getAppIconSelector(String appName) { return By.clazz(TextView.class).text(appName).pkg(LauncherInstrumentation.LAUNCHER_PKG); } - /** - * Clicks the icon to launch its app. - */ - public Background launch(String packageName) { - LauncherInstrumentation.log("AppIcon.launch before click " + mIcon.getVisibleCenter()); - LauncherInstrumentation.assertTrue( - "Launching an app didn't open a new window: " + mIcon.getText(), - mIcon.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); - LauncherInstrumentation.assertTrue( - "App didn't start: " + packageName, mLauncher.getDevice().wait(Until.hasObject( - By.pkg(packageName).depth(0)), LauncherInstrumentation.WAIT_TIME_MS)); - return new Background(mLauncher); - } - - UiObject2 getIcon() { - return mIcon; - } - /** * Long-clicks the icon to open its menu. */ public AppIconMenu openMenu() { - final Point iconCenter = mIcon.getVisibleCenter(); + final Point iconCenter = mObject.getVisibleCenter(); mLauncher.longTap(iconCenter.x, iconCenter.y); final UiObject2 deepShortcutsContainer = mLauncher.waitForLauncherObject( "deep_shortcuts_container"); diff --git a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java index 7b2abeb756..c39f8d1675 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java @@ -16,37 +16,20 @@ package com.android.launcher3.tapl; -import static org.junit.Assert.assertTrue; - import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; /** * Menu item in an app icon menu. */ -public class AppIconMenuItem { - private final LauncherInstrumentation mLauncher; - final UiObject2 mShortcut; - - AppIconMenuItem(LauncherInstrumentation launcher, - UiObject2 shortcut) { - mLauncher = launcher; - mShortcut = shortcut; +public class AppIconMenuItem extends Launchable { + AppIconMenuItem(LauncherInstrumentation launcher, UiObject2 shortcut) { + super(launcher, shortcut); } /** * Returns the visible text of the menu item. */ public String getText() { - return mShortcut.getText(); - } - - /** - * Launches the action for the menu item. - */ - public Background launch() { - assertTrue("Clicking a menu item didn't open a new window: " + mShortcut.getText(), - mShortcut.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); - return new Background(mLauncher); + return mObject.getText(); } } diff --git a/tests/tapl/com/android/launcher3/tapl/Launchable.java b/tests/tapl/com/android/launcher3/tapl/Launchable.java new file mode 100644 index 0000000000..7e2c9660d5 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/Launchable.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2018 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.tapl; + +import android.graphics.Point; + +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; + +/** + * Ancestor for AppIcon and AppMenuItem. + */ +class Launchable { + private static final int DRAG_SPEED = 500; + protected final LauncherInstrumentation mLauncher; + + protected final UiObject2 mObject; + + Launchable(LauncherInstrumentation launcher, UiObject2 object) { + mObject = object; + mLauncher = launcher; + } + + UiObject2 getObject() { + return mObject; + } + + /** + * Clicks the object to launch its app. + */ + public Background launch(String expectedPackageName) { + return launch(expectedPackageName, By.pkg(expectedPackageName).depth(0)); + } + + /** + * Clicks the object to launch its app. + */ + public Background launch(String expectedPackageName, String expectedAppText) { + return launch(expectedPackageName, By.pkg(expectedPackageName).text(expectedAppText)); + } + + private Background launch(String errorMessage, BySelector selector) { + LauncherInstrumentation.log("Launchable.launch before click " + + mObject.getVisibleCenter()); + LauncherInstrumentation.assertTrue( + "Launching an app didn't open a new window: " + mObject.getText(), + mObject.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); + LauncherInstrumentation.assertTrue( + "App didn't start: " + errorMessage, + mLauncher.getDevice().wait(Until.hasObject(selector), + LauncherInstrumentation.WAIT_TIME_MS)); + return new Background(mLauncher); + } + + /** + * Drags an object to the center of homescreen. + */ + public Workspace dragToWorkspace() { + final UiDevice device = mLauncher.getDevice(); + mObject.drag(new Point( + device.getDisplayWidth() / 2, device.getDisplayHeight() / 2), DRAG_SPEED); + return new Workspace(mLauncher); + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java index 493f26ae9c..c63822e2ea 100644 --- a/tests/tapl/com/android/launcher3/tapl/Workspace.java +++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java @@ -19,12 +19,12 @@ package com.android.launcher3.tapl; import static junit.framework.TestCase.assertTrue; import android.graphics.Point; -import androidx.test.uiautomator.Direction; -import androidx.test.uiautomator.UiObject2; import android.view.KeyEvent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiObject2; /** * Operations on the workspace screen. @@ -85,6 +85,21 @@ public final class Workspace extends Home { return icon != null ? new AppIcon(mLauncher, icon) : null; } + + /** + * Returns an icon for the app; fails if the icon doesn't exist. + * + * @param appName name of the app + * @return app icon. + */ + @NonNull + public AppIcon getWorkspaceAppIcon(String appName) { + return new AppIcon(mLauncher, + mLauncher.getObjectInContainer( + verifyActiveContainer(), + AppIcon.getAppIconSelector(appName))); + } + /** * Ensures that workspace is scrollable. If it's not, drags an icon icons from hotseat to the * second screen. @@ -111,7 +126,7 @@ public final class Workspace extends Home { private void dragIconToNextScreen(AppIcon app, UiObject2 workspace) { final Point dest = new Point( mLauncher.getDevice().getDisplayWidth(), workspace.getVisibleBounds().centerY()); - app.getIcon().drag(dest, ICON_DRAG_SPEED); + app.getObject().drag(dest, ICON_DRAG_SPEED); verifyActiveContainer(); } From 1b4560cf2a680290f2fd4f3b439ee6393c43cad1 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 30 Oct 2018 15:37:33 -0700 Subject: [PATCH 08/20] Adding dummy app apk for tests Bug: 117888000 Test: In Nexus code Change-Id: Ibf0b803c9db6b344ffbe5b7761efb2a2d86867c6 --- tests/dummy_app/Android.mk | 18 +++++++ tests/dummy_app/AndroidManifest.xml | 36 +++++++++++++ tests/dummy_app/res/layout/empty_activity.xml | 24 +++++++++ .../res/mipmap-anydpi/ic_launcher1.xml | 21 ++++++++ .../res/mipmap-anydpi/ic_launcher2.xml | 19 +++++++ .../res/mipmap-xxhdpi/ic_launcher1.png | Bin 0 -> 7239 bytes .../res/mipmap-xxhdpi/ic_launcher2.png | Bin 0 -> 6078 bytes .../res/mipmap-xxhdpi/icon_back_1.png | Bin 0 -> 822 bytes .../res/mipmap-xxhdpi/icon_fore_1.png | Bin 0 -> 13639 bytes .../res/mipmap-xxxhdpi/ic_launcher1.png | Bin 0 -> 10535 bytes .../res/mipmap-xxxhdpi/ic_launcher2.png | Bin 0 -> 8131 bytes .../res/mipmap-xxxhdpi/icon_back_1.png | Bin 0 -> 1234 bytes .../res/mipmap-xxxhdpi/icon_fore_1.png | Bin 0 -> 21234 bytes tests/dummy_app/res/values/colors.xml | 4 ++ .../example/android/aardwolf/Activity1.java | 31 +++++++++++ tests/res/raw/aardwolf_dummy_app.apk | Bin 0 -> 83296 bytes .../com/android/launcher3/util/TestUtil.java | 51 ++++++++++++++++++ 17 files changed, 204 insertions(+) create mode 100644 tests/dummy_app/Android.mk create mode 100644 tests/dummy_app/AndroidManifest.xml create mode 100644 tests/dummy_app/res/layout/empty_activity.xml create mode 100644 tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml create mode 100644 tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/ic_launcher1.png create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/ic_launcher2.png create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/icon_back_1.png create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/icon_fore_1.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher1.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher2.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/icon_back_1.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/icon_fore_1.png create mode 100644 tests/dummy_app/res/values/colors.xml create mode 100644 tests/dummy_app/src/com/example/android/aardwolf/Activity1.java create mode 100644 tests/res/raw/aardwolf_dummy_app.apk create mode 100644 tests/src/com/android/launcher3/util/TestUtil.java diff --git a/tests/dummy_app/Android.mk b/tests/dummy_app/Android.mk new file mode 100644 index 0000000000..f4ab582ebf --- /dev/null +++ b/tests/dummy_app/Android.mk @@ -0,0 +1,18 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := samples + +# Only compile source java files in this apk. +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := Aardwolf + +LOCAL_SDK_VERSION := current + +LOCAL_DEX_PREOPT := false + +include $(BUILD_PACKAGE) + +# Use the following include to make our test apk. +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/dummy_app/AndroidManifest.xml b/tests/dummy_app/AndroidManifest.xml new file mode 100644 index 0000000000..0546015a52 --- /dev/null +++ b/tests/dummy_app/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + diff --git a/tests/dummy_app/res/layout/empty_activity.xml b/tests/dummy_app/res/layout/empty_activity.xml new file mode 100644 index 0000000000..377c56bc36 --- /dev/null +++ b/tests/dummy_app/res/layout/empty_activity.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml b/tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml new file mode 100644 index 0000000000..37c8c7387a --- /dev/null +++ b/tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml b/tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml new file mode 100644 index 0000000000..20b2986b6c --- /dev/null +++ b/tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher1.png b/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher1.png new file mode 100644 index 0000000000000000000000000000000000000000..73bc8e65b24153312ed82472f9db5fdf8f7600f2 GIT binary patch literal 7239 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 VegRgqgfajC002ovPDHLkV1ghQ%=!QT literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher2.png b/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher2.png new file mode 100644 index 0000000000000000000000000000000000000000..cd40b63c2073bb6c3f27307873cac2b535baae5f GIT binary patch literal 6078 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 E0C`Ft;{X5v literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxhdpi/icon_fore_1.png b/tests/dummy_app/res/mipmap-xxhdpi/icon_fore_1.png new file mode 100644 index 0000000000000000000000000000000000000000..de4079bd2843c2fd01729b162bd5030492ba4c76 GIT binary patch literal 13639 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 b|Kjxv21e%@O_I_t&umg+@}M%2Z@&KnjWfto literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher1.png b/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher1.png new file mode 100644 index 0000000000000000000000000000000000000000..889a99cfb7a66080761565f59f392ac118243af8 GIT binary patch literal 10535 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 literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher2.png b/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher2.png new file mode 100644 index 0000000000000000000000000000000000000000..973bb794b27a148c5ca0b9803f6d916e09e5992d GIT binary patch literal 8131 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 literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/icon_back_1.png b/tests/dummy_app/res/mipmap-xxxhdpi/icon_back_1.png new file mode 100644 index 0000000000000000000000000000000000000000..70c0ebd783015990919efde179e4abe3cca1b16f GIT binary patch literal 1234 zcmeAS@N?(olHy`uVBq!ia0y~yVB7%0985qFcb(<6K#H@#BeIx*LB|_}8JF5lTL~1D zEOCt}3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1YQw<567T8a7*cWT%@spI1_KV3 zgX;GT9DD0|FCILzu0?xYl^KJIKNEv9i-8Mm2p+)$0*o{wXyamNSkTVdK$B?|+F-ZS zD73)=LdzhZ!a%z)r=`1DXy@#~om3vo(?7tl#E&Jp%lxMvusmY$boFyt=akR{07-k_ ArT_o{ literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/icon_fore_1.png b/tests/dummy_app/res/mipmap-xxxhdpi/icon_fore_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d91632113200be7bdff517a68084557e8587e7e GIT binary patch literal 21234 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�K96g5gQYZhWUm(2hOL`j2x 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 literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/values/colors.xml b/tests/dummy_app/res/values/colors.xml new file mode 100644 index 0000000000..b5ce66e9fb --- /dev/null +++ b/tests/dummy_app/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #455A64 + \ No newline at end of file diff --git a/tests/dummy_app/src/com/example/android/aardwolf/Activity1.java b/tests/dummy_app/src/com/example/android/aardwolf/Activity1.java new file mode 100644 index 0000000000..d4eab1545d --- /dev/null +++ b/tests/dummy_app/src/com/example/android/aardwolf/Activity1.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 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.example.android.aardwolf; + +import android.app.Activity; +import android.os.Bundle; +import android.view.View; + +public class Activity1 extends Activity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + View view = getLayoutInflater().inflate(R.layout.empty_activity, null); + setContentView(view); + } +} + diff --git a/tests/res/raw/aardwolf_dummy_app.apk b/tests/res/raw/aardwolf_dummy_app.apk new file mode 100644 index 0000000000000000000000000000000000000000..39fb368ca9fe16e9d641ea800fb8bad5499f7f22 GIT binary patch literal 83296 zcmeFYWo#u)5G{7i%*^aHv%TImGcz+Yv)9bNX2vx$ubG*dnVFf{@fW>Bijt=⁢Zl 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 literal 0 HcmV?d00001 diff --git a/tests/src/com/android/launcher3/util/TestUtil.java b/tests/src/com/android/launcher3/util/TestUtil.java new file mode 100644 index 0000000000..1338dcb108 --- /dev/null +++ b/tests/src/com/android/launcher3/util/TestUtil.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2018 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.util; + +import static androidx.test.InstrumentationRegistry.getContext; +import static androidx.test.InstrumentationRegistry.getInstrumentation; + +import android.content.res.Resources; + +import androidx.test.uiautomator.UiDevice; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class TestUtil { + public static void installDummyApp() throws IOException { + // Copy apk from resources to a local file and install from there. + final Resources resources = getContext().getResources(); + final InputStream in = resources.openRawResource( + resources.getIdentifier("aardwolf_dummy_app", + "raw", getContext().getPackageName())); + final String apkFilename = getInstrumentation().getTargetContext(). + getFilesDir().getPath() + "/dummy_app.apk"; + + final FileOutputStream out = new FileOutputStream(apkFilename); + byte[] buff = new byte[1024]; + int read; + + while ((read = in.read(buff)) > 0) { + out.write(buff, 0, read); + } + in.close(); + out.close(); + + UiDevice.getInstance(getInstrumentation()).executeShellCommand("pm install " + apkFilename); + } +} From fc007479090e3a64d6e24534605fe08e7dc5bc96 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 25 Oct 2018 14:09:50 -0700 Subject: [PATCH 09/20] Add StatsLog*Manager for logging. Bug: 113043444 Verification: (19) is our event classifier number 11-05 11:24:28.188 932 994 I statsd : { 1541445868000000000 766293363001 (19)0x10000->1[I] 0x20000->0[I] 0x30000->0[I] 0x40000->[S] 0x50000->1[I] } Change-Id: I75403837f9fa8e51efa012fb708bce7efc9c4488 --- quickstep/libs/sysui_shared.jar | Bin 185554 -> 200647 bytes quickstep/res/values/config.xml | 2 + .../logging/StatsLogCompatManager.java | 105 ++++++++++++++++++ .../logging/UserEventDispatcherExtension.java | 1 + .../com/android/quickstep/views/TaskView.java | 3 + res/values/config.xml | 1 + src/com/android/launcher3/BaseActivity.java | 15 ++- .../launcher3/BaseDraggingActivity.java | 1 + src/com/android/launcher3/DragSource.java | 2 +- src/com/android/launcher3/Hotseat.java | 2 +- src/com/android/launcher3/Launcher.java | 11 ++ .../allapps/AllAppsRecyclerView.java | 2 +- .../launcher3/logging/LoggerUtils.java | 1 + .../launcher3/logging/StatsLogManager.java | 46 ++++++++ .../launcher3/logging/StatsLogUtils.java | 67 +++++++++++ .../logging/UserEventDispatcher.java | 78 +++---------- 16 files changed, 271 insertions(+), 66 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java create mode 100644 src/com/android/launcher3/logging/StatsLogManager.java create mode 100644 src/com/android/launcher3/logging/StatsLogUtils.java diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 6f3fa4be552bd57055bc12ca8b5d80dce8b08dd6..163524e179cad2fcd61593bf6ad85ea896dcc030 100644 GIT binary patch delta 73274 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 z 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%0A9=ZgWc*~DJj^~}(w`rMO~sLa?yQFu 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 diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml index d8ca1c47c1..3fbfcdd6c4 100644 --- a/quickstep/res/values/config.xml +++ b/quickstep/res/values/config.xml @@ -20,6 +20,8 @@ com.android.quickstep.logging.UserEventDispatcherExtension + com.android.quickstep.logging.StatsLogCompatManager + 3 diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java new file mode 100644 index 0000000000..2f411efc7b --- /dev/null +++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.quickstep.logging; + +import android.content.Context; +import android.content.Intent; +import android.stats.launcher.nano.LauncherExtension; +import android.stats.launcher.nano.LauncherTarget; + +import static android.stats.launcher.nano.Launcher.ALLAPPS; +import static android.stats.launcher.nano.Launcher.HOME; +import static android.stats.launcher.nano.Launcher.LAUNCH_APP; +import static android.stats.launcher.nano.Launcher.LAUNCH_TASK; +import static android.stats.launcher.nano.Launcher.BACKGROUND; +import static android.stats.launcher.nano.Launcher.OVERVIEW; + +import android.view.View; + +import com.android.launcher3.ItemInfo; +import com.android.launcher3.logging.StatsLogManager; +import com.android.launcher3.logging.StatsLogUtils; +import com.android.launcher3.userevent.nano.LauncherLogProto.Target; +import com.android.launcher3.util.ComponentKey; +import com.android.systemui.shared.system.StatsLogCompat; +import com.google.protobuf.nano.MessageNano; + +import androidx.annotation.Nullable; + +/** + * This method calls the StatsLog hidden method until they are made available public. + * + * To see if the logs are properly sent to statsd, execute following command. + * $ adb root && adb shell statsd + * $ adb shell cmd stats print-logs + * $ adb logcat | grep statsd OR $ adb logcat -b stats + */ +public class StatsLogCompatManager extends StatsLogManager { + + private static final int SUPPORTED_TARGET_DEPTH = 2; + + public StatsLogCompatManager(Context context) { } + + @Override + public void logAppLaunch(View v, Intent intent) { + LauncherExtension ext = new LauncherExtension(); + ext.srcTarget = new LauncherTarget[SUPPORTED_TARGET_DEPTH]; + int srcState = mStateProvider.getCurrentState(); + fillInLauncherExtension(v, ext); + StatsLogCompat.write(LAUNCH_APP, srcState, BACKGROUND /* dstState */, + MessageNano.toByteArray(ext), true); + } + + @Override + public void logTaskLaunch(View v, ComponentKey componentKey) { + LauncherExtension ext = new LauncherExtension(); + ext.srcTarget = new LauncherTarget[SUPPORTED_TARGET_DEPTH]; + int srcState = OVERVIEW; + fillInLauncherExtension(v, ext); + StatsLogCompat.write(LAUNCH_TASK, srcState, BACKGROUND /* dstState */, + MessageNano.toByteArray(ext), true); + } + + public static boolean fillInLauncherExtension(View v, LauncherExtension extension) { + StatsLogUtils.LogContainerProvider provider = StatsLogUtils.getLaunchProviderRecursive(v); + if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { + return false; + } + ItemInfo itemInfo = (ItemInfo) v.getTag(); + Target child = new Target(); + Target parent = new Target(); + provider.fillInLogContainerData(v, itemInfo, child, parent); + copy(child, extension.srcTarget[0]); + copy(parent, extension.srcTarget[1]); + return true; + } + + private static void copy(Target src, LauncherTarget dst) { + // fill in + } + + @Override + public void verify() { + if(!(StatsLogUtils.LAUNCHER_STATE_ALLAPPS == ALLAPPS && + StatsLogUtils.LAUNCHER_STATE_BACKGROUND == BACKGROUND && + StatsLogUtils.LAUNCHER_STATE_OVERVIEW == OVERVIEW && + StatsLogUtils.LAUNCHER_STATE_HOME == HOME)) { + throw new IllegalStateException( + "StatsLogUtil constants doesn't match enums in launcher.proto"); + } + } +} diff --git a/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java b/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java index 6dff187ea5..4392851c0e 100644 --- a/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java +++ b/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java @@ -34,6 +34,7 @@ import com.android.systemui.shared.system.MetricsLoggerCompat; * quickstep interactions. */ @SuppressWarnings("unused") +@Deprecated public class UserEventDispatcherExtension extends UserEventDispatcher { private static final String TAG = "UserEventDispatcher"; diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 2a4226faa2..d34dc5b811 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -167,9 +167,12 @@ public class TaskView extends FrameLayout implements PageCallbacks { return; } launchTask(true /* animate */); + fromContext(context).getUserEventDispatcher().logTaskLaunchOrDismiss( Touch.TAP, Direction.NONE, getRecentsView().indexOfChild(this), TaskUtils.getLaunchComponentKeyForTask(getTask().key)); + fromContext(context).getStatsLogManager().logTaskLaunch(getRecentsView(), + TaskUtils.getLaunchComponentKeyForTask(getTask().key)); }); setOutlineProvider(new TaskOutlineProvider(getResources())); } diff --git a/res/values/config.xml b/res/values/config.xml index 5e83ab7666..4ab22741c6 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -84,6 +84,7 @@ + diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index 7b565273f2..77b6010c26 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -28,6 +28,9 @@ import android.view.ContextThemeWrapper; import android.view.View.AccessibilityDelegate; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; +import com.android.launcher3.logging.StatsLogManager; +import com.android.launcher3.logging.StatsLogUtils; +import com.android.launcher3.logging.StatsLogUtils.LogStateProvider; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.logging.UserEventDispatcher.UserEventDelegate; import com.android.launcher3.uioverrides.UiFactory; @@ -41,7 +44,7 @@ import java.util.ArrayList; import androidx.annotation.IntDef; -public abstract class BaseActivity extends Activity implements UserEventDelegate{ +public abstract class BaseActivity extends Activity implements UserEventDelegate, LogStateProvider{ public static final int INVISIBLE_BY_STATE_HANDLER = 1 << 0; public static final int INVISIBLE_BY_APP_TRANSITIONS = 1 << 1; @@ -72,6 +75,7 @@ public abstract class BaseActivity extends Activity implements UserEventDelegate protected DeviceProfile mDeviceProfile; protected UserEventDispatcher mUserEventDispatcher; + protected StatsLogManager mStatsLogManager; protected SystemUiController mSystemUiController; private static final int ACTIVITY_STATE_STARTED = 1 << 0; @@ -104,8 +108,17 @@ public abstract class BaseActivity extends Activity implements UserEventDelegate return null; } + public int getCurrentState() { return StatsLogUtils.LAUNCHER_STATE_BACKGROUND; } + public void modifyUserEvent(LauncherLogProto.LauncherEvent event) {} + public final StatsLogManager getStatsLogManager() { + if (mStatsLogManager == null) { + mStatsLogManager = StatsLogManager.newInstance(this, this); + } + return mStatsLogManager; + } + public final UserEventDispatcher getUserEventDispatcher() { if (mUserEventDispatcher == null) { mUserEventDispatcher = UserEventDispatcher.newInstance(this, this); diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index f5fbf80dcd..152dc84d01 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -200,6 +200,7 @@ public abstract class BaseDraggingActivity extends BaseActivity intent.getComponent(), user, intent.getSourceBounds(), optsBundle); } getUserEventDispatcher().logAppLaunch(v, intent); + getStatsLogManager().logAppLaunch(v, intent); return true; } catch (ActivityNotFoundException|SecurityException e) { Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); diff --git a/src/com/android/launcher3/DragSource.java b/src/com/android/launcher3/DragSource.java index 93f865c9f9..d4d7b99fd4 100644 --- a/src/com/android/launcher3/DragSource.java +++ b/src/com/android/launcher3/DragSource.java @@ -19,7 +19,7 @@ package com.android.launcher3; import android.view.View; import com.android.launcher3.DropTarget.DragObject; -import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; /** * Interface defining an object that can originate a drag. diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index 15a9f2e06b..cb354a6f1c 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -26,7 +26,7 @@ import android.view.ViewDebug; import android.view.ViewGroup; import android.widget.FrameLayout; -import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3ae9a49e70..3a38c0fbc8 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -91,6 +91,7 @@ import com.android.launcher3.icons.IconCache; import com.android.launcher3.keyboard.CustomActionsPopup; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.logging.FileLog; +import com.android.launcher3.logging.StatsLogUtils; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.logging.UserEventDispatcher.UserEventDelegate; import com.android.launcher3.model.ModelWriter; @@ -1609,6 +1610,16 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } } + @Override + public int getCurrentState() { + if(mStateManager.getState() == LauncherState.ALL_APPS) { + return StatsLogUtils.LAUNCHER_STATE_ALLAPPS; + } else if (mStateManager.getState() == LauncherState.OVERVIEW) { + return StatsLogUtils.LAUNCHER_STATE_OVERVIEW; + } + return StatsLogUtils.LAUNCHER_STATE_BACKGROUND; + } + @Override public void modifyUserEvent(LauncherLogProto.LauncherEvent event) { if (event.srcTarget != null && event.srcTarget.length > 0 && diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index fa07d4d75c..180ca48166 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -33,7 +33,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.graphics.DrawableFactory; -import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.views.RecyclerViewFastScroller; diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index 1c4327c499..4ef86265f5 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -40,6 +40,7 @@ import java.lang.reflect.Modifier; /** * Helper methods for logging. */ +@Deprecated public class LoggerUtils { private static final ArrayMap> sNameCache = new ArrayMap<>(); private static final String UNKNOWN = "UNKNOWN"; diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java new file mode 100644 index 0000000000..d332dc5ce3 --- /dev/null +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 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.logging; + +import android.content.Context; +import android.content.Intent; +import android.view.View; + +import com.android.launcher3.R; +import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.ResourceBasedOverride; +import com.android.launcher3.logging.StatsLogUtils.LogStateProvider; + +/** + * Handles the user event logging in Q. + * Since the AOSP Launcher3 doesn't take part in the StatsLog logging, the class + * itself is abstract. + */ +public abstract class StatsLogManager implements ResourceBasedOverride { + + protected LogStateProvider mStateProvider; + public static StatsLogManager newInstance(Context context, LogStateProvider stateProvider) { + StatsLogManager mgr = Overrides.getObject(StatsLogManager.class, + context.getApplicationContext(), R.string.stats_log_manager_class); + mgr.mStateProvider = stateProvider; + mgr.verify(); + return mgr; + } + + public void logAppLaunch(View v, Intent intent) { } + public void logTaskLaunch(View v, ComponentKey key) { } + public void verify() {} // TODO: should move into robo tests +} diff --git a/src/com/android/launcher3/logging/StatsLogUtils.java b/src/com/android/launcher3/logging/StatsLogUtils.java new file mode 100644 index 0000000000..647f255af3 --- /dev/null +++ b/src/com/android/launcher3/logging/StatsLogUtils.java @@ -0,0 +1,67 @@ +package com.android.launcher3.logging; + +import android.view.View; +import android.view.ViewParent; + +import com.android.launcher3.ItemInfo; +import com.android.launcher3.userevent.nano.LauncherLogProto.Target; + +import androidx.annotation.Nullable; + + +public class StatsLogUtils { + + // Defined in android.stats.launcher.nano + // As they cannot be linked in this file, defining again. + public final static int LAUNCHER_STATE_BACKGROUND = 0; + public final static int LAUNCHER_STATE_HOME = 1; + public final static int LAUNCHER_STATE_OVERVIEW = 2; + public final static int LAUNCHER_STATE_ALLAPPS = 3; + + private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; + + public interface LogStateProvider { + int getCurrentState(); + } + + /** + * Implemented by containers to provide a container source for a given child. + * + * Currently, + */ + public interface LogContainerProvider { + + /** + * Copies data from the source to the destination proto. + * + * @param v source of the data + * @param info source of the data + * @param target dest of the data + * @param targetParent dest of the data + */ + void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent); + } + + /** + * Recursively finds the parent of the given child which implements IconLogInfoProvider + */ + public static LogContainerProvider getLaunchProviderRecursive(@Nullable View v) { + ViewParent parent; + if (v != null) { + parent = v.getParent(); + } else { + return null; + } + + // Optimization to only check up to 5 parents. + int count = MAXIMUM_VIEW_HIERARCHY_LEVEL; + while (parent != null && count-- > 0) { + if (parent instanceof LogContainerProvider) { + return (LogContainerProvider) parent; + } else { + parent = parent.getParent(); + } + } + return null; + } +} diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index a318dc0eb6..e11516890c 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -41,9 +41,9 @@ import com.android.launcher3.ItemInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; -import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ComponentKey; @@ -62,10 +62,9 @@ import androidx.annotation.Nullable; * * $ adb shell setprop log.tag.UserEvent VERBOSE */ +@Deprecated public class UserEventDispatcher implements ResourceBasedOverride { - private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; - private static final String TAG = "UserEvent"; private static final boolean IS_VERBOSE = FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(LogConfig.USEREVENT); @@ -96,42 +95,19 @@ public class UserEventDispatcher implements ResourceBasedOverride { } /** - * Implemented by containers to provide a container source for a given child. + * Fills in the container data on the given event if the given view is not null. + * @return whether container data was added. */ - public interface LogContainerProvider { - - /** - * Copies data from the source to the destination proto. - * - * @param v source of the data - * @param info source of the data - * @param target dest of the data - * @param targetParent dest of the data - */ - void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent); - } - - /** - * Recursively finds the parent of the given child which implements IconLogInfoProvider - */ - public static LogContainerProvider getLaunchProviderRecursive(@Nullable View v) { - ViewParent parent; - if (v != null) { - parent = v.getParent(); - } else { - return null; + @Deprecated + public static boolean fillInLogContainerData(LauncherLogProto.LauncherEvent event, @Nullable View v) { + // Fill in grid(x,y), pageIndex of the child and container type of the parent + LogContainerProvider provider = StatsLogUtils.getLaunchProviderRecursive(v); + if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { + return false; } - - // Optimization to only check up to 5 parents. - int count = MAXIMUM_VIEW_HIERARCHY_LEVEL; - while (parent != null && count-- > 0) { - if (parent instanceof LogContainerProvider) { - return (LogContainerProvider) parent; - } else { - parent = parent.getParent(); - } - } - return null; + ItemInfo itemInfo = (ItemInfo) v.getTag(); + provider.fillInLogContainerData(v, itemInfo, event.srcTarget[0], event.srcTarget[1]); + return true; } private boolean mSessionStarted; @@ -150,21 +126,7 @@ public class UserEventDispatcher implements ResourceBasedOverride { // intentHash required // -------------------------------------------------------------- - /** - * Fills in the container data on the given event if the given view is not null. - * @return whether container data was added. - */ - protected boolean fillInLogContainerData(LauncherEvent event, @Nullable View v) { - // Fill in grid(x,y), pageIndex of the child and container type of the parent - LogContainerProvider provider = getLaunchProviderRecursive(v); - if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { - return false; - } - ItemInfo itemInfo = (ItemInfo) v.getTag(); - provider.fillInLogContainerData(v, itemInfo, event.srcTarget[0], event.srcTarget[1]); - return true; - } - + @Deprecated public void logAppLaunch(View v, Intent intent) { LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.TAP), newItemTarget(v, mInstantAppResolver), newTarget(Target.Type.CONTAINER)); @@ -181,6 +143,7 @@ public class UserEventDispatcher implements ResourceBasedOverride { public void logActionTip(int actionType, int viewType) { } + @Deprecated public void logTaskLaunchOrDismiss(int action, int direction, int taskIndex, ComponentKey componentKey) { LauncherEvent event = newLauncherEvent(newTouchAction(action), // TAP or SWIPE or FLING @@ -363,7 +326,7 @@ public class UserEventDispatcher implements ResourceBasedOverride { } public void logDeepShortcutsOpen(View icon) { - LogContainerProvider provider = getLaunchProviderRecursive(icon); + LogContainerProvider provider = StatsLogUtils.getLaunchProviderRecursive(icon); if (icon == null || !(icon.getTag() instanceof ItemInfo)) { return; } @@ -376,15 +339,6 @@ public class UserEventDispatcher implements ResourceBasedOverride { resetElapsedContainerMillis("deep shortcut open"); } - /* Currently we are only interested in whether this event happens or not and don't - * care about which screen moves to where. */ - public void logOverviewReorder() { - LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP), - newContainerTarget(ContainerType.WORKSPACE), - newContainerTarget(ContainerType.OVERVIEW)); - dispatchUserEvent(event, null); - } - public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) { LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP), newItemTarget(dragObj.originalDragInfo, mInstantAppResolver), From 876e462ffa47d297100a2c8c4427d749e1ed0ed8 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 2 Nov 2018 13:50:40 -0700 Subject: [PATCH 10/20] Removing separate hotseat widget, instead using a QSB acroll all UI. The QSB is responsible for updating its UI according to various states. Bug: 109828640 Change-Id: Ic8cbf3d404d5870de0f6b8fe25a332b8d21bae20 --- res/layout/all_apps.xml | 4 +- res/layout/hotseat.xml | 28 ----- res/layout/launcher.xml | 15 ++- res/values/config.xml | 1 - src/com/android/launcher3/Hotseat.java | 37 ++---- src/com/android/launcher3/Launcher.java | 22 +--- src/com/android/launcher3/Workspace.java | 116 +++++++----------- .../WorkspaceStateTransitionAnimation.java | 5 +- .../allapps/AllAppsTransitionController.java | 17 +-- .../launcher3/allapps/SearchUiManager.java | 9 ++ .../search/AppsSearchContainerLayout.java | 9 ++ .../graphics/WorkspaceAndHotseatScrim.java | 2 +- 12 files changed, 90 insertions(+), 175 deletions(-) delete mode 100644 res/layout/hotseat.xml diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 02d793e1c0..b1e6f2efd7 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -26,7 +26,9 @@ android:focusable="false" android:saveEnabled="false" > - + diff --git a/res/layout/hotseat.xml b/res/layout/hotseat.xml deleted file mode 100644 index 00f0b5ff8a..0000000000 --- a/res/layout/hotseat.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - diff --git a/res/layout/launcher.xml b/res/layout/launcher.xml index 304d012d24..87078b93e3 100644 --- a/res/layout/launcher.xml +++ b/res/layout/launcher.xml @@ -56,22 +56,25 @@ android:id="@+id/drop_target_bar" layout="@layout/drop_target_bar" /> - + android:layout_height="match_parent" /> - + android:layout_height="match_parent" + android:theme="@style/HomeScreenElementTheme" + android:importantForAccessibility="no" + launcher:containerType="hotseat" /> + diff --git a/res/values/config.xml b/res/values/config.xml index 4ab22741c6..b33cfa113e 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -131,7 +131,6 @@ - diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index cb354a6f1c..6b5db307bc 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -27,13 +27,12 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; -import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; -public class Hotseat extends FrameLayout implements LogContainerProvider, Insettable { +public class Hotseat extends CellLayout implements LogContainerProvider, Insettable { private final Launcher mLauncher; - private CellLayout mContent; @ViewDebug.ExportedProperty(category = "launcher") private boolean mHasVerticalHotseat; @@ -51,38 +50,23 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett mLauncher = Launcher.getLauncher(context); } - public CellLayout getLayout() { - return mContent; - } - - /* Get the orientation invariant order of the item in the hotseat for persistence. */ - int getOrderInHotseat(int x, int y) { - return mHasVerticalHotseat ? (mContent.getCountY() - y - 1) : x; - } - /* Get the orientation specific coordinates given an invariant order in the hotseat. */ int getCellXFromOrder(int rank) { return mHasVerticalHotseat ? 0 : rank; } int getCellYFromOrder(int rank) { - return mHasVerticalHotseat ? (mContent.getCountY() - (rank + 1)) : 0; - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mContent = findViewById(R.id.layout); + return mHasVerticalHotseat ? (getCountY() - (rank + 1)) : 0; } void resetLayout(boolean hasVerticalHotseat) { - mContent.removeAllViewsInLayout(); + removeAllViewsInLayout(); mHasVerticalHotseat = hasVerticalHotseat; InvariantDeviceProfile idp = mLauncher.getDeviceProfile().inv; if (hasVerticalHotseat) { - mContent.setGridSize(1, idp.numHotseatIcons); + setGridSize(1, idp.numHotseatIcons); } else { - mContent.setGridSize(idp.numHotseatIcons, 1); + setGridSize(idp.numHotseatIcons, 1); } } @@ -90,15 +74,16 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett public boolean onInterceptTouchEvent(MotionEvent ev) { // We don't want any clicks to go through to the hotseat unless the workspace is in // the normal state or an accessible drag is in progress. - return !mLauncher.getWorkspace().workspaceIconsCanBeDragged() && - !mLauncher.getAccessibilityDelegate().isInAccessibleDrag(); + return (!mLauncher.getWorkspace().workspaceIconsCanBeDragged() + && !mLauncher.getAccessibilityDelegate().isInAccessibleDrag()) + || super.onInterceptTouchEvent(ev); } @Override public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.gridX = info.cellX; target.gridY = info.cellY; - targetParent.containerType = ContainerType.HOTSEAT; + targetParent.containerType = LauncherLogProto.ContainerType.HOTSEAT; } @Override @@ -121,7 +106,7 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett lp.height = grid.hotseatBarSizePx + insets.bottom; } Rect padding = grid.getHotseatLayoutPadding(); - getLayout().setPadding(padding.left, padding.top, padding.right, padding.bottom); + setPadding(padding.left, padding.top, padding.right, padding.bottom); setLayoutParams(lp); InsettableFrameLayout.dispatchInsets(this, insets); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3a38c0fbc8..4090320c48 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -207,7 +207,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, private final int[] mTmpAddItemCellCoordinates = new int[2]; @Thunk Hotseat mHotseat; - @Nullable private View mHotseatSearchBox; private DropTargetBar mDropTargetBar; @@ -914,7 +913,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, mWorkspace.initParentViews(mDragLayer); mOverviewPanel = findViewById(R.id.overview_panel); mHotseat = findViewById(R.id.hotseat); - mHotseatSearchBox = findViewById(R.id.search_container_hotseat); mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION @@ -1159,10 +1157,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, return mHotseat; } - public View getHotseatSearchBox() { - return mHotseatSearchBox; - } - public T getOverviewPanel() { return (T) mOverviewPanel; } @@ -1654,23 +1648,15 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, boolean isHotseatLayout(View layout) { // TODO: Remove this method - return mHotseat != null && layout != null && - (layout instanceof CellLayout) && (layout == mHotseat.getLayout()); + return mHotseat != null && (layout == mHotseat); } /** * Returns the CellLayout of the specified container at the specified screen. */ public CellLayout getCellLayout(int container, int screenId) { - if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - if (mHotseat != null) { - return mHotseat.getLayout(); - } else { - return null; - } - } else { - return mWorkspace.getScreenWithId(screenId); - } + return (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) + ? mHotseat : mWorkspace.getScreenWithId(screenId); } @Override @@ -2281,7 +2267,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } writer.println(prefix + " Hotseat"); - ViewGroup layout = mHotseat.getLayout().getShortcutsAndWidgets(); + ViewGroup layout = mHotseat.getShortcutsAndWidgets(); for (int j = 0; j < layout.getChildCount(); j++) { Object tag = layout.getChildAt(j).getTag(); if (tag != null) { diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 3f7d68d12f..7a8d984d74 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -85,8 +85,8 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.IntArray; -import com.android.launcher3.util.IntSparseArrayMap; import com.android.launcher3.util.IntSet; +import com.android.launcher3.util.IntSparseArrayMap; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.Thunk; @@ -880,7 +880,7 @@ public class Workspace extends PagedView final CellLayout layout; if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - layout = mLauncher.getHotseat().getLayout(); + layout = mLauncher.getHotseat(); // Hide folder title in the hotseat if (child instanceof FolderIcon) { @@ -1517,7 +1517,7 @@ public class Workspace extends PagedView @Override protected void enableAccessibleDrag(boolean enable) { super.enableAccessibleDrag(enable); - setEnableForLayout(mLauncher.getHotseat().getLayout(),enable); + setEnableForLayout(mLauncher.getHotseat(),enable); } }); } @@ -1625,11 +1625,7 @@ public class Workspace extends PagedView mDragViewVisualCenter = d.getVisualCenter(mDragViewVisualCenter); // We want the point to be mapped to the dragTarget. - if (mLauncher.isHotseatLayout(dropTargetLayout)) { - mapPointFromSelfToHotseatLayout(mLauncher.getHotseat(), mDragViewVisualCenter); - } else { - mapPointFromSelfToChild(dropTargetLayout, mDragViewVisualCenter); - } + mapPointFromDropLayout(mLauncher.getHotseat(), mDragViewVisualCenter); int spanX; int spanY; @@ -1831,11 +1827,7 @@ public class Workspace extends PagedView // We want the point to be mapped to the dragTarget. if (dropTargetLayout != null) { - if (mLauncher.isHotseatLayout(dropTargetLayout)) { - mapPointFromSelfToHotseatLayout(mLauncher.getHotseat(), mDragViewVisualCenter); - } else { - mapPointFromSelfToChild(dropTargetLayout, mDragViewVisualCenter); - } + mapPointFromDropLayout(mLauncher.getHotseat(), mDragViewVisualCenter); } boolean droppedOnOriginalCell = false; @@ -2195,7 +2187,7 @@ public class Workspace extends PagedView * Convert the 2D coordinate xy from the parent View's coordinate space to this CellLayout's * coordinate space. The argument xy is modified with the return result. */ - void mapPointFromSelfToChild(View v, float[] xy) { + private void mapPointFromSelfToChild(View v, float[] xy) { xy[0] = xy[0] - v.getLeft(); xy[1] = xy[1] - v.getTop(); } @@ -2211,14 +2203,23 @@ public class Workspace extends PagedView mTempXY[1] <= hotseat.getBottom(); } - void mapPointFromSelfToHotseatLayout(Hotseat hotseat, float[] xy) { - mTempXY[0] = (int) xy[0]; - mTempXY[1] = (int) xy[1]; - mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(this, mTempXY, true); - mLauncher.getDragLayer().mapCoordInSelfToDescendant(hotseat.getLayout(), mTempXY); + /** + * Updates the point in {@param xy} to point to the co-ordinate space of {@param layout} + * @param layout either hotseat of a page in workspace + * @param xy the point location in workspace co-ordinate space + */ + private void mapPointFromDropLayout(CellLayout layout, float[] xy) { + if (mLauncher.isHotseatLayout(layout)) { + mTempXY[0] = (int) xy[0]; + mTempXY[1] = (int) xy[1]; + mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(this, mTempXY, true); + mLauncher.getDragLayer().mapCoordInSelfToDescendant(layout, mTempXY); - xy[0] = mTempXY[0]; - xy[1] = mTempXY[1]; + xy[0] = mTempXY[0]; + xy[1] = mTempXY[1]; + } else { + mapPointFromSelfToChild(layout, xy); + } } private boolean isDragWidget(DragObject d) { @@ -2254,11 +2255,7 @@ public class Workspace extends PagedView // Handle the drag over if (mDragTargetLayout != null) { // We want the point to be mapped to the dragTarget. - if (mLauncher.isHotseatLayout(mDragTargetLayout)) { - mapPointFromSelfToHotseatLayout(mLauncher.getHotseat(), mDragViewVisualCenter); - } else { - mapPointFromSelfToChild(mDragTargetLayout, mDragViewVisualCenter); - } + mapPointFromDropLayout(mLauncher.getHotseat(), mDragViewVisualCenter); int minSpanX = item.spanX; int minSpanY = item.spanY; @@ -2329,7 +2326,7 @@ public class Workspace extends PagedView // Test to see if we are over the hotseat first if (mLauncher.getHotseat() != null && !isDragWidget(d)) { if (isPointInSelfOverHotseat(d.x, d.y)) { - layout = mLauncher.getHotseat().getLayout(); + layout = mLauncher.getHotseat(); } } @@ -2967,8 +2964,7 @@ public class Workspace extends PagedView * Returns a specific CellLayout */ CellLayout getParentCellLayoutForView(View v) { - ArrayList layouts = getWorkspaceAndHotseatCellLayouts(); - for (CellLayout layout : layouts) { + for (CellLayout layout : getWorkspaceAndHotseatCellLayouts()) { if (layout.getShortcutsAndWidgets().indexOfChild(v) > -1) { return layout; } @@ -2977,56 +2973,31 @@ public class Workspace extends PagedView } /** - * Returns a list of all the CellLayouts in the workspace. + * Returns a list of all the CellLayouts on the Homescreen. */ - ArrayList getWorkspaceAndHotseatCellLayouts() { - ArrayList layouts = new ArrayList<>(); + private CellLayout[] getWorkspaceAndHotseatCellLayouts() { int screenCount = getChildCount(); - for (int screen = 0; screen < screenCount; screen++) { - layouts.add(((CellLayout) getChildAt(screen))); - } + final CellLayout[] layouts; if (mLauncher.getHotseat() != null) { - layouts.add(mLauncher.getHotseat().getLayout()); + layouts = new CellLayout[screenCount + 1]; + layouts[screenCount] = mLauncher.getHotseat(); + } else { + layouts = new CellLayout[screenCount]; + } + for (int screen = 0; screen < screenCount; screen++) { + layouts[screen] = (CellLayout) getChildAt(screen); } return layouts; } - /** - * We should only use this to search for specific children. Do not use this method to modify - * ShortcutsAndWidgetsContainer directly. Includes ShortcutAndWidgetContainers from - * the hotseat and workspace pages - */ - ArrayList getAllShortcutAndWidgetContainers() { - ArrayList childrenLayouts = new ArrayList<>(); - int screenCount = getChildCount(); - for (int screen = 0; screen < screenCount; screen++) { - childrenLayouts.add(((CellLayout) getChildAt(screen)).getShortcutsAndWidgets()); - } - if (mLauncher.getHotseat() != null) { - childrenLayouts.add(mLauncher.getHotseat().getLayout().getShortcutsAndWidgets()); - } - return childrenLayouts; - } - public View getHomescreenIconByItemId(final int id) { - return getFirstMatch(new ItemOperator() { - - @Override - public boolean evaluate(ItemInfo info, View v) { - return info != null && info.id == id; - } - }); + return getFirstMatch((info, v) -> info != null && info.id == id); } public LauncherAppWidgetHostView getWidgetForAppWidgetId(final int appWidgetId) { - return (LauncherAppWidgetHostView) getFirstMatch(new ItemOperator() { - - @Override - public boolean evaluate(ItemInfo info, View v) { - return (info instanceof LauncherAppWidgetInfo) && - ((LauncherAppWidgetInfo) info).appWidgetId == appWidgetId; - } - }); + return (LauncherAppWidgetHostView) getFirstMatch((info, v) -> + (info instanceof LauncherAppWidgetInfo) && + ((LauncherAppWidgetInfo) info).appWidgetId == appWidgetId); } public View getFirstMatch(final ItemOperator operator) { @@ -3063,8 +3034,7 @@ public class Workspace extends PagedView * shortcuts are not removed. */ public void removeItemsByMatcher(final ItemInfoMatcher matcher) { - ArrayList cellLayouts = getWorkspaceAndHotseatCellLayouts(); - for (final CellLayout layoutParent: cellLayouts) { + for (final CellLayout layoutParent: getWorkspaceAndHotseatCellLayouts()) { final ViewGroup layout = layoutParent.getShortcutsAndWidgets(); IntSparseArrayMap idToViewMap = new IntSparseArrayMap<>(); @@ -3122,10 +3092,8 @@ public class Workspace extends PagedView * @param op the operator to map over the shortcuts */ public void mapOverItems(boolean recurse, ItemOperator op) { - ArrayList containers = getAllShortcutAndWidgetContainers(); - final int containerCount = containers.size(); - for (int containerIdx = 0; containerIdx < containerCount; containerIdx++) { - ShortcutAndWidgetContainer container = containers.get(containerIdx); + for (CellLayout layout : getWorkspaceAndHotseatCellLayouts()) { + ShortcutAndWidgetContainer container = layout.getShortcutsAndWidgets(); // map over all the shortcuts on the workspace final int itemCount = container.getChildCount(); for (int itemIdx = 0; itemIdx < itemCount; itemIdx++) { diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index e734e70533..3e094935d9 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -88,7 +88,7 @@ public class WorkspaceStateTransitionAnimation { Interpolator scaleInterpolator = builder.getInterpolator(ANIM_WORKSPACE_SCALE, ZOOM_OUT); propertySetter.setFloat(mWorkspace, SCALE_PROPERTY, mNewScale, scaleInterpolator); float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0; - propertySetter.setViewAlpha(mLauncher.getHotseat().getLayout(), hotseatIconsAlpha, + propertySetter.setViewAlpha(mLauncher.getHotseat(), hotseatIconsAlpha, fadeInterpolator); propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(), hotseatIconsAlpha, fadeInterpolator); @@ -105,9 +105,6 @@ public class WorkspaceStateTransitionAnimation { propertySetter.setFloat(mWorkspace, View.TRANSLATION_Y, scaleAndTranslation[2], translationInterpolator); - propertySetter.setViewAlpha(mLauncher.getHotseatSearchBox(), - (elements & HOTSEAT_SEARCH_BOX) != 0 ? 1 : 0, fadeInterpolator); - // Set scrim WorkspaceAndHotseatScrim scrim = mLauncher.getDragLayer().getScrim(); propertySetter.setFloat(scrim, SCRIM_PROGRESS, state.getWorkspaceScrimAlpha(mLauncher), diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index e7313e8411..2d6be7b08c 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -91,11 +91,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil return mShiftRange; } - private void onProgressAnimationStart() { - // Initialize values that should not change until #onDragEnd - mAppsView.setVisibility(View.VISIBLE); - } - @Override public void onDeviceProfileChanged(DeviceProfile dp) { mIsVerticalLayout = dp.isVerticalBarLayout(); @@ -195,16 +190,15 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil PropertySetter setter = config == null ? NO_ANIM_PROPERTY_SETTER : config.getPropertySetter(builder); int visibleElements = toState.getVisibleElements(mLauncher); - boolean hasHeader = (visibleElements & ALL_APPS_HEADER) != 0; boolean hasHeaderExtra = (visibleElements & ALL_APPS_HEADER_EXTRA) != 0; boolean hasContent = (visibleElements & ALL_APPS_CONTENT) != 0; Interpolator allAppsFade = builder.getInterpolator(ANIM_ALL_APPS_FADE, LINEAR); - setter.setViewAlpha(mAppsView.getSearchView(), hasHeader ? 1 : 0, allAppsFade); setter.setViewAlpha(mAppsView.getContentView(), hasContent ? 1 : 0, allAppsFade); setter.setViewAlpha(mAppsView.getScrollBar(), hasContent ? 1 : 0, allAppsFade); mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra, hasContent, setter, allAppsFade); + mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade); setter.setInt(mScrimView, ScrimView.DRAG_HANDLE_ALPHA, (visibleElements & VERTICAL_SWIPE_INDICATOR) != 0 ? 255 : 0, LINEAR); @@ -216,11 +210,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil public void onAnimationSuccess(Animator animator) { onProgressAnimationEnd(); } - - @Override - public void onAnimationStart(Animator animation) { - onProgressAnimationStart(); - } }; } @@ -247,13 +236,9 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil */ private void onProgressAnimationEnd() { if (Float.compare(mProgress, 1f) == 0) { - mAppsView.setVisibility(View.INVISIBLE); mAppsView.reset(false /* animate */); } else if (isAllAppsExpanded()) { - mAppsView.setVisibility(View.VISIBLE); mAppsView.onScrollUpEnd(); - } else { - mAppsView.setVisibility(View.VISIBLE); } } diff --git a/src/com/android/launcher3/allapps/SearchUiManager.java b/src/com/android/launcher3/allapps/SearchUiManager.java index 68193f5c1c..51b90f71eb 100644 --- a/src/com/android/launcher3/allapps/SearchUiManager.java +++ b/src/com/android/launcher3/allapps/SearchUiManager.java @@ -16,6 +16,9 @@ package com.android.launcher3.allapps; import android.view.KeyEvent; +import android.view.animation.Interpolator; + +import com.android.launcher3.anim.PropertySetter; /** * Interface for controlling the Apps search UI. @@ -37,4 +40,10 @@ public interface SearchUiManager { * some UI beforehand. */ void preDispatchKeyEvent(KeyEvent keyEvent); + + /** + * Called as part of state transition to update the content UI + */ + void setContentVisibility(int visibleElements, PropertySetter setter, + Interpolator interpolator); } diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index 15cc2caae6..b1e23d4e22 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -19,6 +19,7 @@ import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.getSize; import static android.view.View.MeasureSpec.makeMeasureSpec; +import static com.android.launcher3.LauncherState.ALL_APPS_HEADER; import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR; import android.content.Context; @@ -32,6 +33,7 @@ import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; +import android.view.animation.Interpolator; import com.android.launcher3.DeviceProfile; import com.android.launcher3.ExtendedEditText; @@ -42,6 +44,7 @@ import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsStore; import com.android.launcher3.allapps.AlphabeticalAppsList; import com.android.launcher3.allapps.SearchUiManager; +import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.graphics.TintedDrawableSpan; import com.android.launcher3.util.ComponentKey; @@ -214,4 +217,10 @@ public class AppsSearchContainerLayout extends ExtendedEditText insets.bottom + mlp.topMargin + mFixedTranslationY); } } + + @Override + public void setContentVisibility(int visibleElements, PropertySetter setter, + Interpolator interpolator) { + setter.setViewAlpha(this, (visibleElements & ALL_APPS_HEADER) != 0 ? 1 : 0, interpolator); + } } diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index 6c98d16b42..23d647b441 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -167,7 +167,7 @@ public class WorkspaceAndHotseatScrim implements mWorkspace.computeScrollWithoutInvalidation(); CellLayout currCellLayout = mWorkspace.getCurrentDragOverlappingLayout(); canvas.save(); - if (currCellLayout != null && currCellLayout != mLauncher.getHotseat().getLayout()) { + if (currCellLayout != null && currCellLayout != mLauncher.getHotseat()) { // Cut a hole in the darkening scrim on the page that should be highlighted, if any. mLauncher.getDragLayer() .getDescendantRectRelativeToSelf(currCellLayout, mHighlightRect); From dad8d4434d3fad9856ad607848872d87e642e997 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 5 Nov 2018 15:09:09 -0800 Subject: [PATCH 11/20] Remove scrim fade animation when returning to launcher. Since the DragLayer translates downwards, we no longer need the scrim fade animation to avoid the hard scrim line. Bug: 117677608 Change-Id: I4cd524d798579289d61bfe296f6de42bd22b0cb7 --- .../launcher3/LauncherAppTransitionManagerImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index d7bbfe06e1..9e85469363 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -420,7 +420,10 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mLauncher.getWorkspace().getPageIndicator().pauseAnimations(); mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null); - endListener = this::resetContentView; + endListener = () -> { + resetContentView(); + mDragLayer.getScrim().hideSysUiScrim(false); + }; } return new Pair<>(launcherAnimator, endListener); } @@ -794,8 +797,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag workspaceAnimator.setDuration(333); workspaceAnimator.setInterpolator(Interpolators.DEACCEL_1_7); - mDragLayer.getScrim().hideSysUiScrim(true); - // Pause page indicator animations as they lead to layer trashing. mLauncher.getWorkspace().getPageIndicator().pauseAnimations(); mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null); @@ -815,7 +816,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mDragLayerAlpha.setValue(1f); mDragLayer.setLayerType(View.LAYER_TYPE_NONE, null); mDragLayer.setTranslationY(0f); - mDragLayer.getScrim().hideSysUiScrim(false); } private boolean hasControlRemoteAppTransitionPermission() { From 1baf8a78c67b8bc01fb1064f758bda5c4b66ccc6 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 5 Nov 2018 14:26:26 -0800 Subject: [PATCH 12/20] Create a launcher LoaderResults override. This change disables shortcuts/widgets binding on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I3dbcd23dc448ff9ca5fe6c32958dcffb51c4bcf5 --- .../launcher3/model/LoaderResults.java | 42 ++++++++++ ...derResults.java => BaseLoaderResults.java} | 81 +++++++------------ .../launcher3/model/LoaderResults.java | 67 +++++++++++++++ 3 files changed, 137 insertions(+), 53 deletions(-) create mode 100644 go/src/com/android/launcher3/model/LoaderResults.java rename src/com/android/launcher3/model/{LoaderResults.java => BaseLoaderResults.java} (85%) create mode 100644 src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java diff --git a/go/src/com/android/launcher3/model/LoaderResults.java b/go/src/com/android/launcher3/model/LoaderResults.java new file mode 100644 index 0000000000..b82f362496 --- /dev/null +++ b/go/src/com/android/launcher3/model/LoaderResults.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2018 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.model; + +import com.android.launcher3.AllAppsList; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel.Callbacks; + +import java.lang.ref.WeakReference; + +/** + * Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. + */ +public class LoaderResults extends BaseLoaderResults { + + public LoaderResults(LauncherAppState app, BgDataModel dataModel, + AllAppsList allAppsList, int pageToBindFirst, WeakReference callbacks) { + super(app, dataModel, allAppsList, pageToBindFirst, callbacks); + } + + @Override + public void bindDeepShortcuts() { + } + + @Override + public void bindWidgets() { + } +} diff --git a/src/com/android/launcher3/model/LoaderResults.java b/src/com/android/launcher3/model/BaseLoaderResults.java similarity index 85% rename from src/com/android/launcher3/model/LoaderResults.java rename to src/com/android/launcher3/model/BaseLoaderResults.java index 1d18e7667b..d3dc91f3be 100644 --- a/src/com/android/launcher3/model/LoaderResults.java +++ b/src/com/android/launcher3/model/BaseLoaderResults.java @@ -30,47 +30,44 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.PagedView; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.LooperIdleLock; import com.android.launcher3.util.ViewOnDrawExecutor; -import com.android.launcher3.widget.WidgetListRowEntry; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.Iterator; import java.util.concurrent.Executor; /** - * Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. + * Base Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. */ -public class LoaderResults { +public abstract class BaseLoaderResults { - private static final String TAG = "LoaderResults"; - private static final int INVALID_SCREEN_ID = -1; + protected static final String TAG = "LoaderResults"; + protected static final int INVALID_SCREEN_ID = -1; private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons - private final Executor mUiExecutor; + protected final Executor mUiExecutor; - private final LauncherAppState mApp; - private final BgDataModel mBgDataModel; + protected final LauncherAppState mApp; + protected final BgDataModel mBgDataModel; private final AllAppsList mBgAllAppsList; - private final int mPageToBindFirst; + protected final int mPageToBindFirst; - private final WeakReference mCallbacks; + protected final WeakReference mCallbacks; - public LoaderResults(LauncherAppState app, BgDataModel dataModel, + public BaseLoaderResults(LauncherAppState app, BgDataModel dataModel, AllAppsList allAppsList, int pageToBindFirst, WeakReference callbacks) { mUiExecutor = new MainThreadExecutor(); mApp = app; mBgDataModel = dataModel; mBgAllAppsList = allAppsList; mPageToBindFirst = pageToBindFirst; - mCallbacks = callbacks == null ? new WeakReference(null) : callbacks; + mCallbacks = callbacks == null ? new WeakReference<>(null) : callbacks; } /** @@ -152,8 +149,8 @@ public class LoaderResults { Executor mainExecutor = mUiExecutor; // Load items on the current page. - bindWorkspaceItems(currentWorkspaceItems, currentAppWidgets, mainExecutor); - + bindWorkspaceItems(currentWorkspaceItems, mainExecutor); + bindAppWidgets(currentAppWidgets, mainExecutor); // In case of validFirstPage, only bind the first screen, and defer binding the // remaining screens after first onDraw (and an optional the fade animation whichever // happens later). @@ -173,8 +170,8 @@ public class LoaderResults { } }); - bindWorkspaceItems(otherWorkspaceItems, otherAppWidgets, deferredExecutor); - + bindWorkspaceItems(otherWorkspaceItems, deferredExecutor); + bindAppWidgets(otherAppWidgets, deferredExecutor); // Tell the workspace that we're done binding items r = new Runnable() { public void run() { @@ -252,7 +249,7 @@ public class LoaderResults { /** Sorts the set of items by hotseat, workspace (spatially from top to bottom, left to * right) */ - private void sortWorkspaceItemsSpatially(ArrayList workspaceItems) { + protected void sortWorkspaceItemsSpatially(ArrayList workspaceItems) { final InvariantDeviceProfile profile = mApp.getInvariantDeviceProfile(); final int screenCols = profile.numColumns; final int screenCellCount = profile.numColumns * profile.numRows; @@ -288,14 +285,12 @@ public class LoaderResults { }); } - private void bindWorkspaceItems(final ArrayList workspaceItems, - final ArrayList appWidgets, + protected void bindWorkspaceItems(final ArrayList workspaceItems, final Executor executor) { if (com.android.launcher3.Utilities.IS_RUNNING_IN_TEST_HARNESS && com.android.launcher3.Utilities.IS_DEBUG_DEVICE) { - android.util.Log.d("b/117332845", - android.util.Log.getStackTraceString(new Throwable())); + Log.d("b/117332845", Log.getStackTraceString(new Throwable())); } // Bind the workspace items int N = workspaceItems.size(); @@ -307,22 +302,25 @@ public class LoaderResults { public void run() { Callbacks callbacks = mCallbacks.get(); if (callbacks != null) { - callbacks.bindItems(workspaceItems.subList(start, start+chunkSize), false); + callbacks.bindItems(workspaceItems.subList(start, start + chunkSize), + false); } } }; executor.execute(r); } + } - // Bind the widgets, one at a time + private void bindAppWidgets(ArrayList appWidgets, Executor executor) { + int N;// Bind the widgets, one at a time N = appWidgets.size(); for (int i = 0; i < N; i++) { final ItemInfo widget = appWidgets.get(i); final Runnable r = new Runnable() { public void run() { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindItems(Collections.singletonList(widget), false); + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindItems(Collections.singletonList(widget), false); } } }; @@ -330,18 +328,7 @@ public class LoaderResults { } } - public void bindDeepShortcuts() { - final HashMap shortcutMapCopy; - synchronized (mBgDataModel) { - shortcutMapCopy = new HashMap<>(mBgDataModel.deepShortcutMap); - } - mUiExecutor.execute(() -> { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindDeepShortcutMap(shortcutMapCopy); - } - }); - } + public abstract void bindDeepShortcuts(); public void bindAllApps() { // shallow copy @@ -359,19 +346,7 @@ public class LoaderResults { mUiExecutor.execute(r); } - public void bindWidgets() { - final ArrayList widgets = - mBgDataModel.widgetsModel.getWidgetsList(mApp.getContext()); - Runnable r = new Runnable() { - public void run() { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindAllWidgets(widgets); - } - } - }; - mUiExecutor.execute(r); - } + public abstract void bindWidgets(); public LooperIdleLock newIdleLock(Object lock) { LooperIdleLock idleLock = new LooperIdleLock(lock, Looper.getMainLooper()); diff --git a/src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java b/src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java new file mode 100644 index 0000000000..9785887ac7 --- /dev/null +++ b/src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2017 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.model; + +import com.android.launcher3.AllAppsList; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel.Callbacks; +import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.widget.WidgetListRowEntry; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. + */ +public class LoaderResults extends BaseLoaderResults { + + public LoaderResults(LauncherAppState app, BgDataModel dataModel, + AllAppsList allAppsList, int pageToBindFirst, WeakReference callbacks) { + super(app, dataModel, allAppsList, pageToBindFirst, callbacks); + } + + @Override + public void bindDeepShortcuts() { + final HashMap shortcutMapCopy; + synchronized (mBgDataModel) { + shortcutMapCopy = new HashMap<>(mBgDataModel.deepShortcutMap); + } + mUiExecutor.execute(() -> { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindDeepShortcutMap(shortcutMapCopy); + } + }); + } + + @Override + public void bindWidgets() { + final ArrayList widgets = + mBgDataModel.widgetsModel.getWidgetsList(mApp.getContext()); + Runnable r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindAllWidgets(widgets); + } + } + }; + mUiExecutor.execute(r); + } +} From 0ae3888ad1b50e1331f2785fad419288e40e7fda Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 5 Nov 2018 14:45:19 -0800 Subject: [PATCH 13/20] Split out launcherProtos from sysui_shared.jar Bug: 113043444 Change-Id: I3115cdc7871b0f77601e399df01cdde0dde87c6e --- Android.mk | 16 ++++++++++++---- libs/README.txt | 8 ++++++++ libs/launcher_protos.jar | Bin 0 -> 57919 bytes quickstep/libs/sysui_shared.jar | Bin 200647 -> 142726 bytes src/com/android/launcher3/Launcher.java | 2 +- 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 libs/README.txt create mode 100644 libs/launcher_protos.jar diff --git a/Android.mk b/Android.mk index fbe19b0b63..ca1bfdeb56 100644 --- a/Android.mk +++ b/Android.mk @@ -37,6 +37,14 @@ LOCAL_UNINSTALLABLE_MODULE := true LOCAL_SDK_VERSION := current include $(BUILD_PREBUILT) +include $(CLEAR_VARS) +LOCAL_MODULE := libLauncherProtos +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_SRC_FILES := libs/launcher_protos.jar +LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_SDK_VERSION := current +include $(BUILD_PREBUILT) # # Build rule for plugin lib (needed to write a plugin). # @@ -160,10 +168,10 @@ LOCAL_AAPT2_ONLY := true LOCAL_MODULE_TAGS := optional ifneq (,$(wildcard frameworks/base)) - LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib + LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib launcherprotosnano LOCAL_PRIVATE_PLATFORM_APIS := true else - LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI + LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI libLauncherProtos LOCAL_SDK_VERSION := system_current LOCAL_MIN_SDK_VERSION := 26 endif @@ -223,10 +231,10 @@ LOCAL_USE_AAPT2 := true LOCAL_MODULE_TAGS := optional ifneq (,$(wildcard frameworks/base)) - LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib + LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib launcherprotosnano LOCAL_PRIVATE_PLATFORM_APIS := true else - LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI + LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI libLauncherProtos LOCAL_SDK_VERSION := system_current LOCAL_MIN_SDK_VERSION := 26 endif diff --git a/libs/README.txt b/libs/README.txt new file mode 100644 index 0000000000..9109592561 --- /dev/null +++ b/libs/README.txt @@ -0,0 +1,8 @@ +These jar are compiled in the frameworks/base of the platform tree. + +launcher_protos.jar is defined as launcherprotosnano in the following file: +frameworks/base/core/protos/android/stats/launcher/Android.bp + +plugin_core.jar is defined as PluginCoreLib in the following file: +frameworks/base/packages/SystemUI/plugin/Android.bp + diff --git a/libs/launcher_protos.jar b/libs/launcher_protos.jar new file mode 100644 index 0000000000000000000000000000000000000000..c0439363b867208522d54d8b4e54c3c822e98f3b GIT binary patch literal 57919 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 HQ2zQKjPHyY literal 0 HcmV?d00001 diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 163524e179cad2fcd61593bf6ad85ea896dcc030..a1b3476a6400f27016950d6bd873232e124fe62a 100644 GIT binary patch delta 2172 zcmYk6dsNL?6vsRJSGm1zPqzn6Su0(=A4r9igfU3dc+`x?Fb}U0i?N19iotkIjUVRh8u*Gr?)(!%}r7!_*s@_Equ#^{hTJge;c(D}RA<6okySEhL;GT^UOb0(ZqwS1U z_aF?es^#lG@8LQf49A@Nw5Ki(w5Y#NjYrv&9fh|msOc#WsOeM(0)evH*Aep`P;X_9 zip~gekaM+;BG9*t0=H`h92$9Mpo?&v;*Mf>?!fjkm<6APn1TWltZ`pCRs24DfZ5}X z3ecdcf|45JlGjH}G1*Fa35Y?45qR=H8 zJok|5&!1(4AAvSe$-2GLMsEE~BTC<@q)heP0f!c2swgRafs&M01!Ev`qq2eiDi{l& zY?kXV9GCw~gDg&0>^s~}*-myMCRS7KcRLk+wi?F4vE5{cp=%A@nUpNKu5c8ttASB) zl zm~p{qJK?fAS}FR95zzQJn0po1{Re@lt*2Uf17ce}%mmd9;UQs-N9$?+?hQ1LAMbD+ zD$i+f!A%X66rnQ$3#@E_(O`I>0Gvc&5LVB{a`>`|f9V7oAsWJ;nuHbZYJ^xg)nXzl zlpayy)ecUAaOoqu=65==z?Oxg{t+$c-o-@>MmLej?Gc_MO%MZFZ-toV#O!hCV{#`m zjC%}oAy@eZU~Drz+UmzN&s1~nQAjd8vlODJ8Ir--X2A0Vl0a)O#I+|75ABXZ1V1H_ z6i(wLl^icw%NdZ9&&U>zx_F#RNI3Z@YlUN+h#aECpk$=adR}Qlj zcRKDlo#ByWj)U-n6>KQxKc`+o=9!2cYI^Cghjmb(Q!2;4Sd_+G@t2qMn!e?@{A0es zk@!~!Oor!+gb02?b9lW(h%=j*I~HwZDqh|JZ@-|dzGWt#7q)d0j(SNr{R@Hfw=p-2 z-$H+AA%EytVZ!13zo7-*tpFRG_=-}dt}^-D&?b{PW6&!qcZvIQSDSpUxM;g^-`Y;{ zE!`k|_IuedEb5{Znd5yM1&-X$Ja}VtG~Wm^sf&&?ezOqmS$t1jp|6Luqe16nNap|QT$ zBgC^prp7t1A(q8rW)~$L&!_czIej;k#@Cddoy{}8h7&UX#^ajPw0ULxC2z>BJHl}s z2EV1(wLXW7F&J`=8cbu7173bhG5tpczH**9i6aW^B^;Y4@RnYBi;V?b_@beg-fhhZ zlThQlKB|1}XR*<;4Na0}F#KlTD_mqDF(9KfPxL8=4(a#S0ZHh26+tbNN{SRkYNfQ77 delta 59251 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

&IR-SIs&1H^&&?7;ICTQk@T{E7LbCgp`To^J|R_ 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 F_kTD6Sm6Kw diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3a38c0fbc8..285962d301 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1617,7 +1617,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } else if (mStateManager.getState() == LauncherState.OVERVIEW) { return StatsLogUtils.LAUNCHER_STATE_OVERVIEW; } - return StatsLogUtils.LAUNCHER_STATE_BACKGROUND; + return StatsLogUtils.LAUNCHER_STATE_HOME; } @Override From 678f47c0c962ab66503c21628301b0b93b6fe889 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 17:05:35 -0800 Subject: [PATCH 14/20] Removing some launcher cross dependency in BaseIconCache so that it can eventually be moved to icon library Change-Id: I65e3ad34322a10695c1ba114f5e60c4418747f05 --- .../launcher3/icons/BaseIconCache.java | 45 +++----------- .../android/launcher3/icons/CachingLogic.java | 60 +------------------ .../launcher3/icons/ComponentWithLabel.java | 33 ++++++++++ .../android/launcher3/icons/IconCache.java | 54 ++++++++++++++--- .../icons/LauncherActivtiyCachingLogic.java | 54 +++++++++++++++++ .../android/launcher3/model/LoaderTask.java | 9 +-- 6 files changed, 146 insertions(+), 109 deletions(-) create mode 100644 src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 2afe7139fd..52233ef0da 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -22,7 +22,6 @@ import android.content.ContentValues; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; -import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -33,6 +32,7 @@ import android.database.sqlite.SQLiteException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Build.VERSION; import android.os.Handler; import android.os.Process; @@ -41,15 +41,11 @@ import android.text.TextUtils; import android.util.Log; import com.android.launcher3.IconProvider; -import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.LauncherFiles; import com.android.launcher3.LauncherModel; -import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.graphics.BitmapRenderer; -import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.InstantAppResolver; import com.android.launcher3.util.Preconditions; @@ -80,12 +76,10 @@ public class BaseIconCache { private final HashMap mDefaultIcons = new HashMap<>(); - final MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); final Context mContext; final PackageManager mPackageManager; final IconProvider mIconProvider; final UserManagerCompat mUserManager; - final LauncherAppsCompat mLauncherApps; private final HashMap mCache = new HashMap<>(INITIAL_ICON_CACHE_CAPACITY); @@ -101,13 +95,12 @@ public class BaseIconCache { mContext = context; mPackageManager = context.getPackageManager(); mUserManager = UserManagerCompat.getInstance(mContext); - mLauncherApps = LauncherAppsCompat.getInstance(mContext); mInstantAppResolver = InstantAppResolver.newInstance(mContext); mIconProvider = IconProvider.newInstance(context); mWorkerHandler = new Handler(LauncherModel.getWorkerLooper()); - if (BitmapRenderer.USE_HARDWARE_BITMAP) { + if (BitmapRenderer.USE_HARDWARE_BITMAP && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mDecodeOptions = new BitmapFactory.Options(); mDecodeOptions.inPreferredConfig = Bitmap.Config.HARDWARE; } else { @@ -161,14 +154,6 @@ public class BaseIconCache { return getFullResDefaultActivityIcon(); } - public Drawable getFullResIcon(LauncherActivityInfo info) { - return getFullResIcon(info, true); - } - - public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) { - return mIconProvider.getIcon(info, mIconDpi, flattenDrawable); - } - protected BitmapInfo makeDefaultIcon(UserHandle user) { try (LauncherIcons li = LauncherIcons.obtain(mContext)) { return li.createBadgedIconBitmap( @@ -238,9 +223,9 @@ public class BaseIconCache { } if (entry == null) { entry = new CacheEntry(); - cachingLogic.loadIcon(mContext, this, object, entry); + cachingLogic.loadIcon(mContext, object, entry); } - entry.title = cachingLogic.getLabel(object, mPackageManager); + entry.title = cachingLogic.getLabel(object); entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); mCache.put(key, entry); @@ -262,22 +247,6 @@ public class BaseIconCache { mIconDb.insertOrReplace(values); } - /** - * Fill in {@param infoInOut} with the corresponding icon and label. - */ - public synchronized void getTitleAndIconForApp( - PackageItemInfo infoInOut, boolean useLowResIcon) { - CacheEntry entry = getEntryForPackageLocked( - infoInOut.packageName, infoInOut.user, useLowResIcon); - applyCacheEntry(entry, infoInOut); - } - - protected void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) { - info.title = Utilities.trim(entry.title); - info.contentDescription = entry.contentDescription; - info.applyFrom((entry.icon == null) ? getDefaultIcon(info.user) : entry); - } - public synchronized BitmapInfo getDefaultIcon(UserHandle user) { if (!mDefaultIcons.containsKey(user)) { mDefaultIcons.put(user, makeDefaultIcon(user)); @@ -323,7 +292,7 @@ public class BaseIconCache { providerFetchedOnce = true; if (object != null) { - cachingLogic.loadIcon(mContext, this, object, entry); + cachingLogic.loadIcon(mContext, object, entry); } else { if (usePackageIcon) { CacheEntry packageEntry = getEntryForPackageLocked( @@ -350,7 +319,7 @@ public class BaseIconCache { providerFetchedOnce = true; } if (object != null) { - entry.title = cachingLogic.getLabel(object, mPackageManager); + entry.title = cachingLogic.getLabel(object); entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); } } @@ -400,7 +369,7 @@ public class BaseIconCache { * Gets an entry for the package, which can be used as a fallback entry for various components. * This method is not thread safe, it must be called from a synchronized method. */ - private CacheEntry getEntryForPackageLocked(String packageName, UserHandle user, + protected CacheEntry getEntryForPackageLocked(String packageName, UserHandle user, boolean useLowResIcon) { Preconditions.assertWorkerThread(); ComponentKey cacheKey = getPackageKey(packageName, user); diff --git a/src/com/android/launcher3/icons/CachingLogic.java b/src/com/android/launcher3/icons/CachingLogic.java index 24186ef990..0a3da04d78 100644 --- a/src/com/android/launcher3/icons/CachingLogic.java +++ b/src/com/android/launcher3/icons/CachingLogic.java @@ -17,8 +17,6 @@ package com.android.launcher3.icons; import android.content.ComponentName; import android.content.Context; -import android.content.pm.LauncherActivityInfo; -import android.content.pm.PackageManager; import android.os.UserHandle; public interface CachingLogic { @@ -27,61 +25,7 @@ public interface CachingLogic { UserHandle getUser(T object); - CharSequence getLabel(T object, PackageManager pm); + CharSequence getLabel(T object); - void loadIcon(Context context, BaseIconCache cache, T object, BitmapInfo target); - - CachingLogic LAUNCHER_ACTIVITY_INFO = - new CachingLogic() { - - @Override - public ComponentName getComponent(LauncherActivityInfo object) { - return object.getComponentName(); - } - - @Override - public UserHandle getUser(LauncherActivityInfo object) { - return object.getUser(); - } - - @Override - public CharSequence getLabel(LauncherActivityInfo object, PackageManager pm) { - return object.getLabel(); - } - - @Override - public void loadIcon(Context context, BaseIconCache cache, LauncherActivityInfo object, - BitmapInfo target) { - LauncherIcons li = LauncherIcons.obtain(context); - li.createBadgedIconBitmap(cache.getFullResIcon(object), object.getUser(), - object.getApplicationInfo().targetSdkVersion).applyTo(target); - li.recycle(); - } - }; - - CachingLogic COMPONENT_WITH_LABEL = - new CachingLogic() { - - @Override - public ComponentName getComponent(ComponentWithLabel object) { - return object.getComponent(); - } - - @Override - public UserHandle getUser(ComponentWithLabel object) { - return object.getUser(); - } - - @Override - public CharSequence getLabel(ComponentWithLabel object, PackageManager pm) { - return object.getLabel(pm); - } - - @Override - public void loadIcon(Context context, BaseIconCache cache, - ComponentWithLabel object, BitmapInfo target) { - // Do not load icon. - target.icon = BitmapInfo.LOW_RES_ICON; - } - }; + void loadIcon(Context context, T object, BitmapInfo target); } diff --git a/src/com/android/launcher3/icons/ComponentWithLabel.java b/src/com/android/launcher3/icons/ComponentWithLabel.java index 2badb4c373..7bb8832eed 100644 --- a/src/com/android/launcher3/icons/ComponentWithLabel.java +++ b/src/com/android/launcher3/icons/ComponentWithLabel.java @@ -16,6 +16,7 @@ package com.android.launcher3.icons; import android.content.ComponentName; +import android.content.Context; import android.content.pm.PackageManager; import android.os.UserHandle; @@ -26,4 +27,36 @@ public interface ComponentWithLabel { UserHandle getUser(); CharSequence getLabel(PackageManager pm); + + + class ComponentCachingLogic implements CachingLogic { + + private final PackageManager mPackageManager; + + public ComponentCachingLogic(Context context) { + mPackageManager = context.getPackageManager(); + } + + @Override + public ComponentName getComponent(ComponentWithLabel object) { + return object.getComponent(); + } + + @Override + public UserHandle getUser(ComponentWithLabel object) { + return object.getUser(); + } + + @Override + public CharSequence getLabel(ComponentWithLabel object) { + return object.getLabel(mPackageManager); + } + + @Override + public void loadIcon(Context context, + ComponentWithLabel object, BitmapInfo target) { + // Do not load icon. + target.icon = BitmapInfo.LOW_RES_ICON; + } + } } diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index 6e2ca28ec6..e10ff5b1b8 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -16,15 +16,13 @@ package com.android.launcher3.icons; -import static com.android.launcher3.icons.CachingLogic.COMPONENT_WITH_LABEL; -import static com.android.launcher3.icons.CachingLogic.LAUNCHER_ACTIVITY_INFO; - import android.content.Context; import android.content.Intent; import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Process; import android.os.UserHandle; @@ -34,8 +32,11 @@ import com.android.launcher3.AppInfo; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.LauncherModel; +import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; +import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; @@ -49,10 +50,21 @@ public class IconCache extends BaseIconCache { private static final String TAG = "Launcher.IconCache"; + private final MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); + + private final CachingLogic mComponentWithLabelCachingLogic; + private final CachingLogic mLauncherActivityInfoCachingLogic; + + private final LauncherAppsCompat mLauncherApps; + private int mPendingIconRequestCount = 0; public IconCache(Context context, InvariantDeviceProfile inv) { super(context, inv.fillResIconDpi, inv.iconBitmapSize); + mComponentWithLabelCachingLogic = new ComponentCachingLogic(context); + mLauncherActivityInfoCachingLogic = new LauncherActivtiyCachingLogic(this); + mLauncherApps = LauncherAppsCompat.getInstance(mContext); + } /** @@ -65,7 +77,7 @@ public class IconCache extends BaseIconCache { PackageManager.GET_UNINSTALLED_PACKAGES); long userSerial = mUserManager.getSerialNumberForUser(user); for (LauncherActivityInfo app : mLauncherApps.getActivityList(packageName, user)) { - addIconToDBAndMemCache(app, LAUNCHER_ACTIVITY_INFO, info, userSerial, + addIconToDBAndMemCache(app, mLauncherActivityInfoCachingLogic, info, userSerial, false /*replace existing*/); } } catch (NameNotFoundException e) { @@ -115,7 +127,7 @@ public class IconCache extends BaseIconCache { */ public synchronized void updateTitleAndIcon(AppInfo application) { CacheEntry entry = cacheLocked(application.componentName, - application.user, Provider.of(null), LAUNCHER_ACTIVITY_INFO, + application.user, Provider.of(null), mLauncherActivityInfoCachingLogic, false, application.usingLowResIcon()); if (entry.icon != null && !isDefaultIcon(entry.icon, application.user)) { applyCacheEntry(entry, application); @@ -151,8 +163,8 @@ public class IconCache extends BaseIconCache { public synchronized String getTitleNoCache(ComponentWithLabel info) { CacheEntry entry = cacheLocked(info.getComponent(), info.getUser(), Provider.of(info), - COMPONENT_WITH_LABEL, false /* usePackageIcon */, true /* useLowResIcon */, - false /* addToMemCache */); + mComponentWithLabelCachingLogic, false /* usePackageIcon */, + true /* useLowResIcon */, false /* addToMemCache */); return Utilities.trim(entry.title); } @@ -164,11 +176,35 @@ public class IconCache extends BaseIconCache { @NonNull Provider activityInfoProvider, boolean usePkgIcon, boolean useLowResIcon) { CacheEntry entry = cacheLocked(infoInOut.getTargetComponent(), infoInOut.user, - activityInfoProvider, - LAUNCHER_ACTIVITY_INFO, usePkgIcon, useLowResIcon); + activityInfoProvider, mLauncherActivityInfoCachingLogic, usePkgIcon, useLowResIcon); applyCacheEntry(entry, infoInOut); } + + /** + * Fill in {@param infoInOut} with the corresponding icon and label. + */ + public synchronized void getTitleAndIconForApp( + PackageItemInfo infoInOut, boolean useLowResIcon) { + CacheEntry entry = getEntryForPackageLocked( + infoInOut.packageName, infoInOut.user, useLowResIcon); + applyCacheEntry(entry, infoInOut); + } + + protected void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) { + info.title = Utilities.trim(entry.title); + info.contentDescription = entry.contentDescription; + info.applyFrom((entry.icon == null) ? getDefaultIcon(info.user) : entry); + } + + public Drawable getFullResIcon(LauncherActivityInfo info) { + return getFullResIcon(info, true); + } + + public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) { + return mIconProvider.getIcon(info, mIconDpi, flattenDrawable); + } + public static abstract class IconLoadRequest extends HandlerRunnable { IconLoadRequest(Handler handler, Runnable endRunnable) { super(handler, endRunnable); diff --git a/src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java b/src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java new file mode 100644 index 0000000000..8c85b1c799 --- /dev/null +++ b/src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 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.icons; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.LauncherActivityInfo; +import android.os.UserHandle; + +public class LauncherActivtiyCachingLogic implements CachingLogic { + + private final IconCache mCache; + + public LauncherActivtiyCachingLogic(IconCache cache) { + mCache = cache; + } + + @Override + public ComponentName getComponent(LauncherActivityInfo object) { + return object.getComponentName(); + } + + @Override + public UserHandle getUser(LauncherActivityInfo object) { + return object.getUser(); + } + + @Override + public CharSequence getLabel(LauncherActivityInfo object) { + return object.getLabel(); + } + + @Override + public void loadIcon(Context context, LauncherActivityInfo object, + BitmapInfo target) { + LauncherIcons li = LauncherIcons.obtain(context); + li.createBadgedIconBitmap(mCache.getFullResIcon(object), + object.getUser(), object.getApplicationInfo().targetSdkVersion).applyTo(target); + li.recycle(); + } +} \ No newline at end of file diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 8b3e2c9a86..8551e6fbc0 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -20,8 +20,6 @@ import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_LOCKED_USER; import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_SAFEMODE; import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_SUSPENDED; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; -import static com.android.launcher3.icons.CachingLogic.COMPONENT_WITH_LABEL; -import static com.android.launcher3.icons.CachingLogic.LAUNCHER_ACTIVITY_INFO; import static com.android.launcher3.model.LoaderResults.filterCurrentWorkspaceItems; import android.appwidget.AppWidgetProviderInfo; @@ -46,6 +44,7 @@ import com.android.launcher3.AllAppsList; import com.android.launcher3.AppInfo; import com.android.launcher3.FolderInfo; import com.android.launcher3.icons.ComponentWithLabel; +import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic; import com.android.launcher3.icons.IconCacheUpdateHandler; import com.android.launcher3.icons.IconCache; import com.android.launcher3.InstallShortcutReceiver; @@ -63,6 +62,7 @@ import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIconPreviewVerifier; +import com.android.launcher3.icons.LauncherActivtiyCachingLogic; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.provider.ImportDataTask; @@ -202,7 +202,8 @@ public class LoaderTask implements Runnable { TraceHelper.partitionSection(TAG, "step 2.3: Update icon cache"); IconCacheUpdateHandler updateHandler = mIconCache.getUpdateHandler(); setIgnorePackages(updateHandler); - updateHandler.updateIcons(allActivityList, LAUNCHER_ACTIVITY_INFO, + updateHandler.updateIcons(allActivityList, + new LauncherActivtiyCachingLogic(mApp.getIconCache()), mApp.getModel()::onPackageIconsUpdated); // Take a break @@ -233,7 +234,7 @@ public class LoaderTask implements Runnable { verifyNotStopped(); TraceHelper.partitionSection(TAG, "step 4.3: Update icon cache"); - updateHandler.updateIcons(allWidgetsList, COMPONENT_WITH_LABEL, + updateHandler.updateIcons(allWidgetsList, new ComponentCachingLogic(mApp.getContext()), mApp.getModel()::onWidgetLabelsUpdated); verifyNotStopped(); From 9ed67ddc5036caaafe211ae20d9f63b125c1e607 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 5 Nov 2018 17:32:16 -0800 Subject: [PATCH 15/20] Disable Shortcuts menu item for Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I423afd62063babcda52d3907bbd608049238f065 --- src/com/android/launcher3/views/OptionsPopupView.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index c540b59c1c..6ba2f4069c 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -34,6 +34,7 @@ import android.widget.Toast; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.popup.ArrowPopup; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; @@ -151,8 +152,10 @@ public class OptionsPopupView extends ArrowPopup ArrayList options = new ArrayList<>(); options.add(new OptionItem(R.string.wallpaper_button_text, R.drawable.ic_wallpaper, ControlType.WALLPAPER_BUTTON, OptionsPopupView::startWallpaperPicker)); - options.add(new OptionItem(R.string.widget_button_text, R.drawable.ic_widget, - ControlType.WIDGETS_BUTTON, OptionsPopupView::onWidgetsClicked)); + if (!FeatureFlags.GO_DISABLE_WIDGETS) { + options.add(new OptionItem(R.string.widget_button_text, R.drawable.ic_widget, + ControlType.WIDGETS_BUTTON, OptionsPopupView::onWidgetsClicked)); + } options.add(new OptionItem(R.string.settings_button_text, R.drawable.ic_setting, ControlType.SETTINGS_BUTTON, OptionsPopupView::startSettings)); From d7239fcc52efbc85de7a73d666a44eaac3543637 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 17:19:45 -0800 Subject: [PATCH 16/20] Removing UserManagerCompat wrapper for getting baded label This removes some crass dependency on Launcher compat implementation making it easier to move iconCache to a separate library Change-Id: If5fab0c82d98089cde6f54b6a374fb7bb2db5ae8 --- quickstep/src/com/android/quickstep/TaskUtils.java | 3 +-- .../android/launcher3/InstallShortcutReceiver.java | 4 ++-- src/com/android/launcher3/ShortcutInfo.java | 4 +--- .../android/launcher3/compat/UserManagerCompat.java | 1 - .../android/launcher3/compat/UserManagerCompatVL.java | 11 ----------- src/com/android/launcher3/icons/BaseIconCache.java | 8 ++++---- src/com/android/launcher3/model/LoaderCursor.java | 10 +++++----- 7 files changed, 13 insertions(+), 28 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskUtils.java b/quickstep/src/com/android/quickstep/TaskUtils.java index 5cae2b9199..4b86a7fa88 100644 --- a/quickstep/src/com/android/quickstep/TaskUtils.java +++ b/quickstep/src/com/android/quickstep/TaskUtils.java @@ -59,7 +59,6 @@ public class TaskUtils { */ public static CharSequence getTitle(Context context, Task task) { LauncherAppsCompat launcherAppsCompat = LauncherAppsCompat.getInstance(context); - UserManagerCompat userManagerCompat = UserManagerCompat.getInstance(context); PackageManager packageManager = context.getPackageManager(); UserHandle user = UserHandle.of(task.key.userId); ApplicationInfo applicationInfo = launcherAppsCompat.getApplicationInfo( @@ -68,7 +67,7 @@ public class TaskUtils { Log.e(TAG, "Failed to get title for task " + task); return ""; } - return userManagerCompat.getBadgedLabelForUser( + return packageManager.getUserBadgedLabel( applicationInfo.loadLabel(packageManager), user); } diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 851454b77b..73c999a923 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -659,8 +659,8 @@ public class InstallShortcutReceiver extends BroadcastReceiver { info.applyFrom(iconInfo); info.title = Utilities.trim(name); - info.contentDescription = UserManagerCompat.getInstance(app.getContext()) - .getBadgedLabelForUser(info.title, info.user); + info.contentDescription = app.getContext().getPackageManager() + .getUserBadgedLabel(info.title, info.user); info.intent = intent; return info; } diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 7717d91883..19c647fd74 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -24,7 +24,6 @@ import android.os.Build; import android.text.TextUtils; import com.android.launcher3.LauncherSettings.Favorites; -import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.icons.IconCache; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.ContentWriter; @@ -172,8 +171,7 @@ public class ShortcutInfo extends ItemInfoWithIcon { if (TextUtils.isEmpty(label)) { label = shortcutInfo.getShortLabel(); } - contentDescription = UserManagerCompat.getInstance(context) - .getBadgedLabelForUser(label, user); + contentDescription = context.getPackageManager().getUserBadgedLabel(label, user); if (shortcutInfo.isEnabled()) { runtimeStatusFlags &= ~FLAG_DISABLED_BY_PUBLISHER; } else { diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java index ad5147734e..e13d2a6e17 100644 --- a/src/com/android/launcher3/compat/UserManagerCompat.java +++ b/src/com/android/launcher3/compat/UserManagerCompat.java @@ -57,7 +57,6 @@ public abstract class UserManagerCompat { public abstract List getUserProfiles(); public abstract long getSerialNumberForUser(UserHandle user); public abstract UserHandle getUserForSerialNumber(long serialNumber); - public abstract CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user); public abstract boolean isQuietModeEnabled(UserHandle user); public abstract boolean isUserUnlocked(UserHandle user); diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index ef7284226b..4688052830 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -17,7 +17,6 @@ package com.android.launcher3.compat; import android.content.Context; -import android.content.pm.PackageManager; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; @@ -30,7 +29,6 @@ import java.util.List; public class UserManagerCompatVL extends UserManagerCompat { protected final UserManager mUserManager; - private final PackageManager mPm; protected LongSparseArray mUsers; // Create a separate reverse map as LongSparseArray.indexOfValue checks if objects are same @@ -39,7 +37,6 @@ public class UserManagerCompatVL extends UserManagerCompat { UserManagerCompatVL(Context context) { mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - mPm = context.getPackageManager(); } @Override @@ -125,13 +122,5 @@ public class UserManagerCompatVL extends UserManagerCompat { } return getUserProfiles().size() > 1; } - - @Override - public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) { - if (user == null) { - return label; - } - return mPm.getUserBadgedLabel(label, user); - } } diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 52233ef0da..8f3b2bb77d 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -226,7 +226,7 @@ public class BaseIconCache { cachingLogic.loadIcon(mContext, object, entry); } entry.title = cachingLogic.getLabel(object); - entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + entry.contentDescription = mPackageManager.getUserBadgedLabel(entry.title, user); mCache.put(key, entry); ContentValues values = newContentValues(entry, entry.title.toString(), @@ -320,7 +320,7 @@ public class BaseIconCache { } if (object != null) { entry.title = cachingLogic.getLabel(object); - entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + entry.contentDescription = mPackageManager.getUserBadgedLabel(entry.title, user); } } } @@ -399,7 +399,7 @@ public class BaseIconCache { li.recycle(); entry.title = appInfo.loadLabel(mPackageManager); - entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + entry.contentDescription = mPackageManager.getUserBadgedLabel(entry.title, user); entry.icon = useLowResIcon ? LOW_RES_ICON : iconInfo.icon; entry.color = iconInfo.color; @@ -441,7 +441,7 @@ public class BaseIconCache { entry.title = ""; entry.contentDescription = ""; } else { - entry.contentDescription = mUserManager.getBadgedLabelForUser( + entry.contentDescription = mPackageManager.getUserBadgedLabel( entry.title, cacheKey.user); } diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index ea4d32b282..3aeb1c078c 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.LauncherActivityInfo; +import android.content.pm.PackageManager; import android.database.Cursor; import android.database.CursorWrapper; import android.graphics.BitmapFactory; @@ -41,7 +42,6 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.LauncherIcons; @@ -64,7 +64,7 @@ public class LoaderCursor extends CursorWrapper { public final LongSparseArray allUsers = new LongSparseArray<>(); private final Context mContext; - private final UserManagerCompat mUserManager; + private final PackageManager mPM; private final IconCache mIconCache; private final InvariantDeviceProfile mIDP; @@ -100,7 +100,7 @@ public class LoaderCursor extends CursorWrapper { mContext = app.getContext(); mIconCache = app.getIconCache(); mIDP = app.getInvariantDeviceProfile(); - mUserManager = UserManagerCompat.getInstance(mContext); + mPM = mContext.getPackageManager(); // Init column indices iconIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.ICON); @@ -228,7 +228,7 @@ public class LoaderCursor extends CursorWrapper { throw new InvalidParameterException("Invalid restoreType " + restoreFlag); } - info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); + info.contentDescription = mPM.getUserBadgedLabel(info.title, info.user); info.itemType = itemType; info.status = restoreFlag; return info; @@ -284,7 +284,7 @@ public class LoaderCursor extends CursorWrapper { info.title = componentName.getClassName(); } - info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); + info.contentDescription = mPM.getUserBadgedLabel(info.title, info.user); return info; } From 97fab14d8f5c208bc60a8200dd0916ee8dacc589 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 5 Nov 2018 18:27:07 -0800 Subject: [PATCH 17/20] Get rid of unused resources from Launcher3 running on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: Ia19e92801f4d1a47b0dab47185d23b10e2412328 --- go/res/drawable/ic_widget.xml | 25 ---------------------- go/res/values-af/strings.xml | 26 ----------------------- go/res/values-am/strings.xml | 26 ----------------------- go/res/values-ar/strings.xml | 26 ----------------------- go/res/values-as/strings.xml | 26 ----------------------- go/res/values-az/strings.xml | 26 ----------------------- go/res/values-b+sr+Latn/strings.xml | 26 ----------------------- go/res/values-be/strings.xml | 26 ----------------------- go/res/values-bg/strings.xml | 26 ----------------------- go/res/values-bn/strings.xml | 26 ----------------------- go/res/values-bs/strings.xml | 26 ----------------------- go/res/values-ca/strings.xml | 26 ----------------------- go/res/values-cs/strings.xml | 26 ----------------------- go/res/values-da/strings.xml | 26 ----------------------- go/res/values-de/strings.xml | 26 ----------------------- go/res/values-el/strings.xml | 26 ----------------------- go/res/values-en-rAU/strings.xml | 26 ----------------------- go/res/values-en-rGB/strings.xml | 26 ----------------------- go/res/values-en-rIN/strings.xml | 26 ----------------------- go/res/values-es-rUS/strings.xml | 26 ----------------------- go/res/values-es/strings.xml | 26 ----------------------- go/res/values-et/strings.xml | 26 ----------------------- go/res/values-eu/strings.xml | 26 ----------------------- go/res/values-fa/strings.xml | 26 ----------------------- go/res/values-fi/strings.xml | 26 ----------------------- go/res/values-fr-rCA/strings.xml | 26 ----------------------- go/res/values-fr/strings.xml | 26 ----------------------- go/res/values-gl/strings.xml | 26 ----------------------- go/res/values-gu/strings.xml | 26 ----------------------- go/res/values-hi/strings.xml | 26 ----------------------- go/res/values-hr/strings.xml | 26 ----------------------- go/res/values-hu/strings.xml | 26 ----------------------- go/res/values-hy/strings.xml | 26 ----------------------- go/res/values-in/strings.xml | 26 ----------------------- go/res/values-is/strings.xml | 26 ----------------------- go/res/values-it/strings.xml | 26 ----------------------- go/res/values-iw/strings.xml | 26 ----------------------- go/res/values-ja/strings.xml | 26 ----------------------- go/res/values-ka/strings.xml | 26 ----------------------- go/res/values-kk/strings.xml | 26 ----------------------- go/res/values-km/strings.xml | 26 ----------------------- go/res/values-kn/strings.xml | 26 ----------------------- go/res/values-ko/strings.xml | 26 ----------------------- go/res/values-ky/strings.xml | 26 ----------------------- go/res/values-lo/strings.xml | 26 ----------------------- go/res/values-lt/strings.xml | 26 ----------------------- go/res/values-lv/strings.xml | 26 ----------------------- go/res/values-mk/strings.xml | 26 ----------------------- go/res/values-ml/strings.xml | 26 ----------------------- go/res/values-mn/strings.xml | 26 ----------------------- go/res/values-mr/strings.xml | 26 ----------------------- go/res/values-ms/strings.xml | 26 ----------------------- go/res/values-my/strings.xml | 26 ----------------------- go/res/values-nb/strings.xml | 26 ----------------------- go/res/values-ne/strings.xml | 26 ----------------------- go/res/values-nl/strings.xml | 26 ----------------------- go/res/values-or/strings.xml | 26 ----------------------- go/res/values-pa/strings.xml | 26 ----------------------- go/res/values-pl/strings.xml | 26 ----------------------- go/res/values-pt-rPT/strings.xml | 26 ----------------------- go/res/values-pt/strings.xml | 26 ----------------------- go/res/values-ro/strings.xml | 26 ----------------------- go/res/values-ru/strings.xml | 26 ----------------------- go/res/values-si/strings.xml | 26 ----------------------- go/res/values-sk/strings.xml | 26 ----------------------- go/res/values-sl/strings.xml | 26 ----------------------- go/res/values-sq/strings.xml | 26 ----------------------- go/res/values-sr/strings.xml | 26 ----------------------- go/res/values-sv/strings.xml | 26 ----------------------- go/res/values-sw/strings.xml | 26 ----------------------- go/res/values-ta/strings.xml | 26 ----------------------- go/res/values-te/strings.xml | 26 ----------------------- go/res/values-th/strings.xml | 26 ----------------------- go/res/values-tl/strings.xml | 26 ----------------------- go/res/values-tr/strings.xml | 26 ----------------------- go/res/values-uk/strings.xml | 26 ----------------------- go/res/values-ur/strings.xml | 26 ----------------------- go/res/values-uz/strings.xml | 26 ----------------------- go/res/values-vi/strings.xml | 26 ----------------------- go/res/values-zh-rCN/strings.xml | 26 ----------------------- go/res/values-zh-rHK/strings.xml | 26 ----------------------- go/res/values-zh-rTW/strings.xml | 26 ----------------------- go/res/values-zu/strings.xml | 26 ----------------------- go/res/values/strings.xml | 33 ----------------------------- 84 files changed, 2190 deletions(-) delete mode 100644 go/res/drawable/ic_widget.xml delete mode 100644 go/res/values-af/strings.xml delete mode 100644 go/res/values-am/strings.xml delete mode 100644 go/res/values-ar/strings.xml delete mode 100644 go/res/values-as/strings.xml delete mode 100644 go/res/values-az/strings.xml delete mode 100644 go/res/values-b+sr+Latn/strings.xml delete mode 100644 go/res/values-be/strings.xml delete mode 100644 go/res/values-bg/strings.xml delete mode 100644 go/res/values-bn/strings.xml delete mode 100644 go/res/values-bs/strings.xml delete mode 100644 go/res/values-ca/strings.xml delete mode 100644 go/res/values-cs/strings.xml delete mode 100644 go/res/values-da/strings.xml delete mode 100644 go/res/values-de/strings.xml delete mode 100644 go/res/values-el/strings.xml delete mode 100644 go/res/values-en-rAU/strings.xml delete mode 100644 go/res/values-en-rGB/strings.xml delete mode 100644 go/res/values-en-rIN/strings.xml delete mode 100644 go/res/values-es-rUS/strings.xml delete mode 100644 go/res/values-es/strings.xml delete mode 100644 go/res/values-et/strings.xml delete mode 100644 go/res/values-eu/strings.xml delete mode 100644 go/res/values-fa/strings.xml delete mode 100644 go/res/values-fi/strings.xml delete mode 100644 go/res/values-fr-rCA/strings.xml delete mode 100644 go/res/values-fr/strings.xml delete mode 100644 go/res/values-gl/strings.xml delete mode 100644 go/res/values-gu/strings.xml delete mode 100644 go/res/values-hi/strings.xml delete mode 100644 go/res/values-hr/strings.xml delete mode 100644 go/res/values-hu/strings.xml delete mode 100644 go/res/values-hy/strings.xml delete mode 100644 go/res/values-in/strings.xml delete mode 100644 go/res/values-is/strings.xml delete mode 100644 go/res/values-it/strings.xml delete mode 100644 go/res/values-iw/strings.xml delete mode 100644 go/res/values-ja/strings.xml delete mode 100644 go/res/values-ka/strings.xml delete mode 100644 go/res/values-kk/strings.xml delete mode 100644 go/res/values-km/strings.xml delete mode 100644 go/res/values-kn/strings.xml delete mode 100644 go/res/values-ko/strings.xml delete mode 100644 go/res/values-ky/strings.xml delete mode 100644 go/res/values-lo/strings.xml delete mode 100644 go/res/values-lt/strings.xml delete mode 100644 go/res/values-lv/strings.xml delete mode 100644 go/res/values-mk/strings.xml delete mode 100644 go/res/values-ml/strings.xml delete mode 100644 go/res/values-mn/strings.xml delete mode 100644 go/res/values-mr/strings.xml delete mode 100644 go/res/values-ms/strings.xml delete mode 100644 go/res/values-my/strings.xml delete mode 100644 go/res/values-nb/strings.xml delete mode 100644 go/res/values-ne/strings.xml delete mode 100644 go/res/values-nl/strings.xml delete mode 100644 go/res/values-or/strings.xml delete mode 100644 go/res/values-pa/strings.xml delete mode 100644 go/res/values-pl/strings.xml delete mode 100644 go/res/values-pt-rPT/strings.xml delete mode 100644 go/res/values-pt/strings.xml delete mode 100644 go/res/values-ro/strings.xml delete mode 100644 go/res/values-ru/strings.xml delete mode 100644 go/res/values-si/strings.xml delete mode 100644 go/res/values-sk/strings.xml delete mode 100644 go/res/values-sl/strings.xml delete mode 100644 go/res/values-sq/strings.xml delete mode 100644 go/res/values-sr/strings.xml delete mode 100644 go/res/values-sv/strings.xml delete mode 100644 go/res/values-sw/strings.xml delete mode 100644 go/res/values-ta/strings.xml delete mode 100644 go/res/values-te/strings.xml delete mode 100644 go/res/values-th/strings.xml delete mode 100644 go/res/values-tl/strings.xml delete mode 100644 go/res/values-tr/strings.xml delete mode 100644 go/res/values-uk/strings.xml delete mode 100644 go/res/values-ur/strings.xml delete mode 100644 go/res/values-uz/strings.xml delete mode 100644 go/res/values-vi/strings.xml delete mode 100644 go/res/values-zh-rCN/strings.xml delete mode 100644 go/res/values-zh-rHK/strings.xml delete mode 100644 go/res/values-zh-rTW/strings.xml delete mode 100644 go/res/values-zu/strings.xml delete mode 100644 go/res/values/strings.xml diff --git a/go/res/drawable/ic_widget.xml b/go/res/drawable/ic_widget.xml deleted file mode 100644 index 53368760ee..0000000000 --- a/go/res/drawable/ic_widget.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/go/res/values-af/strings.xml b/go/res/values-af/strings.xml deleted file mode 100644 index 10ac473c1f..0000000000 --- a/go/res/values-af/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Raak en hou om \'n kortpad op te tel." - "Dubbeltik en hou om \'n kortpad op te tel of gebruik gepasmaakte handelinge." - "Kortpaaie" - "%1$s-kortpaaie" - diff --git a/go/res/values-am/strings.xml b/go/res/values-am/strings.xml deleted file mode 100644 index b3b253f423..0000000000 --- a/go/res/values-am/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "አንድ አቋራጭ ለመውሰድ ነክተው ይያዙ" - "አንድ አቋራጭ ለመውሰድ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" - "አቋራጮች" - "%1$s አቋራጮች" - diff --git a/go/res/values-ar/strings.xml b/go/res/values-ar/strings.xml deleted file mode 100644 index 9888d0f7ca..0000000000 --- a/go/res/values-ar/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "المس مع الاستمرار لاختيار اختصار." - "يمكنك النقر مرّتين مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة." - "الاختصارات" - "اختصارات %1$s" - diff --git a/go/res/values-as/strings.xml b/go/res/values-as/strings.xml deleted file mode 100644 index 6b5807f97b..0000000000 --- a/go/res/values-as/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ স্পৰ্শ কৰি ৰাখক।" - "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ দুবাৰ টিপি ৰাখক বা নিজৰ উপযোগিতা অনুসৰি বনোৱা কাৰ্যসমূহ ব্যৱহাৰ কৰক।" - "শ্বৰ্টকাটসমূহ" - "%1$s শ্বৰ্টকাটসমূহ" - diff --git a/go/res/values-az/strings.xml b/go/res/values-az/strings.xml deleted file mode 100644 index c4b8cb7801..0000000000 --- a/go/res/values-az/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Qısayolu seçmək üçün toxunub saxlayın." - "Qısayolu seçmək üçün iki dəfə basıb saxlayın və ya fərdi əməliyyatlardan istifadə edin." - "Qısayollar" - "%1$s qısayolları" - diff --git a/go/res/values-b+sr+Latn/strings.xml b/go/res/values-b+sr+Latn/strings.xml deleted file mode 100644 index 0da5699410..0000000000 --- a/go/res/values-b+sr+Latn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dodirnite i zadržite da biste izabrali prečicu." - "Dvaput dodirnite i zadržite da biste izabrali prečicu ili koristite prilagođene radnje." - "Prečice" - "Prečice za %1$s" - diff --git a/go/res/values-be/strings.xml b/go/res/values-be/strings.xml deleted file mode 100644 index 4189e35fa0..0000000000 --- a/go/res/values-be/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Дакраніцеся і ўтрымлiвайце ярлык, каб дадаць яго." - "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць ярлык або выкарыстоўваць спецыяльныя дзеянні." - "Ярлыкі" - "Ярлыкі %1$s" - diff --git a/go/res/values-bg/strings.xml b/go/res/values-bg/strings.xml deleted file mode 100644 index 1b85992d99..0000000000 --- a/go/res/values-bg/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Докоснете и задръжте за избор на пряк път." - "Докоснете двукратно и задръжте за избор на пряк път или използвайте персонализирани действия." - "Преки пътища" - "Преки пътища за %1$s" - diff --git a/go/res/values-bn/strings.xml b/go/res/values-bn/strings.xml deleted file mode 100644 index c56c925a29..0000000000 --- a/go/res/values-bn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "কোনও শর্টকাট বেছে নিতে টাচ করে ধরে রাখুন।" - "কোনও শর্টকাট বেছে নিতে ডাবল ট্যাপ করে ধরে রাখুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন।" - "শর্টকাট" - "%1$s এর শর্টকাট" - diff --git a/go/res/values-bs/strings.xml b/go/res/values-bs/strings.xml deleted file mode 100644 index 3141b9d8fd..0000000000 --- a/go/res/values-bs/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dodirnite i držite da uzmete prečicu." - "Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije." - "Prečice" - "Prečice aplikacije %1$s" - diff --git a/go/res/values-ca/strings.xml b/go/res/values-ca/strings.xml deleted file mode 100644 index 3b5c3f7b56..0000000000 --- a/go/res/values-ca/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén premuda una drecera per seleccionar-la." - "Fes doble toc i mantén premut per seleccionar una drecera o per utilitzar accions personalitzades." - "Dreceres" - "Dreceres de l\'aplicació %1$s" - diff --git a/go/res/values-cs/strings.xml b/go/res/values-cs/strings.xml deleted file mode 100644 index e4018f2c0f..0000000000 --- a/go/res/values-cs/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Zkratku vyberete podržením." - "Dvojitým klepnutím a podržením vyberte zkratku, případně použijte vlastní akce." - "Zkratky" - "Zkratky aplikace %1$s" - diff --git a/go/res/values-da/strings.xml b/go/res/values-da/strings.xml deleted file mode 100644 index 821d36a7da..0000000000 --- a/go/res/values-da/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Hold en genvej nede for at samle den op." - "Tryk to gange, og hold en genvej nede for at samle den op og bruge tilpassede handlinger." - "Genveje" - "%1$s-genveje" - diff --git a/go/res/values-de/strings.xml b/go/res/values-de/strings.xml deleted file mode 100644 index 43a1b3a9e1..0000000000 --- a/go/res/values-de/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Doppeltippen und halten, um eine Verknüpfung auszuwählen." - "Doppeltippen und halten, um eine Verknüpfung auszuwählen oder benutzerdefinierte Aktionen zu nutzen." - "Verknüpfungen" - "%1$s-Verknüpfungen" - diff --git a/go/res/values-el/strings.xml b/go/res/values-el/strings.xml deleted file mode 100644 index ae59907d16..0000000000 --- a/go/res/values-el/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Αγγίξτε παρατεταμένα για να σηκώσετε μια συντόμευση." - "Πατήσετε δύο φορές παρατεταμένα για να σηκώσετε μια συντόμευση ή για να χρησιμοποιήσετε προσαρμοσμένες ενέργειες." - "Συντομεύσεις" - "Συντομεύσεις %1$s" - diff --git a/go/res/values-en-rAU/strings.xml b/go/res/values-en-rAU/strings.xml deleted file mode 100644 index 2ee2c26457..0000000000 --- a/go/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Touch & hold to pick up a shortcut." - "Double-tap & hold to pick up a shortcut or use custom actions." - "Shortcuts" - "%1$s shortcuts" - diff --git a/go/res/values-en-rGB/strings.xml b/go/res/values-en-rGB/strings.xml deleted file mode 100644 index 2ee2c26457..0000000000 --- a/go/res/values-en-rGB/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Touch & hold to pick up a shortcut." - "Double-tap & hold to pick up a shortcut or use custom actions." - "Shortcuts" - "%1$s shortcuts" - diff --git a/go/res/values-en-rIN/strings.xml b/go/res/values-en-rIN/strings.xml deleted file mode 100644 index 2ee2c26457..0000000000 --- a/go/res/values-en-rIN/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Touch & hold to pick up a shortcut." - "Double-tap & hold to pick up a shortcut or use custom actions." - "Shortcuts" - "%1$s shortcuts" - diff --git a/go/res/values-es-rUS/strings.xml b/go/res/values-es-rUS/strings.xml deleted file mode 100644 index 5212c035d3..0000000000 --- a/go/res/values-es-rUS/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén presionado para elegir un acceso directo." - "Presiona dos veces y mantén presionado para elegir un acceso directo o usar acciones personalizadas." - "Accesos directos" - "Accesos directos de %1$s" - diff --git a/go/res/values-es/strings.xml b/go/res/values-es/strings.xml deleted file mode 100644 index 3ae45889cf..0000000000 --- a/go/res/values-es/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén pulsado el acceso directo que quieras." - "Toca dos veces y mantén pulsado el acceso directo o utiliza acciones personalizadas." - "Accesos directos" - "Accesos directos de %1$s" - diff --git a/go/res/values-et/strings.xml b/go/res/values-et/strings.xml deleted file mode 100644 index 2513e65a33..0000000000 --- a/go/res/values-et/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Otsetee valimiseks puudutage seda pikalt." - "Topeltpuudutage ja hoidke otsetee valimiseks või kohandatud toimingute kasutamiseks." - "Otseteed" - "Rakenduse %1$s otseteed" - diff --git a/go/res/values-eu/strings.xml b/go/res/values-eu/strings.xml deleted file mode 100644 index 9949ef091d..0000000000 --- a/go/res/values-eu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Eduki sakatuta lasterbide bat aukeratzeko." - "Sakatu birritan eta eduki sakatuta lasterbide bat aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." - "Lasterbideak" - "%1$s aplikazioaren lasterbidea" - diff --git a/go/res/values-fa/strings.xml b/go/res/values-fa/strings.xml deleted file mode 100644 index f1584d9ff7..0000000000 --- a/go/res/values-fa/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "برای انتخاب یک میان‌بر، لمس کنید و نگه‌دارید." - "برای انتخاب میان‌بر، دو ضربه سریع بزنید و نگه دارید یا از کنش‌های سفارشی استفاده کنید." - "میان‌برها" - "میان‌برهای %1$s" - diff --git a/go/res/values-fi/strings.xml b/go/res/values-fi/strings.xml deleted file mode 100644 index da9b0e1c42..0000000000 --- a/go/res/values-fi/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Valitse pikakuvake painamalla sitä pitkään." - "Valitse pikakuvake tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla pitkään." - "Pikakuvakkeet" - "Kohteen %1$s pikakuvakkeet" - diff --git a/go/res/values-fr-rCA/strings.xml b/go/res/values-fr-rCA/strings.xml deleted file mode 100644 index c7fd6d6423..0000000000 --- a/go/res/values-fr-rCA/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Maintenez un doigt sur le raccourci pour l\'ajouter" - "Touchez 2x un raccourci et maintenez doigt dessus pour l’aj. ou utiliser des actions personnalisées." - "Raccourcis" - "Raccourcis : %1$s" - diff --git a/go/res/values-fr/strings.xml b/go/res/values-fr/strings.xml deleted file mode 100644 index 238fe73d75..0000000000 --- a/go/res/values-fr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Appui prolongé pour sélectionner raccourci." - "Appuyez 2 fois et maintenez pression pour sélectionner raccourci ou utilisez actions personnalisées." - "Raccourcis" - "Raccourcis %1$s" - diff --git a/go/res/values-gl/strings.xml b/go/res/values-gl/strings.xml deleted file mode 100644 index 31621d5c2c..0000000000 --- a/go/res/values-gl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén premido un atallo para seleccionalo." - "Toca dúas veces e mantén premido para seleccionar un atallo ou utiliza accións personalizadas." - "Atallos" - "Atallos da aplicación %1$s" - diff --git a/go/res/values-gu/strings.xml b/go/res/values-gu/strings.xml deleted file mode 100644 index bdb549ff7f..0000000000 --- a/go/res/values-gu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "એક શૉર્ટકટ ચૂંટવા ટૅપ કરી રાખો." - "એક શૉર્ટકટ ચૂંટવા અથવા કોઈ કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટૅપ કરી રાખો." - "શૉર્ટકટ" - "%1$s શૉર્ટકટ" - diff --git a/go/res/values-hi/strings.xml b/go/res/values-hi/strings.xml deleted file mode 100644 index 2c1650a0dd..0000000000 --- a/go/res/values-hi/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "शॉर्टकट चुनने के लिए छूकर रखें." - "शॉर्टकट चुनने के लिए दो बार छूएं और कुछ देर दबाएं रखें या अपने मुताबिक कार्रवाइयों का इस्तेमाल करें." - "शॉर्टकट" - "%1$s शॉर्टकट" - diff --git a/go/res/values-hr/strings.xml b/go/res/values-hr/strings.xml deleted file mode 100644 index fccdeb59d7..0000000000 --- a/go/res/values-hr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dodirnite i zadržite kako biste podigli prečac." - "Dvaput dodirnite i zadržite pritisak kako biste podigli prečac ili pokušajte prilagođenim radnjama." - "Prečaci" - "Prečaci za aplikaciju %1$s" - diff --git a/go/res/values-hu/strings.xml b/go/res/values-hu/strings.xml deleted file mode 100644 index 369c22745a..0000000000 --- a/go/res/values-hu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Felvételhez tartsa nyomva a parancsikont." - "Parancsikon felvételéhez koppintson rá duplán és tartsa nyomva, vagy használjon egyéni műveleteket." - "Parancsikonok" - "%1$s-parancsikonok" - diff --git a/go/res/values-hy/strings.xml b/go/res/values-hy/strings.xml deleted file mode 100644 index 4747f6df35..0000000000 --- a/go/res/values-hy/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար։" - "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար կամ օգտվեք հարմարեցրած գործողություններից:" - "Դյուրանցումներ" - "%1$s դյուրանցումներ" - diff --git a/go/res/values-in/strings.xml b/go/res/values-in/strings.xml deleted file mode 100644 index c8b9da306d..0000000000 --- a/go/res/values-in/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tap lama untuk memilih pintasan." - "Tap dua kali & tahan untuk memilih pintasan atau menggunakan tindakan khusus." - "Pintasan" - "Pintasan %1$s" - diff --git a/go/res/values-is/strings.xml b/go/res/values-is/strings.xml deleted file mode 100644 index b8bb923746..0000000000 --- a/go/res/values-is/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Haltu fingri á flýtileið til að grípa hana." - "Ýttu tvisvar og haltu fingri á flýtileið til að grípa hana eða notaðu sérsniðnar aðgerðir." - "Flýtileiðir" - "%1$s flýtileiðir" - diff --git a/go/res/values-it/strings.xml b/go/res/values-it/strings.xml deleted file mode 100644 index bc5d99863d..0000000000 --- a/go/res/values-it/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tocca e tieni premuto per scegliere la scorciatoia" - "Tocca due volte e tieni premuto per scegliere una scorciatoia o per usare azioni personalizzate." - "Scorciatoie" - "Scorciatoie di %1$s" - diff --git a/go/res/values-iw/strings.xml b/go/res/values-iw/strings.xml deleted file mode 100644 index f541d4d316..0000000000 --- a/go/res/values-iw/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "כדי להוסיף קיצור דרך, מקישים עליו פעמיים ומחזיקים." - "כדי להוסיף קיצור דרך או להשתמש בפעולות מותאמות אישית, מקישים על קיצור הדרך פעמיים ומחזיקים." - "קיצורי דרך" - "קיצורי דרך לאפליקציה %1$s" - diff --git a/go/res/values-ja/strings.xml b/go/res/values-ja/strings.xml deleted file mode 100644 index 8f02d7f4eb..0000000000 --- a/go/res/values-ja/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ショートカットを追加するには押し続けます。" - "ダブルタップ後に押し続けてショートカットを選択するか、カスタム操作を使用してください。" - "ショートカット" - "「%1$s」のショートカット" - diff --git a/go/res/values-ka/strings.xml b/go/res/values-ka/strings.xml deleted file mode 100644 index 1b46534788..0000000000 --- a/go/res/values-ka/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "შეეხეთ და დააყოვნეთ მალსახმობის ასარჩევად." - "ორმაგად შეეხეთ და გეჭიროთ მალსახმობის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." - "მალსახმობები" - "%1$s-ის მალსახმობები" - diff --git a/go/res/values-kk/strings.xml b/go/res/values-kk/strings.xml deleted file mode 100644 index e909818afc..0000000000 --- a/go/res/values-kk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Таңбашаны таңдау үшін оны түртіп, ұстап тұрыңыз." - "Таңбашаны таңдау немесе арнаулы әрекеттерді пайдалану үшін екі рет түртіп, ұстап тұрыңыз." - "Таңбашалар" - "%1$s таңбаша" - diff --git a/go/res/values-km/strings.xml b/go/res/values-km/strings.xml deleted file mode 100644 index 40082a4b9d..0000000000 --- a/go/res/values-km/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ប៉ះ ហើយចុចឲ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ។" - "ប៉ះពីរដង ហើយចុចឱ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" - "ផ្លូវកាត់" - "ផ្លូវកាត់សម្រាប់ %1$s" - diff --git a/go/res/values-kn/strings.xml b/go/res/values-kn/strings.xml deleted file mode 100644 index 9c121fd294..0000000000 --- a/go/res/values-kn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಶಾರ್ಟ್‌ಕಟ್ ಆರಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ." - "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಶಾರ್ಟ್‌ಕಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ." - "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - "%1$s ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - diff --git a/go/res/values-ko/strings.xml b/go/res/values-ko/strings.xml deleted file mode 100644 index 60f925e36b..0000000000 --- a/go/res/values-ko/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "바로가기를 선택하려면 길게 터치하세요." - "바로가기를 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." - "바로가기" - "%1$s 바로가기" - diff --git a/go/res/values-ky/strings.xml b/go/res/values-ky/strings.xml deleted file mode 100644 index 4c7e973cef..0000000000 --- a/go/res/values-ky/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Кыска жолду тандоо үчүн басып туруңуз." - "Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." - "Кыска жолдор" - "%1$s кыска жол" - diff --git a/go/res/values-lo/strings.xml b/go/res/values-lo/strings.xml deleted file mode 100644 index 7864884acc..0000000000 --- a/go/res/values-lo/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ແຕະຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ." - "ແຕະສອງເທື່ອຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ ຫຼື ໃຊ້ຄຳສັ່ງແບບກຳນົດເອງ." - "ປຸ່ມລັດ" - "ປຸ່ມລັດ %1$s" - diff --git a/go/res/values-lt/strings.xml b/go/res/values-lt/strings.xml deleted file mode 100644 index 8f49032cfb..0000000000 --- a/go/res/values-lt/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dukart pal. ir palaik., kad pasir. spart. klav." - "Dukart palieskite ir palaikykite, kad pasirinkt. spartųjį klavišą ar naudotumėte tinkintus veiksmus." - "Spartieji klavišai" - "„%1$s“ spartieji klavišai" - diff --git a/go/res/values-lv/strings.xml b/go/res/values-lv/strings.xml deleted file mode 100644 index 04315ebaa0..0000000000 --- a/go/res/values-lv/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Lai izvēlētos saīsni, pieskarieties un turiet to." - "Lai atlasītu saīsni, veiciet dubultskārienu uz tās un turiet to vai arī veiciet pielāgotas darbības." - "Saīsnes" - "Lietotnes %1$s saīsnes" - diff --git a/go/res/values-mk/strings.xml b/go/res/values-mk/strings.xml deleted file mode 100644 index 52d66b5e28..0000000000 --- a/go/res/values-mk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Допрете двапати и задржете за да изберете кратенка." - "Допрете двапати и задржете за да изберете кратенка или да користите приспособени дејства." - "Кратенки" - "Кратенки за %1$s" - diff --git a/go/res/values-ml/strings.xml b/go/res/values-ml/strings.xml deleted file mode 100644 index b3c12e16e1..0000000000 --- a/go/res/values-ml/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ഒരു കുറുക്കുവഴി ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." - "ഒരു കുറുക്കുവഴി തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." - "കുറുക്കുവഴികൾ" - "%1$s കുറുക്കുവഴികൾ" - diff --git a/go/res/values-mn/strings.xml b/go/res/values-mn/strings.xml deleted file mode 100644 index c89dfd1bdc..0000000000 --- a/go/res/values-mn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Товчлол авах бол удаан дарна уу." - "Товчлол авах болон тохируулсан үйлдлийг ашиглахын тулд хоёр товшоод хүлээнэ үү." - "Товчлол" - "%1$s-н товчлол" - diff --git a/go/res/values-mr/strings.xml b/go/res/values-mr/strings.xml deleted file mode 100644 index 2c767b4f19..0000000000 --- a/go/res/values-mr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "शॉर्टकट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." - "शॉर्टकट निवडण्यासाठी किंवा कस्टम क्रिया वापरण्यासाठी दोनदा टॅप करा आणि धरून ठेवा." - "शॉर्टकट" - "%1$s शॉर्टकट" - diff --git a/go/res/values-ms/strings.xml b/go/res/values-ms/strings.xml deleted file mode 100644 index 42add9a197..0000000000 --- a/go/res/values-ms/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Sentuh & tahan untuk mengambil pintasan." - "Ketik dua kali & tahan untuk mengambil pintasan atau menggunakan tindakan tersuai." - "Pintasan" - "Pintasan %1$s" - diff --git a/go/res/values-my/strings.xml b/go/res/values-my/strings.xml deleted file mode 100644 index 5784df63bf..0000000000 --- a/go/res/values-my/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "လက်ကွက်ဖြတ်လမ်းတစ်ခုကို ရွေးရန် ထိပြီး ဖိထားပါ" - "လက်ကွက်ဖြတ်လမ်းကို ရွေးရန် (သို့) စိတ်ကြိုက်လုပ်ဆောင်ချက်များကို သုံးရန်နှစ်ချက်တို့ပြီး ဖိထားပါ။" - "ဖြတ်လမ်းလင့်ခ်များ" - "%1$s ဖြတ်လမ်းလင့်ခ်များ" - diff --git a/go/res/values-nb/strings.xml b/go/res/values-nb/strings.xml deleted file mode 100644 index 2a5ffb6e7c..0000000000 --- a/go/res/values-nb/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Trykk og hold for å velge en snarvei." - "Dobbelttrykk og hold for å velge en snarvei eller bruke tilpassede handlinger." - "Snarveier" - "%1$s-snarveier" - diff --git a/go/res/values-ne/strings.xml b/go/res/values-ne/strings.xml deleted file mode 100644 index 0be0375f3a..0000000000 --- a/go/res/values-ne/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "कुनै सटकर्ट छनौट गर्न छोइराख्नुहोस्।" - "कुनै सर्टकट छनौट गर्न दुईपटक ट्याप गरेर होल्ड गर्नुहोस् वा रोजेका कारबाहीहरू प्रयोग गर्नुहोस्।" - "सर्टकटहरू" - "%1$s सर्टकटहरू" - diff --git a/go/res/values-nl/strings.xml b/go/res/values-nl/strings.xml deleted file mode 100644 index 5bcd016b4a..0000000000 --- a/go/res/values-nl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tik en houd vast om snelkoppeling toe te voegen." - "Dubbeltik en houd vast om een snelkoppeling toe te voegen of aangepaste acties te gebruiken." - "Snelkoppelingen" - "%1$s-snelkoppelingen" - diff --git a/go/res/values-or/strings.xml b/go/res/values-or/strings.xml deleted file mode 100644 index 3ec8a72038..0000000000 --- a/go/res/values-or/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଦାବି ଧରନ୍ତୁ।" - "ଡବଲ୍‌-ଟାପ୍‌ କରନ୍ତୁ ଏବଂ ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ ପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।" - "ଶର୍ଟକଟ୍‍" - "%1$sର ଶର୍ଟକଟ୍" - diff --git a/go/res/values-pa/strings.xml b/go/res/values-pa/strings.xml deleted file mode 100644 index c7e4abf3a8..0000000000 --- a/go/res/values-pa/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।" - "ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ ਜਾਂ ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ ਵਰਤੋ।" - "ਸ਼ਾਰਟਕੱਟ" - "%1$s ਸ਼ਾਰਟਕੱਟ" - diff --git a/go/res/values-pl/strings.xml b/go/res/values-pl/strings.xml deleted file mode 100644 index 0861daaa57..0000000000 --- a/go/res/values-pl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Naciśnij i przytrzymaj, by wybrać skrót." - "Kliknij dwukrotnie i przytrzymaj, by wybrać skrót lub użyć działań niestandardowych." - "Skróty" - "%1$s – skróty" - diff --git a/go/res/values-pt-rPT/strings.xml b/go/res/values-pt-rPT/strings.xml deleted file mode 100644 index 7a75a05456..0000000000 --- a/go/res/values-pt-rPT/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Toque sem soltar para escolher um atalho." - "Toque duas vezes sem soltar para escolher um atalho ou utilize ações personalizadas." - "Atalhos" - "Atalhos da aplicação %1$s" - diff --git a/go/res/values-pt/strings.xml b/go/res/values-pt/strings.xml deleted file mode 100644 index 53bbfc41a6..0000000000 --- a/go/res/values-pt/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Toque e segure para selecionar um atalho." - "Toque duas vezes na tela e segure para selecionar um atalho ou usar ações personalizadas." - "Atalhos" - "Atalhos do app %1$s" - diff --git a/go/res/values-ro/strings.xml b/go/res/values-ro/strings.xml deleted file mode 100644 index 75d1796b57..0000000000 --- a/go/res/values-ro/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Atingeți și țineți apăsat pentru a selecta o comandă rapidă." - "Atingeți de două ori și țineți apăsat pentru comandă rapidă sau folosiți acțiuni personalizate." - "Comenzi rapide" - "Comenzi rapide pentru %1$s" - diff --git a/go/res/values-ru/strings.xml b/go/res/values-ru/strings.xml deleted file mode 100644 index 9c5c8cd340..0000000000 --- a/go/res/values-ru/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Чтобы выбрать ярлык, нажмите на него и удерживайте." - "Чтобы выбрать ярлык или использовать специальные действия, нажмите на него дважды и не отпускайте." - "Ярлыки" - "%1$s: ярлыки" - diff --git a/go/res/values-si/strings.xml b/go/res/values-si/strings.xml deleted file mode 100644 index 4b25c90b0b..0000000000 --- a/go/res/values-si/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "කෙටි මගක් තෝරා ගැනීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න." - "විජට් එකක් තෝරා ගැනීමට හෝ අභිරුචි භාවිත කිරීමට දෙවරක් තට්ටු කර අල්ලා ගෙන සිටින්න." - "කෙටි මං" - "කෙටි මං %1$s" - diff --git a/go/res/values-sk/strings.xml b/go/res/values-sk/strings.xml deleted file mode 100644 index fc02933734..0000000000 --- a/go/res/values-sk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Skratku pridáte pridržaním." - "Skratku pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." - "Skratky" - "Skratky aplikácie %1$s" - diff --git a/go/res/values-sl/strings.xml b/go/res/values-sl/strings.xml deleted file mode 100644 index 6ecedfb166..0000000000 --- a/go/res/values-sl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Pridržite bližnjico, da jo izberete." - "Dvakrat se dotaknite bližnjice in jo pridržite, da jo izberete, ali pa uporabite dejanja po meri." - "Bližnjice" - "Bližnjice za %1$s" - diff --git a/go/res/values-sq/strings.xml b/go/res/values-sq/strings.xml deleted file mode 100644 index bb74db6b55..0000000000 --- a/go/res/values-sq/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Prek dhe mbaj prekur për të zgjedhur një shkurtore." - "Prek dy herë dhe mbaj prekur për të zgjedhur një shkurtore ose për të përdorur veprimet e personalizuara." - "Shkurtoret" - "%1$s shkurtore" - diff --git a/go/res/values-sr/strings.xml b/go/res/values-sr/strings.xml deleted file mode 100644 index 0b9aea2f9a..0000000000 --- a/go/res/values-sr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Додирните и задржите да бисте изабрали пречицу." - "Двапут додирните и задржите да бисте изабрали пречицу или користите прилагођене радње." - "Пречице" - "Пречице за %1$s" - diff --git a/go/res/values-sv/strings.xml b/go/res/values-sv/strings.xml deleted file mode 100644 index c3f434c276..0000000000 --- a/go/res/values-sv/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tryck länge om du vill ta upp en genväg." - "Tryck snabbt två gånger och håll kvar om du vill ta upp en genväg eller använda anpassade åtgärder." - "Genvägar" - "Genvägar för %1$s" - diff --git a/go/res/values-sw/strings.xml b/go/res/values-sw/strings.xml deleted file mode 100644 index 13c12e4a6c..0000000000 --- a/go/res/values-sw/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Gusa na ushikilie ili uchague njia ya mkato." - "Gusa mara mbili na ushikilie ile uchague njia ya mkato au utumie vitendo maalum." - "Njia za mkato" - "Njia za mkato za %1$s" - diff --git a/go/res/values-ta/strings.xml b/go/res/values-ta/strings.xml deleted file mode 100644 index 50059b65f9..0000000000 --- a/go/res/values-ta/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "குறுக்குவழியைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்." - "குறுக்குவழியை சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." - "குறுக்குவழிகள்" - "%1$s குறுக்குவழிகள்" - diff --git a/go/res/values-te/strings.xml b/go/res/values-te/strings.xml deleted file mode 100644 index 0bdf743342..0000000000 --- a/go/res/values-te/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "సత్వరమార్గాన్ని ఎంచుకోవడానికి తాకి & నొక్కి ఉంచండి." - "సత్వరమార్గాన్ని ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి &ఉంచండి." - "సత్వరమార్గాలు" - "%1$s సత్వరమార్గాలు" - diff --git a/go/res/values-th/strings.xml b/go/res/values-th/strings.xml deleted file mode 100644 index e73d89fb0e..0000000000 --- a/go/res/values-th/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "แตะค้างไว้เพื่อเลือกทางลัด" - "แตะสองครั้งค้างไว้เพื่อเลือกทางลัดหรือใช้การกระทำที่กำหนดเอง" - "ทางลัด" - "ทางลัด %1$s" - diff --git a/go/res/values-tl/strings.xml b/go/res/values-tl/strings.xml deleted file mode 100644 index 8f44ec5742..0000000000 --- a/go/res/values-tl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Pindutin nang matagal upang kumuha ng shortcut." - "I-double tap nang matagal upang kumuha ng shortcut o gumamit ng mga custom na pagkilos." - "Mga Shortcut" - "Mga shortcut sa %1$s" - diff --git a/go/res/values-tr/strings.xml b/go/res/values-tr/strings.xml deleted file mode 100644 index f0f3cce6d1..0000000000 --- a/go/res/values-tr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Kısayol seçmek için dokunun ve basılı tutun." - "Bir kısayolu seçmek veya özel işlemleri kullanmak için iki kez dokunun ve basılı tutun." - "Kısayollar" - "%1$s kısayolları" - diff --git a/go/res/values-uk/strings.xml b/go/res/values-uk/strings.xml deleted file mode 100644 index 8d1f58395b..0000000000 --- a/go/res/values-uk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Натисніть і утримуйте, щоб вибрати ярлик." - "Двічі натисніть і утримуйте, щоб вибрати ярлик, або виконайте іншу дію." - "Ярлики" - "Ярлики додатка %1$s" - diff --git a/go/res/values-ur/strings.xml b/go/res/values-ur/strings.xml deleted file mode 100644 index 46bd823d8e..0000000000 --- a/go/res/values-ur/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "کوئی شارٹ کٹ منتخب کرنے کیلئے ٹچ کریں اور دبائے رکھیں۔" - "کوئی شارٹ کٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور دبائے رکھیں۔" - "شارٹ کٹس" - "%1$s شارٹ کٹس" - diff --git a/go/res/values-uz/strings.xml b/go/res/values-uz/strings.xml deleted file mode 100644 index 318bc15722..0000000000 --- a/go/res/values-uz/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Yorliqni tanlab olish uchun bosib turing." - "Ikki marta bosib va bosib turgan holatda yorliqni tanlang yoki maxsus amaldan foydalaning." - "Yorliqlar" - "%1$s ilovasi yorliqlari" - diff --git a/go/res/values-vi/strings.xml b/go/res/values-vi/strings.xml deleted file mode 100644 index 1197619c57..0000000000 --- a/go/res/values-vi/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Chạm và giữ để chọn lối tắt." - "Nhấn đúp và giữ để chọn lối tắt hoặc sử dụng hành động tùy chỉnh." - "Lối tắt" - "Lối tắt %1$s" - diff --git a/go/res/values-zh-rCN/strings.xml b/go/res/values-zh-rCN/strings.xml deleted file mode 100644 index 57351d37f5..0000000000 --- a/go/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "触摸并按住快捷方式即可选择快捷方式。" - "点按两次并按住快捷方式即可选择快捷方式,您也可以使用自定义操作。" - "快捷方式" - "%1$s快捷方式" - diff --git a/go/res/values-zh-rHK/strings.xml b/go/res/values-zh-rHK/strings.xml deleted file mode 100644 index dea7749f68..0000000000 --- a/go/res/values-zh-rHK/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "按住捷徑即可選取捷徑。" - "扲兩下然後扲住就可以揀選捷徑,或者用自訂嘅操作。" - "捷徑" - "%1$s 捷徑" - diff --git a/go/res/values-zh-rTW/strings.xml b/go/res/values-zh-rTW/strings.xml deleted file mode 100644 index 07ae2ed5b4..0000000000 --- a/go/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "按住捷徑即可選取。" - "輕觸兩下並按住捷徑即可選取,你也可以使用自訂動作。" - "捷徑" - "「%1$s」捷徑" - diff --git a/go/res/values-zu/strings.xml b/go/res/values-zu/strings.xml deleted file mode 100644 index e5051df1f1..0000000000 --- a/go/res/values-zu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Thinta futhi ubambe ukuze ukhethe isinqamuleli." - "Thepha kabulu futhi ubambe ukuze ukhethe isinqamuleli noma usebenzise izenzo zangokwezifiso." - "Izinqamuleli" - "%1$s izinqamuleli" - diff --git a/go/res/values/strings.xml b/go/res/values/strings.xml deleted file mode 100644 index 8ef2e62430..0000000000 --- a/go/res/values/strings.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - Touch & hold to pick up a shortcut. - - Double-tap & hold to pick up a shortcut or use custom actions. - - Shortcuts - - - - %1$s shortcuts - - From 3ebe28a82b162475a22af425ae7742654ccd9c52 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 22:27:32 -0800 Subject: [PATCH 18/20] Fixing wrong directory pack for icon lib classes Change-Id: Ic3690198b1c6204e322ba7b0f46ccef5dfa97181 --- .../launcher3}/icons/BaseIconFactory.java | 0 .../launcher3}/icons/BitmapInfo.java | 0 .../launcher3}/icons/ColorExtractor.java | 0 .../launcher3}/icons/FixedScaleDrawable.java | 0 .../launcher3}/icons/IconNormalizer.java | 0 .../launcher3}/icons/ShadowGenerator.java | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/BaseIconFactory.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/BitmapInfo.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/ColorExtractor.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/FixedScaleDrawable.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/IconNormalizer.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/ShadowGenerator.java (100%) diff --git a/iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java rename to iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java b/iconloaderlib/src/com/android/launcher3/icons/BitmapInfo.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java rename to iconloaderlib/src/com/android/launcher3/icons/BitmapInfo.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java b/iconloaderlib/src/com/android/launcher3/icons/ColorExtractor.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java rename to iconloaderlib/src/com/android/launcher3/icons/ColorExtractor.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java b/iconloaderlib/src/com/android/launcher3/icons/FixedScaleDrawable.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java rename to iconloaderlib/src/com/android/launcher3/icons/FixedScaleDrawable.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java b/iconloaderlib/src/com/android/launcher3/icons/IconNormalizer.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java rename to iconloaderlib/src/com/android/launcher3/icons/IconNormalizer.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java b/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java rename to iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java From bb80025ef45b8318fe43f3ed22092ae944cb44bd Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Tue, 6 Nov 2018 10:57:17 -0500 Subject: [PATCH 19/20] Remove duplicate test I cloned the existing Instrumentation-based IntSetTest class to be our first Robolectric test. Now Robolectric is working, we can delete the Instrumentation test version. Change-Id: I3adcfc451988a908c002b769b398348cb1782f1d --- .../android/launcher3/util/IntSetTest.java | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 tests/src/com/android/launcher3/util/IntSetTest.java diff --git a/tests/src/com/android/launcher3/util/IntSetTest.java b/tests/src/com/android/launcher3/util/IntSetTest.java deleted file mode 100644 index 934b749f5e..0000000000 --- a/tests/src/com/android/launcher3/util/IntSetTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2018 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.util; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * Unit tests for {@link IntSet} - */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class IntSetTest { - - @Test - public void testDuplicateEntries() { - IntSet set = new IntSet(); - - set.add(2); - assertEquals(1, set.size()); - - set.add(2); - assertEquals(1, set.size()); - assertTrue(set.contains(2)); - assertFalse(set.contains(1)); - - set.add(1); - assertEquals(2, set.size()); - assertTrue(set.contains(2)); - assertTrue(set.contains(1)); - - - set.add(10); - assertEquals(3, set.size()); - - assertEquals("1, 2, 10", set.mArray.toConcatString()); - } -} From 066ace1b8897229445c0fb3515156ef70bdb05e2 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 11:08:31 -0800 Subject: [PATCH 20/20] Replacing setAlphaComponent with setAlphaComponentBound for better animation interpolation setAlphaComponent throws expetion for invalid range, which can cause brashes in overshoot interpolation Bug: 118390004 Change-Id: Ic9c5ff3d660eba353b982c4c47ccfaf329b3e296 --- .../launcher3/icons/BaseIconFactory.java | 8 ++--- .../launcher3/icons/GraphicsUtils.java | 36 +++++++++++++++++++ .../launcher3/icons/ShadowGenerator.java | 8 ++--- .../quickstep/views/ShelfScrimView.java | 9 +++-- src/com/android/launcher3/BubbleTextView.java | 7 ++-- .../folder/FolderAnimationManager.java | 7 ++-- .../launcher3/folder/PreviewBackground.java | 7 ++-- .../launcher3/graphics/IconPalette.java | 4 ++- .../graphics/WorkspaceAndHotseatScrim.java | 6 ++-- .../launcher3/icons/BaseIconCache.java | 4 +-- .../settings/PreferenceHighlighter.java | 6 ++-- .../views/DoubleShadowBubbleTextView.java | 12 +++---- .../android/launcher3/views/ScrimView.java | 6 ++-- .../launcher3/widget/BaseWidgetSheet.java | 7 ++-- 14 files changed, 80 insertions(+), 47 deletions(-) create mode 100644 iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java diff --git a/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java index 681c03c7ca..243903cc8c 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java +++ b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java @@ -18,8 +18,6 @@ import android.os.Build; import android.os.Process; import android.os.UserHandle; -import com.android.launcher3.icons.R; - import static android.graphics.Paint.DITHER_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; import static com.android.launcher3.icons.ShadowGenerator.BLUR_FACTOR; @@ -81,6 +79,7 @@ public class BaseIconFactory { return mNormalizer; } + @SuppressWarnings("deprecation") public BitmapInfo createIconBitmap(Intent.ShortcutIconResource iconRes) { try { Resources resources = mPm.getResourcesForApplication(iconRes.packageName); @@ -184,8 +183,7 @@ public class BaseIconFactory { RectF outIconBounds, float[] outScale) { float scale = 1f; - if (shrinkNonAdaptiveIcons) { - boolean[] outShape = new boolean[1]; + if (shrinkNonAdaptiveIcons && ATLEAST_OREO) { if (mWrapperIcon == null) { mWrapperIcon = mContext.getDrawable(R.drawable.adaptive_icon_drawable_wrapper) .mutate(); @@ -193,7 +191,7 @@ public class BaseIconFactory { AdaptiveIconDrawable dr = (AdaptiveIconDrawable) mWrapperIcon; dr.setBounds(0, 0, 1, 1); scale = getNormalizer().getScale(icon, outIconBounds); - if (ATLEAST_OREO && !(icon instanceof AdaptiveIconDrawable)) { + if (!(icon instanceof AdaptiveIconDrawable)) { FixedScaleDrawable fsd = ((FixedScaleDrawable) dr.getForeground()); fsd.setDrawable(icon); fsd.setScale(scale); diff --git a/iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java b/iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java new file mode 100644 index 0000000000..b096cecb5c --- /dev/null +++ b/iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018 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.icons; + +import androidx.annotation.ColorInt; + +public class GraphicsUtils { + + /** + * Set the alpha component of {@code color} to be {@code alpha}. Unlike the support lib version, + * it bounds the alpha in valid range instead of throwing an exception to allow for safer + * interpolation of color animations + */ + @ColorInt + public static int setColorAlphaBound(int color, int alpha) { + if (alpha < 0) { + alpha = 0; + } else if (alpha > 255) { + alpha = 255; + } + return (color & 0x00ffffff) | (alpha << 24); + } +} diff --git a/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java b/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java index 6491b7ec15..455c58c91b 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java +++ b/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java @@ -16,6 +16,8 @@ package com.android.launcher3.icons; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BlurMaskFilter; @@ -27,8 +29,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; -import androidx.core.graphics.ColorUtils; - /** * Utility class to add shadows to bitmaps. */ @@ -142,12 +142,12 @@ public class ShadowGenerator { // Key shadow p.setShadowLayer(shadowBlur, 0, keyShadowDistance, - ColorUtils.setAlphaComponent(Color.BLACK, keyShadowAlpha)); + setColorAlphaBound(Color.BLACK, keyShadowAlpha)); c.drawRoundRect(bounds, radius, radius, p); // Ambient shadow p.setShadowLayer(shadowBlur, 0, 0, - ColorUtils.setAlphaComponent(Color.BLACK, ambientShadowAlpha)); + setColorAlphaBound(Color.BLACK, ambientShadowAlpha)); c.drawRoundRect(bounds, radius, radius, p); if (Color.alpha(color) < 255) { diff --git a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java index 896557550a..d2b3bcc170 100644 --- a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java +++ b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java @@ -18,8 +18,7 @@ package com.android.quickstep.views; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; - -import static androidx.core.graphics.ColorUtils.setAlphaComponent; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.content.Context; import android.graphics.Canvas; @@ -141,7 +140,7 @@ public class ShelfScrimView extends ScrimView { int alpha = Math.round(Utilities.mapToRange( mProgress, mMidProgress, 1, mMidAlpha, 0, ACCEL)); - mShelfColor = setAlphaComponent(mEndScrim, alpha); + mShelfColor = setColorAlphaBound(mEndScrim, alpha); } else { mDragHandleOffset += mShiftRange * (mMidProgress - mProgress); @@ -149,12 +148,12 @@ public class ShelfScrimView extends ScrimView { int alpha = Math.round( Utilities.mapToRange(mProgress, (float) 0, mMidProgress, (float) mEndAlpha, (float) mMidAlpha, Interpolators.clampToProgress(ACCEL, 0.5f, 1f))); - mShelfColor = setAlphaComponent(mEndScrim, alpha); + mShelfColor = setColorAlphaBound(mEndScrim, alpha); int remainingScrimAlpha = Math.round( Utilities.mapToRange(mProgress, (float) 0, mMidProgress, mMaxScrimAlpha, (float) 0, LINEAR)); - mRemainingScreenColor = setAlphaComponent(mScrimColor, remainingScrimAlpha); + mRemainingScreenColor = setColorAlphaBound(mScrimColor, remainingScrimAlpha); } } diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 8513d63a78..455fd1866d 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -53,8 +55,6 @@ import com.android.launcher3.model.PackageItemInfo; import java.text.NumberFormat; -import androidx.core.graphics.ColorUtils; - /** * TextView that draws a bubble behind the text. We cannot use a LineBackgroundSpan * because we want to make the bubble taller than the text and TextView's clip is @@ -473,8 +473,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, // Special case to prevent text shadows in high contrast mode return Color.TRANSPARENT; } - return ColorUtils.setAlphaComponent( - mTextColor, Math.round(Color.alpha(mTextColor) * mTextAlpha)); + return setColorAlphaBound(mTextColor, Math.round(Color.alpha(mTextColor) * mTextAlpha)); } /** diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index fa890b99df..2461e284dc 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -20,6 +20,7 @@ import static com.android.launcher3.BubbleTextView.TEXT_ALPHA_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; import static com.android.launcher3.folder.FolderShape.getShape; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -46,8 +47,6 @@ import com.android.launcher3.util.Themes; import java.util.List; -import androidx.core.graphics.ColorUtils; - /** * Manages the opening and closing animations for a {@link Folder}. * @@ -153,8 +152,8 @@ public class FolderAnimationManager { // Set up the Folder background. final int finalColor = Themes.getAttrColor(mContext, android.R.attr.colorPrimary); - final int initialColor = - ColorUtils.setAlphaComponent(finalColor, mPreviewBackground.getBackgroundAlpha()); + final int initialColor = setColorAlphaBound( + finalColor, mPreviewBackground.getBackgroundAlpha()); mFolderBackground.mutate(); mFolderBackground.setColor(mIsOpening ? initialColor : finalColor); diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java index 8443953bd9..f2683a5f9a 100644 --- a/src/com/android/launcher3/folder/PreviewBackground.java +++ b/src/com/android/launcher3/folder/PreviewBackground.java @@ -17,6 +17,7 @@ package com.android.launcher3.folder; import static com.android.launcher3.folder.FolderShape.getShape; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -41,8 +42,6 @@ import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.util.Themes; -import androidx.core.graphics.ColorUtils; - /** * This object represents a FolderIcon preview background. It stores drawing / measurement * information, handles drawing, and animation (accept state <--> rest state). @@ -189,7 +188,7 @@ public class PreviewBackground { public int getBgColor() { int alpha = (int) Math.min(MAX_BG_OPACITY, BG_OPACITY * mColorMultiplier); - return ColorUtils.setAlphaComponent(mBgColor, alpha); + return setColorAlphaBound(mBgColor, alpha); } public int getBadgeColor() { @@ -275,7 +274,7 @@ public class PreviewBackground { } public void drawBackgroundStroke(Canvas canvas) { - mPaint.setColor(ColorUtils.setAlphaComponent(mBgColor, mStrokeAlpha)); + mPaint.setColor(setColorAlphaBound(mBgColor, mStrokeAlpha)); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mStrokeWidth); diff --git a/src/com/android/launcher3/graphics/IconPalette.java b/src/com/android/launcher3/graphics/IconPalette.java index cda07c31a2..3d4a1001a2 100644 --- a/src/com/android/launcher3/graphics/IconPalette.java +++ b/src/com/android/launcher3/graphics/IconPalette.java @@ -16,6 +16,8 @@ package com.android.launcher3.graphics; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.app.Notification; import android.content.Context; import android.graphics.Color; @@ -147,7 +149,7 @@ public class IconPalette { } public static int getMutedColor(int color, float whiteScrimAlpha) { - int whiteScrim = ColorUtils.setAlphaComponent(Color.WHITE, (int) (255 * whiteScrimAlpha)); + int whiteScrim = setColorAlphaBound(Color.WHITE, (int) (255 * whiteScrimAlpha)); return ColorUtils.compositeColors(whiteScrim, color); } } diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index 23d647b441..66f9dbfcdc 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -19,6 +19,8 @@ package com.android.launcher3.graphics; import static android.content.Intent.ACTION_SCREEN_OFF; import static android.content.Intent.ACTION_USER_PRESENT; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.animation.ObjectAnimator; import android.content.BroadcastReceiver; import android.content.Context; @@ -174,7 +176,7 @@ public class WorkspaceAndHotseatScrim implements canvas.clipRect(mHighlightRect, Region.Op.DIFFERENCE); } - canvas.drawColor(ColorUtils.setAlphaComponent(mFullScrimColor, mScrimAlpha)); + canvas.drawColor(setColorAlphaBound(mFullScrimColor, mScrimAlpha)); canvas.restore(); } @@ -303,7 +305,7 @@ public class WorkspaceAndHotseatScrim implements LinearGradient lg = new LinearGradient(0, 0, 0, gradientHeight, new int[]{ 0x00FFFFFF, - ColorUtils.setAlphaComponent(Color.WHITE, (int) (0xFF * 0.95)), + setColorAlphaBound(Color.WHITE, (int) (0xFF * 0.95)), 0xFFFFFFFF}, new float[]{0f, 0.8f, 1f}, Shader.TileMode.CLAMP); diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 8f3b2bb77d..1f810b39f1 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -16,6 +16,7 @@ package com.android.launcher3.icons; import static com.android.launcher3.icons.BitmapInfo.LOW_RES_ICON; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.content.ComponentName; import android.content.ContentValues; @@ -56,7 +57,6 @@ import java.util.HashMap; import java.util.HashSet; import androidx.annotation.NonNull; -import androidx.core.graphics.ColorUtils; public class BaseIconCache { @@ -435,7 +435,7 @@ public class BaseIconCache { Long.toString(mUserManager.getSerialNumberForUser(cacheKey.user))}); if (c.moveToNext()) { // Set the alpha to be 255, so that we never have a wrong color - entry.color = ColorUtils.setAlphaComponent(c.getInt(0), 255); + entry.color = setColorAlphaBound(c.getInt(0), 255); entry.title = c.getString(1); if (entry.title == null) { entry.title = ""; diff --git a/src/com/android/launcher3/settings/PreferenceHighlighter.java b/src/com/android/launcher3/settings/PreferenceHighlighter.java index 4ed4cf1133..8ba814686f 100644 --- a/src/com/android/launcher3/settings/PreferenceHighlighter.java +++ b/src/com/android/launcher3/settings/PreferenceHighlighter.java @@ -15,7 +15,7 @@ */ package com.android.launcher3.settings; -import static androidx.core.graphics.ColorUtils.setAlphaComponent; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -57,7 +57,7 @@ public class PreferenceHighlighter extends ItemDecoration implements Runnable { private static final long HIGHLIGHT_DURATION = 15000L; private static final long HIGHLIGHT_FADE_OUT_DURATION = 500L; private static final long HIGHLIGHT_FADE_IN_DURATION = 200L; - private static final int END_COLOR = setAlphaComponent(Color.WHITE, 0); + private static final int END_COLOR = setColorAlphaBound(Color.WHITE, 0); private final Paint mPaint = new Paint(); private final RecyclerView mRv; @@ -91,7 +91,7 @@ public class PreferenceHighlighter extends ItemDecoration implements Runnable { if (!mHighLightStarted) { // Start highlight - int colorTo = setAlphaComponent(Themes.getColorAccent(mRv.getContext()), 66); + int colorTo = setColorAlphaBound(Themes.getColorAccent(mRv.getContext()), 66); ObjectAnimator anim = ObjectAnimator.ofArgb(this, HIGHLIGHT_COLOR, END_COLOR, colorTo); anim.setDuration(HIGHLIGHT_FADE_IN_DURATION); anim.setRepeatMode(ValueAnimator.REVERSE); diff --git a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java index 64e166eeb8..323eecb91b 100644 --- a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java +++ b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java @@ -16,6 +16,8 @@ package com.android.launcher3.views; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -26,8 +28,6 @@ import android.widget.TextView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.R; -import androidx.core.graphics.ColorUtils; - /** * Extension of {@link BubbleTextView} which draws two shadows on the text (ambient and key shadows} */ @@ -60,7 +60,7 @@ public class DoubleShadowBubbleTextView extends BubbleTextView { // We enhance the shadow by drawing the shadow twice getPaint().setShadowLayer(mShadowInfo.ambientShadowBlur, 0, 0, - ColorUtils.setAlphaComponent(mShadowInfo.ambientShadowColor, alpha)); + setColorAlphaBound(mShadowInfo.ambientShadowColor, alpha)); drawWithoutBadge(canvas); canvas.save(); @@ -69,7 +69,7 @@ public class DoubleShadowBubbleTextView extends BubbleTextView { getScrollY() + getHeight()); getPaint().setShadowLayer(mShadowInfo.keyShadowBlur, 0.0f, mShadowInfo.keyShadowOffset, - ColorUtils.setAlphaComponent(mShadowInfo.keyShadowColor, alpha)); + setColorAlphaBound(mShadowInfo.keyShadowColor, alpha)); drawWithoutBadge(canvas); canvas.restore(); @@ -107,11 +107,11 @@ public class DoubleShadowBubbleTextView extends BubbleTextView { return true; } else if (ambientShadowAlpha > 0) { textView.getPaint().setShadowLayer(ambientShadowBlur, 0, 0, - ColorUtils.setAlphaComponent(ambientShadowColor, textAlpha)); + setColorAlphaBound(ambientShadowColor, textAlpha)); return true; } else if (keyShadowAlpha > 0) { textView.getPaint().setShadowLayer(keyShadowBlur, 0.0f, keyShadowOffset, - ColorUtils.setAlphaComponent(keyShadowColor, textAlpha)); + setColorAlphaBound(keyShadowColor, textAlpha)); return true; } else { return false; diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 6fd84db26a..deb09654cf 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -22,9 +22,9 @@ import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.DEACCEL; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import static androidx.core.graphics.ColorUtils.compositeColors; -import static androidx.core.graphics.ColorUtils.setAlphaComponent; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -182,7 +182,7 @@ public class ScrimView extends View implements Insettable, OnChangeListener, @Override public void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo) { mScrimColor = wallpaperColorInfo.getMainColor(); - mEndFlatColor = compositeColors(mEndScrim, setAlphaComponent( + mEndFlatColor = compositeColors(mEndScrim, setColorAlphaBound( mScrimColor, Math.round(mMaxScrimAlpha * 255))); mEndFlatColorAlpha = Color.alpha(mEndFlatColor); updateColors(); @@ -201,7 +201,7 @@ public class ScrimView extends View implements Insettable, OnChangeListener, public void reInitUi() { } protected void updateColors() { - mCurrentFlatColor = mProgress >= 1 ? 0 : setAlphaComponent( + mCurrentFlatColor = mProgress >= 1 ? 0 : setColorAlphaBound( mEndFlatColor, Math.round((1 - mProgress) * mEndFlatColorAlpha)); } diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java index 48c18f8538..673b3cc14f 100644 --- a/src/com/android/launcher3/widget/BaseWidgetSheet.java +++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java @@ -17,6 +17,7 @@ package com.android.launcher3.widget; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; import android.content.Context; @@ -42,8 +43,6 @@ import com.android.launcher3.util.Themes; import com.android.launcher3.views.AbstractSlideInView; import com.android.launcher3.views.BaseDragLayer; -import androidx.core.graphics.ColorUtils; - /** * Base class for various widgets popup */ @@ -162,11 +161,11 @@ abstract class BaseWidgetSheet extends AbstractSlideInView private static View createColorScrim(Context context) { View view = new View(context); - view.forceHasOverlappingRendering(false); + if (Utilities.ATLEAST_NOUGAT) view.forceHasOverlappingRendering(false); WallpaperColorInfo colors = WallpaperColorInfo.getInstance(context); int alpha = context.getResources().getInteger(R.integer.extracted_color_gradient_alpha); - view.setBackgroundColor(ColorUtils.setAlphaComponent(colors.getSecondaryColor(), alpha)); + view.setBackgroundColor(setColorAlphaBound(colors.getSecondaryColor(), alpha)); BaseDragLayer.LayoutParams lp = new BaseDragLayer.LayoutParams(MATCH_PARENT, MATCH_PARENT); lp.ignoreInsets = true;