Merging ub-launcher3-qt-qpr1-dev, build 5884665
am: 3adf6ff5a2
Change-Id: I624913ae82d86920c2013bea175d95c32be07d1b
This commit is contained in:
+1
@@ -102,6 +102,7 @@ final class AppToOverviewAnimationProvider<T extends BaseDraggingActivity> imple
|
||||
anim.addListener(new AnimationSuccessListener() {
|
||||
@Override
|
||||
public void onAnimationSuccess(Animator animator) {
|
||||
mHelper.onSwipeUpToRecentsComplete(mActivity);
|
||||
if (mRecentsView != null) {
|
||||
mRecentsView.animateUpRunningTaskIconScale();
|
||||
}
|
||||
|
||||
@@ -941,6 +941,10 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isTaskIconScaledDown(TaskView taskView) {
|
||||
return mRunningTaskIconScaledDown && getRunningTaskView() == taskView;
|
||||
}
|
||||
|
||||
private void applyRunningTaskIconScale() {
|
||||
TaskView firstTask = getRunningTaskView();
|
||||
if (firstTask != null) {
|
||||
|
||||
@@ -28,7 +28,6 @@ import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.animation.ValueAnimator.AnimatorUpdateListener;
|
||||
import android.app.ActivityOptions;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
@@ -54,7 +53,6 @@ import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.logging.UserEventDispatcher;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
|
||||
@@ -818,8 +816,11 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
/ (getWidth() + currentInsetsLeft + currentInsetsRight));
|
||||
}
|
||||
|
||||
// Some of the items in here are dependent on the current fullscreen params
|
||||
setIconScaleAndDim(progress, true /* invert */);
|
||||
if (!getRecentsView().isTaskIconScaledDown(this)) {
|
||||
// Some of the items in here are dependent on the current fullscreen params, but don't
|
||||
// update them if the icon is supposed to be scaled down.
|
||||
setIconScaleAndDim(progress, true /* invert */);
|
||||
}
|
||||
|
||||
thumbnail.setFullscreenParams(mCurrentFullscreenParams);
|
||||
mOutlineProvider.setFullscreenParams(mCurrentFullscreenParams);
|
||||
|
||||
@@ -890,23 +890,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
|
||||
mTotalMotionX = 0;
|
||||
mActivePointerId = ev.getPointerId(0);
|
||||
|
||||
/*
|
||||
* If being flinged and user touches the screen, initiate drag;
|
||||
* otherwise don't. mScroller.isFinished should be false when
|
||||
* being flinged.
|
||||
*/
|
||||
final int xDist = Math.abs(mScroller.getFinalPos() - mScroller.getCurrPos());
|
||||
final boolean finishedScrolling = (mScroller.isFinished() || xDist < mTouchSlop / 3);
|
||||
|
||||
if (finishedScrolling) {
|
||||
mIsBeingDragged = false;
|
||||
if (!mScroller.isFinished() && !mFreeScroll) {
|
||||
setCurrentPage(getNextPage());
|
||||
pageEndTransition();
|
||||
}
|
||||
} else {
|
||||
mIsBeingDragged = true;
|
||||
}
|
||||
updateIsBeingDraggedOnTouchDown();
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -929,6 +913,25 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
|
||||
return mIsBeingDragged;
|
||||
}
|
||||
|
||||
/**
|
||||
* If being flinged and user touches the screen, initiate drag; otherwise don't.
|
||||
*/
|
||||
private void updateIsBeingDraggedOnTouchDown() {
|
||||
// mScroller.isFinished should be false when being flinged.
|
||||
final int xDist = Math.abs(mScroller.getFinalPos() - mScroller.getCurrPos());
|
||||
final boolean finishedScrolling = (mScroller.isFinished() || xDist < mTouchSlop / 3);
|
||||
|
||||
if (finishedScrolling) {
|
||||
mIsBeingDragged = false;
|
||||
if (!mScroller.isFinished() && !mFreeScroll) {
|
||||
setCurrentPage(getNextPage());
|
||||
pageEndTransition();
|
||||
}
|
||||
} else {
|
||||
mIsBeingDragged = true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isHandlingTouch() {
|
||||
return mIsBeingDragged;
|
||||
}
|
||||
@@ -1104,6 +1107,8 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
|
||||
|
||||
switch (action & MotionEvent.ACTION_MASK) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
updateIsBeingDraggedOnTouchDown();
|
||||
|
||||
/*
|
||||
* If being flinged and user touches, stop the fling. isFinished
|
||||
* will be false if being flinged.
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.android.launcher3.compat;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageInstaller;
|
||||
import android.content.pm.PackageInstaller.SessionInfo;
|
||||
import android.os.Process;
|
||||
import android.os.UserHandle;
|
||||
|
||||
@@ -29,6 +30,7 @@ import java.util.List;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
|
||||
public abstract class PackageInstallerCompat {
|
||||
|
||||
@@ -52,19 +54,19 @@ public abstract class PackageInstallerCompat {
|
||||
}
|
||||
}
|
||||
|
||||
public static UserHandle getUserHandle(PackageInstaller.SessionInfo info) {
|
||||
public static UserHandle getUserHandle(SessionInfo info) {
|
||||
return Utilities.ATLEAST_Q ? info.getUser() : Process.myUserHandle();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a map of active installs to their progress
|
||||
*/
|
||||
public abstract HashMap<String, PackageInstaller.SessionInfo> updateAndGetActiveSessionCache();
|
||||
public abstract HashMap<PackageUserKey, SessionInfo> updateAndGetActiveSessionCache();
|
||||
|
||||
/**
|
||||
* @return an active SessionInfo for {@param pkg} or null if none exists.
|
||||
*/
|
||||
public abstract PackageInstaller.SessionInfo getActiveSessionInfo(UserHandle user, String pkg);
|
||||
public abstract SessionInfo getActiveSessionInfo(UserHandle user, String pkg);
|
||||
|
||||
public abstract void onStop();
|
||||
|
||||
@@ -75,7 +77,7 @@ public abstract class PackageInstallerCompat {
|
||||
public final int progress;
|
||||
public final UserHandle user;
|
||||
|
||||
private PackageInstallInfo(@NonNull PackageInstaller.SessionInfo info) {
|
||||
private PackageInstallInfo(@NonNull SessionInfo info) {
|
||||
this.state = STATUS_INSTALLING;
|
||||
this.packageName = info.getAppPackageName();
|
||||
this.componentName = new ComponentName(packageName, "");
|
||||
@@ -91,7 +93,7 @@ public abstract class PackageInstallerCompat {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public static PackageInstallInfo fromInstallingState(PackageInstaller.SessionInfo info) {
|
||||
public static PackageInstallInfo fromInstallingState(SessionInfo info) {
|
||||
return new PackageInstallInfo(info);
|
||||
}
|
||||
|
||||
@@ -101,7 +103,7 @@ public abstract class PackageInstallerCompat {
|
||||
|
||||
}
|
||||
|
||||
public abstract List<PackageInstaller.SessionInfo> getAllVerifiedSessions();
|
||||
public abstract List<SessionInfo> getAllVerifiedSessions();
|
||||
|
||||
/**
|
||||
* Returns true if a promise icon was already added to the home screen for {@param sessionId}.
|
||||
|
||||
@@ -90,12 +90,13 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat {
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashMap<String, SessionInfo> updateAndGetActiveSessionCache() {
|
||||
HashMap<String, SessionInfo> activePackages = new HashMap<>();
|
||||
public HashMap<PackageUserKey, SessionInfo> updateAndGetActiveSessionCache() {
|
||||
HashMap<PackageUserKey, SessionInfo> activePackages = new HashMap<>();
|
||||
for (SessionInfo info : getAllVerifiedSessions()) {
|
||||
addSessionInfoToCache(info, getUserHandle(info));
|
||||
if (info.getAppPackageName() != null) {
|
||||
activePackages.put(info.getAppPackageName(), info);
|
||||
activePackages.put(new PackageUserKey(info.getAppPackageName(),
|
||||
getUserHandle(info)), info);
|
||||
mActiveSessions.put(info.getSessionId(),
|
||||
new PackageUserKey(info.getAppPackageName(), getUserHandle(info)));
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.android.launcher3.ItemInfo;
|
||||
import com.android.launcher3.LauncherAppWidgetInfo;
|
||||
import com.android.launcher3.LauncherSettings;
|
||||
import com.android.launcher3.util.MultiHashMap;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -34,6 +35,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static android.os.Process.myUserHandle;
|
||||
|
||||
/**
|
||||
* Helper class to send broadcasts to package installers that have:
|
||||
* - Items on the first screen
|
||||
@@ -60,7 +63,7 @@ public class FirstScreenBroadcast {
|
||||
|
||||
private final MultiHashMap<String, String> mPackagesForInstaller;
|
||||
|
||||
public FirstScreenBroadcast(HashMap<String, SessionInfo> sessionInfoForPackage) {
|
||||
public FirstScreenBroadcast(HashMap<PackageUserKey, SessionInfo> sessionInfoForPackage) {
|
||||
mPackagesForInstaller = getPackagesForInstaller(sessionInfoForPackage);
|
||||
}
|
||||
|
||||
@@ -69,11 +72,13 @@ public class FirstScreenBroadcast {
|
||||
* of packages with active sessions for that installer.
|
||||
*/
|
||||
private MultiHashMap<String, String> getPackagesForInstaller(
|
||||
HashMap<String, SessionInfo> sessionInfoForPackage) {
|
||||
HashMap<PackageUserKey, SessionInfo> sessionInfoForPackage) {
|
||||
MultiHashMap<String, String> packagesForInstaller = new MultiHashMap<>();
|
||||
for (Map.Entry<String, SessionInfo> entry : sessionInfoForPackage.entrySet()) {
|
||||
packagesForInstaller.addToList(entry.getValue().getInstallerPackageName(),
|
||||
entry.getKey());
|
||||
for (Map.Entry<PackageUserKey, SessionInfo> entry : sessionInfoForPackage.entrySet()) {
|
||||
if (myUserHandle().equals(entry.getKey().mUser)) {
|
||||
packagesForInstaller.addToList(entry.getValue().getInstallerPackageName(),
|
||||
entry.getKey().mPackageName);
|
||||
}
|
||||
}
|
||||
return packagesForInstaller;
|
||||
}
|
||||
|
||||
@@ -34,10 +34,12 @@ import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction;
|
||||
import com.android.launcher3.util.GridOccupancy;
|
||||
import com.android.launcher3.util.IntArray;
|
||||
import com.android.launcher3.util.IntSparseArrayMap;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
@@ -970,8 +972,9 @@ public class GridSizeMigrationTask {
|
||||
.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES)) {
|
||||
validPackages.add(info.packageName);
|
||||
}
|
||||
validPackages.addAll(PackageInstallerCompat.getInstance(context)
|
||||
.updateAndGetActiveSessionCache().keySet());
|
||||
PackageInstallerCompat.getInstance(context)
|
||||
.updateAndGetActiveSessionCache().keySet()
|
||||
.forEach(packageUserKey -> validPackages.add(packageUserKey.mPackageName));
|
||||
return validPackages;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.android.launcher3.model;
|
||||
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.compat.PackageInstallerCompat.getUserHandle;
|
||||
import static com.android.launcher3.model.LoaderResults.filterCurrentWorkspaceItems;
|
||||
|
||||
import android.appwidget.AppWidgetProviderInfo;
|
||||
@@ -72,6 +73,7 @@ import com.android.launcher3.util.ComponentKey;
|
||||
import com.android.launcher3.util.LooperIdleLock;
|
||||
import com.android.launcher3.util.MultiHashMap;
|
||||
import com.android.launcher3.util.PackageManagerHelper;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
import com.android.launcher3.util.TraceHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -281,8 +283,9 @@ public class LoaderTask implements Runnable {
|
||||
synchronized (mBgDataModel) {
|
||||
mBgDataModel.clear();
|
||||
|
||||
final HashMap<String, SessionInfo> installingPkgs =
|
||||
final HashMap<PackageUserKey, SessionInfo> installingPkgs =
|
||||
mPackageInstaller.updateAndGetActiveSessionCache();
|
||||
final PackageUserKey tempPackageKey = new PackageUserKey(null, null);
|
||||
mFirstScreenBroadcast = new FirstScreenBroadcast(installingPkgs);
|
||||
|
||||
Map<ShortcutKey, ShortcutInfo> shortcutKeyToPinnedShortcuts = new HashMap<>();
|
||||
@@ -419,9 +422,10 @@ public class LoaderTask implements Runnable {
|
||||
// installed later.
|
||||
FileLog.d(TAG, "package not yet restored: " + targetPkg);
|
||||
|
||||
tempPackageKey.update(targetPkg, c.user);
|
||||
if (c.hasRestoreFlag(WorkspaceItemInfo.FLAG_RESTORE_STARTED)) {
|
||||
// Restore has started once.
|
||||
} else if (installingPkgs.containsKey(targetPkg)) {
|
||||
} else if (installingPkgs.containsKey(tempPackageKey)) {
|
||||
// App restore has started. Update the flag
|
||||
c.restoreFlag |= WorkspaceItemInfo.FLAG_RESTORE_STARTED;
|
||||
c.updater().put(LauncherSettings.Favorites.RESTORED,
|
||||
@@ -536,7 +540,8 @@ public class LoaderTask implements Runnable {
|
||||
}
|
||||
|
||||
if (c.restoreFlag != 0 && !TextUtils.isEmpty(targetPkg)) {
|
||||
SessionInfo si = installingPkgs.get(targetPkg);
|
||||
tempPackageKey.update(targetPkg, c.user);
|
||||
SessionInfo si = installingPkgs.get(tempPackageKey);
|
||||
if (si == null) {
|
||||
info.status &= ~WorkspaceItemInfo.FLAG_INSTALL_SESSION_ACTIVE;
|
||||
} else {
|
||||
@@ -630,8 +635,10 @@ public class LoaderTask implements Runnable {
|
||||
appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId,
|
||||
component);
|
||||
appWidgetInfo.restoreStatus = c.restoreFlag;
|
||||
|
||||
tempPackageKey.update(component.getPackageName(), c.user);
|
||||
SessionInfo si =
|
||||
installingPkgs.get(component.getPackageName());
|
||||
installingPkgs.get(tempPackageKey);
|
||||
Integer installProgress = si == null
|
||||
? null
|
||||
: (int) (si.getProgress() * 100);
|
||||
|
||||
@@ -15,7 +15,11 @@
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -29,6 +33,7 @@ import com.android.launcher3.R;
|
||||
import com.android.launcher3.allapps.AllAppsStore;
|
||||
import com.android.launcher3.util.ResourceBasedOverride;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class TestInformationHandler implements ResourceBasedOverride {
|
||||
@@ -42,6 +47,7 @@ public class TestInformationHandler implements ResourceBasedOverride {
|
||||
protected DeviceProfile mDeviceProfile;
|
||||
protected LauncherAppState mLauncherAppState;
|
||||
protected Launcher mLauncher;
|
||||
private static LinkedList mLeaks;
|
||||
|
||||
public void init(Context context) {
|
||||
mContext = context;
|
||||
@@ -120,6 +126,29 @@ public class TestInformationHandler implements ResourceBasedOverride {
|
||||
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, mem.getTotalPss());
|
||||
break;
|
||||
}
|
||||
|
||||
case TestProtocol.REQUEST_JAVA_LEAK: {
|
||||
if (mLeaks == null) mLeaks = 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);
|
||||
}
|
||||
mLeaks.add(bytes);
|
||||
break;
|
||||
}
|
||||
|
||||
case TestProtocol.REQUEST_NATIVE_LEAK: {
|
||||
if (mLeaks == null) mLeaks = new LinkedList();
|
||||
|
||||
// Allocate and dirty a bitmap.
|
||||
final Bitmap bitmap = Bitmap.createBitmap(512, 512, ARGB_8888);
|
||||
bitmap.eraseColor(Color.RED);
|
||||
mLeaks.add(bitmap);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -74,6 +74,8 @@ public final class TestProtocol {
|
||||
public static final String REQUEST_OVERVIEW_LEFT_GESTURE_MARGIN = "overview-left-margin";
|
||||
public static final String REQUEST_OVERVIEW_RIGHT_GESTURE_MARGIN = "overview-right-margin";
|
||||
public static final String REQUEST_TOTAL_PSS_KB = "total_pss";
|
||||
public static final String REQUEST_JAVA_LEAK = "java-leak";
|
||||
public static final String REQUEST_NATIVE_LEAK = "native-leak";
|
||||
|
||||
public static boolean sDebugTracing = false;
|
||||
public static final String REQUEST_ENABLE_DEBUG_TRACING = "enable-debug-tracing";
|
||||
|
||||
@@ -31,7 +31,7 @@ public class PackageUserKey {
|
||||
update(packageName, user);
|
||||
}
|
||||
|
||||
private void update(String packageName, UserHandle user) {
|
||||
public void update(String packageName, UserHandle user) {
|
||||
mPackageName = packageName;
|
||||
mUser = user;
|
||||
mHashCode = Arrays.hashCode(new Object[] {packageName, user});
|
||||
|
||||
@@ -70,12 +70,14 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest {
|
||||
|
||||
@Test
|
||||
@PortraitLandscape
|
||||
@org.junit.Ignore
|
||||
public void testWidgetConfig() throws Throwable {
|
||||
runTest(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@PortraitLandscape
|
||||
@org.junit.Ignore
|
||||
public void testConfigCancelled() throws Throwable {
|
||||
runTest(false);
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ public class AddWidgetTest extends AbstractLauncherUiTest {
|
||||
|
||||
@Test
|
||||
@PortraitLandscape
|
||||
@org.junit.Ignore
|
||||
public void testDragIcon() throws Throwable {
|
||||
clearHomescreen();
|
||||
mDevice.pressHome();
|
||||
|
||||
@@ -44,6 +44,7 @@ import com.android.launcher3.tapl.Workspace;
|
||||
import com.android.launcher3.ui.AbstractLauncherUiTest;
|
||||
import com.android.launcher3.ui.TestViewHelpers;
|
||||
import com.android.launcher3.util.ContentWriter;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
import com.android.launcher3.util.rule.ShellCommandRule;
|
||||
import com.android.launcher3.widget.PendingAddWidgetInfo;
|
||||
import com.android.launcher3.widget.WidgetHostViewLoader;
|
||||
@@ -54,7 +55,9 @@ import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Tests for bind widget flow.
|
||||
@@ -326,9 +329,12 @@ public class BindWidgetTest extends AbstractLauncherUiTest {
|
||||
int count = 0;
|
||||
String pkg = invalidPackage;
|
||||
|
||||
Set<String> activePackage = getOnUiThread(() ->
|
||||
PackageInstallerCompat.getInstance(mTargetContext)
|
||||
.updateAndGetActiveSessionCache().keySet());
|
||||
Set<String> activePackage = getOnUiThread(() -> {
|
||||
Set<String> packages = new HashSet<>();
|
||||
PackageInstallerCompat.getInstance(mTargetContext).updateAndGetActiveSessionCache()
|
||||
.keySet().forEach(packageUserKey -> packages.add(packageUserKey.mPackageName));
|
||||
return packages;
|
||||
});
|
||||
while(true) {
|
||||
try {
|
||||
mTargetContext.getPackageManager().getPackageInfo(
|
||||
|
||||
@@ -961,4 +961,12 @@ public final class LauncherInstrumentation {
|
||||
return getTestInfo(TestProtocol.REQUEST_TOTAL_PSS_KB).
|
||||
getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD);
|
||||
}
|
||||
|
||||
public void produceJavaLeak() {
|
||||
getTestInfo(TestProtocol.REQUEST_JAVA_LEAK);
|
||||
}
|
||||
|
||||
public void produceNativeLeak() {
|
||||
getTestInfo(TestProtocol.REQUEST_NATIVE_LEAK);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user