diff --git a/Android.mk b/Android.mk index fcd4a94efc..7805b32e8e 100644 --- a/Android.mk +++ b/Android.mk @@ -67,7 +67,10 @@ LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-java-files-under, src_shortcuts_overrides) \ - $(call all-java-files-under, src_ui_overrides) + $(call all-java-files-under, src_ui_overrides) \ + $(call all-java-files-under, ext_tests/src) + +LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/ext_tests/res LOCAL_PROGUARD_FLAG_FILES := proguard.flags # Proguard is disable for testing. Derivarive prjects to keep proguard enabled diff --git a/ext_tests/res/values/overrides.xml b/ext_tests/res/values/overrides.xml new file mode 100644 index 0000000000..3f071d4219 --- /dev/null +++ b/ext_tests/res/values/overrides.xml @@ -0,0 +1,5 @@ + + + com.android.launcher3.testing.DebugTestInformationHandler + + diff --git a/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java b/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java new file mode 100644 index 0000000000..ad21106759 --- /dev/null +++ b/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.testing; + +import static android.graphics.Bitmap.Config.ARGB_8888; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Debug; +import android.system.Os; +import android.view.View; + +import androidx.annotation.Keep; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * Class to handle requests from tests, including debug ones. + */ +public class DebugTestInformationHandler extends TestInformationHandler { + private static LinkedList sLeaks; + private static Collection sEvents; + + public DebugTestInformationHandler(Context context) { + init(context); + } + + private static void runGcAndFinalizersSync() { + Runtime.getRuntime().gc(); + Runtime.getRuntime().runFinalization(); + + final CountDownLatch fence = new CountDownLatch(1); + createFinalizationObserver(fence); + try { + do { + Runtime.getRuntime().gc(); + Runtime.getRuntime().runFinalization(); + } while (!fence.await(100, TimeUnit.MILLISECONDS)); + } catch (InterruptedException ex) { + throw new RuntimeException(ex); + } + } + + // Create the observer in the scope of a method to minimize the chance that + // it remains live in a DEX/machine register at the point of the fence guard. + // This must be kept to avoid R8 inlining it. + @Keep + private static void createFinalizationObserver(CountDownLatch fence) { + new Object() { + @Override + protected void finalize() throws Throwable { + try { + fence.countDown(); + } finally { + super.finalize(); + } + } + }; + } + + @Override + public Bundle call(String method) { + final Bundle response = new Bundle(); + switch (method) { + case TestProtocol.REQUEST_APP_LIST_FREEZE_FLAGS: { + return getLauncherUIProperty(Bundle::putInt, + l -> l.getAppsView().getAppsStore().getDeferUpdatesFlags()); + } + + case TestProtocol.REQUEST_ENABLE_DEBUG_TRACING: + TestProtocol.sDebugTracing = true; + return response; + + case TestProtocol.REQUEST_DISABLE_DEBUG_TRACING: + TestProtocol.sDebugTracing = false; + return response; + + case TestProtocol.REQUEST_PID: { + response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, Os.getpid()); + return response; + } + + case TestProtocol.REQUEST_TOTAL_PSS_KB: { + runGcAndFinalizersSync(); + Debug.MemoryInfo mem = new Debug.MemoryInfo(); + Debug.getMemoryInfo(mem); + response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, mem.getTotalPss()); + return response; + } + + case TestProtocol.REQUEST_JAVA_LEAK: { + if (sLeaks == null) sLeaks = new LinkedList(); + + // Allocate and dirty the memory. + final int leakSize = 1024 * 1024; + final byte[] bytes = new byte[leakSize]; + for (int i = 0; i < leakSize; i += 239) { + bytes[i] = (byte) (i % 256); + } + sLeaks.add(bytes); + return response; + } + + case TestProtocol.REQUEST_NATIVE_LEAK: { + if (sLeaks == null) sLeaks = new LinkedList(); + + // Allocate and dirty a bitmap. + final Bitmap bitmap = Bitmap.createBitmap(512, 512, ARGB_8888); + bitmap.eraseColor(Color.RED); + sLeaks.add(bitmap); + return response; + } + + case TestProtocol.REQUEST_VIEW_LEAK: { + if (sLeaks == null) sLeaks = new LinkedList(); + sLeaks.add(new View(mContext)); + return response; + } + + case TestProtocol.REQUEST_START_EVENT_LOGGING: { + sEvents = new ArrayList<>(); + TestLogging.setEventConsumer( + (sequence, event) -> { + final Collection events = sEvents; + if (events != null) { + synchronized (events) { + events.add(sequence + '/' + event); + } + } + }); + return response; + } + + case TestProtocol.REQUEST_STOP_EVENT_LOGGING: { + TestLogging.setEventConsumer(null); + sEvents = null; + return response; + } + + case TestProtocol.REQUEST_GET_TEST_EVENTS: { + synchronized (sEvents) { + response.putStringArrayList( + TestProtocol.TEST_INFO_RESPONSE_FIELD, new ArrayList<>(sEvents)); + } + return response; + } + + default: + return super.call(method); + } + } +} diff --git a/protos/launcher_atom.proto b/protos/launcher_atom.proto index d1185bd5bc..98ce9af2d6 100644 --- a/protos/launcher_atom.proto +++ b/protos/launcher_atom.proto @@ -96,8 +96,21 @@ enum Attribute { ADD_TO_HOMESCREEN = 6; // play install + launcher home setting ALLAPPS_PREDICTION = 7; // from prediction bar in all apps container HOTSEAT_PREDICTION = 8; // from prediction bar in hotseat container - SUGGESTED_LABEL = 9; // folder icon's label was suggested - MANUAL_LABEL = 10; // folder icon's label was manually edited + + // Folder's label is one of the non-empty suggested values. + SUGGESTED_LABEL = 9; + + // Folder's label is non-empty, manually entered by the user + // and different from any of suggested values. + MANUAL_LABEL = 10; + + // Folder's label is not yet assigned( i.e., title == null). + // Eligible for auto-labeling. + UNLABELED = 11; + + // Folder's label is empty(i.e., title == ""). + // Not eligible for auto-labeling. + EMPTY_LABEL = 12; } // Main app icons diff --git a/quickstep/AndroidManifest-launcher.xml b/quickstep/AndroidManifest-launcher.xml index 527bfc3854..60afddb0a8 100644 --- a/quickstep/AndroidManifest-launcher.xml +++ b/quickstep/AndroidManifest-launcher.xml @@ -52,7 +52,7 @@ android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize" android:resizeableActivity="true" android:resumeWhilePausing="true" - android:taskAffinity="${packageName}.launcher" + android:taskAffinity="" android:enabled="true"> diff --git a/quickstep/AndroidManifest.xml b/quickstep/AndroidManifest.xml index b2286f1bd7..e49f2ecdc0 100644 --- a/quickstep/AndroidManifest.xml +++ b/quickstep/AndroidManifest.xml @@ -22,11 +22,16 @@ xmlns:tools="http://schemas.android.com/tools" package="com.android.launcher3" > + + + - + + + + + + diff --git a/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml b/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml index 7b3e37835f..cd64a94bab 100644 --- a/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml +++ b/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml @@ -13,25 +13,30 @@ See the License for the specific language governing permissions and limitations under the License. --> - - + android:clipChildren="false"> - + - + + + + diff --git a/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml b/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml index b9621e489f..36c9b00e07 100644 --- a/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml +++ b/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml @@ -72,33 +72,42 @@ android:layout_height="0dp" launcher:containerType="hotseat" /> - -