Allow Taskbar stashing for external tests

Moved Taskbar stashing enabling logic to QuickstepTestInformationHandler to allow external tests to use the Taskbar API

Test: TaplTestsTaskbar
Bug: 240129939
Change-Id: I0ede8e4767cbe068328997a3afd51f9d5df2799a
This commit is contained in:
Schneider Victor-tulias 2022-08-12 15:35:55 -07:00
parent 39d9eb819c
commit e64a8cfb20
5 changed files with 90 additions and 89 deletions

View File

@ -15,24 +15,13 @@
*/
package com.android.quickstep;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.testing.DebugTestInformationHandler;
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.quickstep.TouchInteractionService.TISBinder;
import com.android.quickstep.util.TISBindHelper;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;
/**
* Class to handle requests from tests, including debug ones, to Quickstep Launcher builds.
@ -49,78 +38,14 @@ public abstract class DebugQuickstepTestInformationHandler extends QuickstepTest
@Override
public Bundle call(String method, String arg, @Nullable Bundle extras) {
Bundle response = new Bundle();
switch (method) {
case TestProtocol.REQUEST_ENABLE_MANUAL_TASKBAR_STASHING:
runOnTISBinder(tisBinder -> {
enableManualTaskbarStashing(tisBinder, true);
});
return response;
case TestProtocol.REQUEST_DISABLE_MANUAL_TASKBAR_STASHING:
runOnTISBinder(tisBinder -> {
enableManualTaskbarStashing(tisBinder, false);
});
return response;
case TestProtocol.REQUEST_UNSTASH_TASKBAR_IF_STASHED:
runOnTISBinder(tisBinder -> {
enableManualTaskbarStashing(tisBinder, true);
// Allow null-pointer to catch illegal states.
tisBinder.getTaskbarManager().getCurrentActivityContext()
.unstashTaskbarIfStashed();
enableManualTaskbarStashing(tisBinder, false);
});
return response;
case TestProtocol.REQUEST_STASHED_TASKBAR_HEIGHT: {
final Resources resources = mContext.getResources();
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
resources.getDimensionPixelSize(R.dimen.taskbar_stashed_size));
return response;
}
case TestProtocol.REQUEST_RECREATE_TASKBAR:
// Allow null-pointer to catch illegal states.
runOnTISBinder(tisBinder -> tisBinder.getTaskbarManager().recreateTaskbar());
return response;
default:
response = super.call(method, arg, extras);
if (response != null) return response;
return mDebugTestInformationHandler.call(method, arg, extras);
if (TestProtocol.REQUEST_RECREATE_TASKBAR.equals(method)) {
// Allow null-pointer to catch illegal states.
runOnTISBinder(tisBinder -> tisBinder.getTaskbarManager().recreateTaskbar());
return response;
}
}
private void enableManualTaskbarStashing(TISBinder tisBinder, boolean enable) {
// Allow null-pointer to catch illegal states.
tisBinder.getTaskbarManager().getCurrentActivityContext().enableManualStashingForTests(
enable);
}
/**
* Runs the given command on the UI thread, after ensuring we are connected to
* TouchInteractionService.
*/
private void runOnTISBinder(Consumer<TISBinder> connectionCallback) {
try {
CountDownLatch countDownLatch = new CountDownLatch(1);
TISBindHelper helper = MAIN_EXECUTOR.submit(() ->
new TISBindHelper(mContext, tisBinder -> {
connectionCallback.accept(tisBinder);
countDownLatch.countDown();
})).get();
countDownLatch.await();
MAIN_EXECUTOR.submit(helper::onDestroy);
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
}
private interface UIThreadCommand {
void execute(Launcher launcher);
response = super.call(method, arg, extras);
if (response != null) return response;
return mDebugTestInformationHandler.call(method, arg, extras);
}
}

View File

@ -778,8 +778,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
* stash/unstash the taskbar.
*/
@VisibleForTesting
public void enableManualStashingForTests(boolean enableManualStashing) {
mControllers.taskbarStashController.enableManualStashingForTests(enableManualStashing);
public void enableManualStashingDuringTests(boolean enableManualStashing) {
mControllers.taskbarStashController.enableManualStashingDuringTests(enableManualStashing);
}
/**

View File

@ -162,7 +162,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
private boolean mIsImeShowing;
private boolean mIsImeSwitcherShowing;
private boolean mEnableManualStashingForTests = false;
private boolean mEnableManualStashingDuringTests = false;
// Evaluate whether the handle should be stashed
private final StatePropertyHolder mStatePropertyHolder = new StatePropertyHolder(
@ -242,15 +242,15 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
*/
protected boolean supportsManualStashing() {
return supportsVisualStashing()
&& (!Utilities.IS_RUNNING_IN_TEST_HARNESS || mEnableManualStashingForTests);
&& (!Utilities.IS_RUNNING_IN_TEST_HARNESS || mEnableManualStashingDuringTests);
}
/**
* Enables support for manual stashing. This should only be used to add this functionality
* to Launcher specific tests.
*/
public void enableManualStashingForTests(boolean enableManualStashing) {
mEnableManualStashingForTests = enableManualStashing;
public void enableManualStashingDuringTests(boolean enableManualStashing) {
mEnableManualStashingDuringTests = enableManualStashing;
}
/**

View File

@ -1,16 +1,25 @@
package com.android.quickstep;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.android.launcher3.R;
import com.android.launcher3.testing.TestInformationHandler;
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.TISBindHelper;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;
public class QuickstepTestInformationHandler extends TestInformationHandler {
@ -72,6 +81,37 @@ public class QuickstepTestInformationHandler extends TestInformationHandler {
TestProtocol.REQUEST_HAS_TIS, true);
return response;
}
case TestProtocol.REQUEST_ENABLE_MANUAL_TASKBAR_STASHING:
runOnTISBinder(tisBinder -> {
enableManualTaskbarStashing(tisBinder, true);
});
return response;
case TestProtocol.REQUEST_DISABLE_MANUAL_TASKBAR_STASHING:
runOnTISBinder(tisBinder -> {
enableManualTaskbarStashing(tisBinder, false);
});
return response;
case TestProtocol.REQUEST_UNSTASH_TASKBAR_IF_STASHED:
runOnTISBinder(tisBinder -> {
enableManualTaskbarStashing(tisBinder, true);
// Allow null-pointer to catch illegal states.
tisBinder.getTaskbarManager().getCurrentActivityContext()
.unstashTaskbarIfStashed();
enableManualTaskbarStashing(tisBinder, false);
});
return response;
case TestProtocol.REQUEST_STASHED_TASKBAR_HEIGHT: {
final Resources resources = mContext.getResources();
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
resources.getDimensionPixelSize(R.dimen.taskbar_stashed_size));
return response;
}
}
return super.call(method, arg, extras);
@ -93,4 +133,30 @@ public class QuickstepTestInformationHandler extends TestInformationHandler {
protected boolean isLauncherInitialized() {
return super.isLauncherInitialized() && TouchInteractionService.isInitialized();
}
private void enableManualTaskbarStashing(
TouchInteractionService.TISBinder tisBinder, boolean enable) {
// Allow null-pointer to catch illegal states.
tisBinder.getTaskbarManager().getCurrentActivityContext().enableManualStashingDuringTests(
enable);
}
/**
* Runs the given command on the UI thread, after ensuring we are connected to
* TouchInteractionService.
*/
protected void runOnTISBinder(Consumer<TouchInteractionService.TISBinder> connectionCallback) {
try {
CountDownLatch countDownLatch = new CountDownLatch(1);
TISBindHelper helper = MAIN_EXECUTOR.submit(() ->
new TISBindHelper(mContext, tisBinder -> {
connectionCallback.accept(tisBinder);
countDownLatch.countDown();
})).get();
countDownLatch.await();
MAIN_EXECUTOR.execute(helper::onDestroy);
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -21,10 +21,14 @@ import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import com.android.launcher3.Utilities;
public class TestInformationProvider extends ContentProvider {
private static final String TAG = "TestInformationProvider";
@Override
public boolean onCreate() {
return true;
@ -60,7 +64,13 @@ public class TestInformationProvider extends ContentProvider {
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
TestInformationHandler handler = TestInformationHandler.newInstance(getContext());
handler.init(getContext());
return handler.call(method, arg, extras);
Bundle response = handler.call(method, arg, extras);
if (response == null) {
Log.e(TAG, "Couldn't handle method: " + method + "; current handler="
+ handler.getClass().getSimpleName());
}
return response;
}
return null;
}