diff options
17 files changed, 120 insertions, 89 deletions
diff --git a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java index 0b351013d23a..cbd602f0de76 100644 --- a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java +++ b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java @@ -45,11 +45,13 @@ import androidx.test.filters.MediumTest; import androidx.test.runner.AndroidJUnit4; import com.android.adservices.data.adselection.CustomAudienceSignals; -import com.android.adservices.service.adselection.AdDataArgument; -import com.android.adservices.service.adselection.AdSelectionConfigArgument; -import com.android.adservices.service.adselection.AdWithBidArgument; -import com.android.adservices.service.adselection.CustomAudienceBiddingSignalsArgument; -import com.android.adservices.service.adselection.CustomAudienceScoringSignalsArgument; +import com.android.adservices.service.adselection.AdCounterKeyCopier; +import com.android.adservices.service.adselection.AdCounterKeyCopierNoOpImpl; +import com.android.adservices.service.adselection.AdDataArgumentUtil; +import com.android.adservices.service.adselection.AdSelectionConfigArgumentUtil; +import com.android.adservices.service.adselection.AdWithBidArgumentUtil; +import com.android.adservices.service.adselection.CustomAudienceBiddingSignalsArgumentUtil; +import com.android.adservices.service.adselection.CustomAudienceScoringSignalsArgumentUtil; import com.android.adservices.service.js.IsolateSettings; import com.android.adservices.service.js.JSScriptArgument; import com.android.adservices.service.js.JSScriptArrayArgument; @@ -106,6 +108,14 @@ public class JSScriptEnginePerfTests { private static final Instant ACTIVATION_TIME = CLOCK.instant(); private static final Instant EXPIRATION_TIME = CLOCK.instant().plus(Duration.ofDays(1)); private static final AdSelectionSignals CONTEXTUAL_SIGNALS = AdSelectionSignals.EMPTY; + private static final AdCounterKeyCopier AD_COUNTER_KEY_COPIER_NO_OP = + new AdCounterKeyCopierNoOpImpl(); + + private final AdDataArgumentUtil mAdDataArgumentUtil = + new AdDataArgumentUtil(AD_COUNTER_KEY_COPIER_NO_OP); + private final AdWithBidArgumentUtil mAdWithBidArgumentUtil = + new AdWithBidArgumentUtil(mAdDataArgumentUtil); + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); @@ -437,7 +447,7 @@ public class JSScriptEnginePerfTests { List<AdData> adDataList = getSampleAdDataList(numOfAds, "https://ads.example/"); ImmutableList.Builder<JSScriptArgument> adDataListArgument = new ImmutableList.Builder<>(); for (AdData adData : adDataList) { - adDataListArgument.add(AdDataArgument.asScriptArgument("ignored", adData)); + adDataListArgument.add(mAdDataArgumentUtil.asScriptArgument("ignored", adData)); } AdSelectionSignals perBuyerSignals = generatePerBuyerSignals(numOfAds); AdSelectionSignals auctionSignals = AdSelectionSignals.fromString("{\"auctionSignal1" @@ -455,7 +465,7 @@ public class JSScriptEnginePerfTests { .add(jsonArg("perBuyerSignals", perBuyerSignals)) .add(jsonArg("trustedBiddingSignals", trustedBiddingSignals)) .add(jsonArg("contextualSignals", CONTEXTUAL_SIGNALS)) - .add(CustomAudienceBiddingSignalsArgument.asScriptArgument( + .add(CustomAudienceBiddingSignalsArgumentUtil.asScriptArgument( "customAudienceBiddingSignal", customAudienceSignals)) .build(); InputStream testJsInputStream = sContext.getAssets().open( @@ -485,7 +495,8 @@ public class JSScriptEnginePerfTests { ImmutableList.Builder<JSScriptArgument> adWithBidArrayArgument = new ImmutableList.Builder<>(); for (AdWithBid adWithBid : adWithBidList) { - adWithBidArrayArgument.add(AdWithBidArgument.asScriptArgument("adWithBid", adWithBid)); + adWithBidArrayArgument.add( + mAdWithBidArgumentUtil.asScriptArgument("adWithBid", adWithBid)); } AdTechIdentifier seller = AdTechIdentifier.fromString("www.example-ssp.com"); AdSelectionSignals sellerSignals = AdSelectionSignals.fromString("{\"signals\":[]}"); @@ -507,12 +518,12 @@ public class JSScriptEnginePerfTests { ImmutableList<JSScriptArgument> args = ImmutableList.<JSScriptArgument>builder() .add(arrayArg("adsWithBids", adWithBidArrayArgument.build())) - .add(AdSelectionConfigArgument.asScriptArgument(adSelectionConfig, + .add(AdSelectionConfigArgumentUtil.asScriptArgument(adSelectionConfig, "adSelectionConfig")) .add(jsonArg("sellerSignals", sellerSignals)) .add(jsonArg("trustedScoringSignals", trustedScoringSignalsJson)) .add(jsonArg("contextualSignals", CONTEXTUAL_SIGNALS)) - .add(CustomAudienceScoringSignalsArgument.asScriptArgument( + .add(CustomAudienceScoringSignalsArgumentUtil.asScriptArgument( "customAudienceScoringSignal", customAudienceSignals)) .build(); InputStream testJsInputStream = sContext.getAssets().open( diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt index 64211b5b138e..d15a2afa0d4a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt @@ -39,7 +39,7 @@ constructor( private fun onPanelExpansionChanged(event: ShadeExpansionChangeEvent) = mainExecutor.execute { action?.let { - if (event.tracking) { + if (event.tracking || event.expanded) { Log.v(TAG, "Detected panel interaction, event: $event") it.onPanelInteraction.run() disable() diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt index 6ddba0b4719c..b41053cdea50 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt @@ -25,7 +25,7 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito.timeout +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.verifyZeroInteractions import org.mockito.junit.MockitoJUnit @@ -49,17 +49,31 @@ class AuthDialogPanelInteractionDetectorTest : SysuiTestCase() { } @Test - fun testEnableDetector_shouldPostRunnable() { + fun testEnableDetector_expandWithTrack_shouldPostRunnable() { detector.enable(action) // simulate notification expand shadeExpansionStateManager.onPanelExpansionChanged(5566f, true, true, 5566f) - verify(action, timeout(5000).times(1)).run() + verify(action).run() + } + + @Test + fun testEnableDetector_trackOnly_shouldPostRunnable() { + detector.enable(action) + // simulate notification expand + shadeExpansionStateManager.onPanelExpansionChanged(5566f, false, true, 5566f) + verify(action).run() + } + + @Test + fun testEnableDetector_expandOnly_shouldPostRunnable() { + detector.enable(action) + // simulate notification expand + shadeExpansionStateManager.onPanelExpansionChanged(5566f, true, false, 5566f) + verify(action).run() } @Test fun testEnableDetector_shouldNotPostRunnable() { - var detector = - AuthDialogPanelInteractionDetector(shadeExpansionStateManager, mContext.mainExecutor) detector.enable(action) detector.disable() shadeExpansionStateManager.onPanelExpansionChanged(5566f, true, true, 5566f) diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index b338d89a0169..1363ef31c68d 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -1046,18 +1046,30 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub */ void showToastWhereUidIsRunning(int uid, String text, @Toast.Duration int duration, Looper looper) { + ArrayList<Integer> displayIdsForUid = getDisplayIdsWhereUidIsRunning(uid); + if (displayIdsForUid.isEmpty()) { + return; + } + DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); + for (int i = 0; i < displayIdsForUid.size(); i++) { + Display display = displayManager.getDisplay(displayIdsForUid.get(i)); + if (display != null && display.isValid()) { + Toast.makeText(mContext.createDisplayContext(display), looper, text, + duration).show(); + } + } + } + + private ArrayList<Integer> getDisplayIdsWhereUidIsRunning(int uid) { + ArrayList<Integer> displayIdsForUid = new ArrayList<>(); synchronized (mVirtualDeviceLock) { - DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); for (int i = 0; i < mVirtualDisplays.size(); i++) { if (mVirtualDisplays.valueAt(i).getWindowPolicyController().containsUid(uid)) { - Display display = displayManager.getDisplay(mVirtualDisplays.keyAt(i)); - if (display != null && display.isValid()) { - Toast.makeText(mContext.createDisplayContext(display), looper, text, - duration).show(); - } + displayIdsForUid.add(mVirtualDisplays.keyAt(i)); } } } + return displayIdsForUid; } boolean isDisplayOwnedByVirtualDevice(int displayId) { diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java index 1d48cb25f03a..e66894b596e9 100644 --- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java @@ -22,7 +22,9 @@ import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ANR; import static com.android.server.am.ActivityManagerService.MY_PID; import static com.android.server.am.ProcessRecord.TAG; +import static com.android.server.stats.pull.ProcfsMemoryUtil.readMemorySnapshotFromProcfs; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AnrController; import android.app.ApplicationErrorReport; @@ -56,6 +58,7 @@ import com.android.internal.os.anr.AnrLatencyTracker; import com.android.internal.util.FrameworkStatsLog; import com.android.server.ResourcePressureUtil; import com.android.server.criticalevents.CriticalEventLog; +import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot; import com.android.server.wm.WindowProcessController; import java.io.File; @@ -396,6 +399,8 @@ class ProcessErrorStateRecord { }); } } + // Build memory headers for the ANRing process. + String memoryHeaders = buildMemoryHeadersFor(pid); // Get critical event log before logging the ANR so that it doesn't occur in the log. latencyTracker.criticalEventLogStarted(); @@ -496,7 +501,7 @@ class ProcessErrorStateRecord { File tracesFile = StackTracesDumpHelper.dumpStackTraces(firstPids, isSilentAnr ? null : processCpuTracker, isSilentAnr ? null : lastPids, nativePidsFuture, tracesFileException, firstPidEndOffset, annotation, - criticalEventLog, auxiliaryTaskExecutor, latencyTracker); + criticalEventLog, memoryHeaders, auxiliaryTaskExecutor, latencyTracker); if (isMonitorCpuUsage()) { // Wait for the first call to finish @@ -710,6 +715,26 @@ class ProcessErrorStateRecord { resolver.getUserId()) != 0; } + private @Nullable String buildMemoryHeadersFor(int pid) { + if (pid <= 0) { + Slog.i(TAG, "Memory header requested with invalid pid: " + pid); + return null; + } + MemorySnapshot snapshot = readMemorySnapshotFromProcfs(pid); + if (snapshot == null) { + Slog.i(TAG, "Failed to get memory snapshot for pid:" + pid); + return null; + } + + StringBuilder memoryHeaders = new StringBuilder(); + memoryHeaders.append("RssHwmKb: ") + .append(snapshot.rssHighWaterMarkInKilobytes) + .append("\n"); + memoryHeaders.append("RssKb: ").append(snapshot.rssInKilobytes).append("\n"); + memoryHeaders.append("RssAnonKb: ").append(snapshot.anonRssInKilobytes).append("\n"); + memoryHeaders.append("VmSwapKb: ").append(snapshot.swapInKilobytes).append("\n"); + return memoryHeaders.toString(); + } /** * Unless configured otherwise, swallow ANRs in background processes & kill the process. * Non-private access is for tests only. diff --git a/services/core/java/com/android/server/am/StackTracesDumpHelper.java b/services/core/java/com/android/server/am/StackTracesDumpHelper.java index 937332894dbd..10ddc2f562dc 100644 --- a/services/core/java/com/android/server/am/StackTracesDumpHelper.java +++ b/services/core/java/com/android/server/am/StackTracesDumpHelper.java @@ -85,7 +85,8 @@ public class StackTracesDumpHelper { Future<ArrayList<Integer>> nativePidsFuture, StringWriter logExceptionCreatingFile, @NonNull Executor auxiliaryTaskExecutor, AnrLatencyTracker latencyTracker) { return dumpStackTraces(firstPids, processCpuTracker, lastPids, nativePidsFuture, - logExceptionCreatingFile, null, null, null, auxiliaryTaskExecutor, latencyTracker); + logExceptionCreatingFile, null, null, null, null, auxiliaryTaskExecutor, + latencyTracker); } /** @@ -99,7 +100,7 @@ public class StackTracesDumpHelper { AnrLatencyTracker latencyTracker) { return dumpStackTraces(firstPids, processCpuTracker, lastPids, nativePidsFuture, logExceptionCreatingFile, null, subject, criticalEventSection, - auxiliaryTaskExecutor, latencyTracker); + /* memoryHeaders= */ null, auxiliaryTaskExecutor, latencyTracker); } /** @@ -110,7 +111,8 @@ public class StackTracesDumpHelper { ProcessCpuTracker processCpuTracker, SparseBooleanArray lastPids, Future<ArrayList<Integer>> nativePidsFuture, StringWriter logExceptionCreatingFile, AtomicLong firstPidEndOffset, String subject, String criticalEventSection, - @NonNull Executor auxiliaryTaskExecutor, AnrLatencyTracker latencyTracker) { + String memoryHeaders, @NonNull Executor auxiliaryTaskExecutor, + AnrLatencyTracker latencyTracker) { try { if (latencyTracker != null) { @@ -150,9 +152,10 @@ public class StackTracesDumpHelper { return null; } - if (subject != null || criticalEventSection != null) { + if (subject != null || criticalEventSection != null || memoryHeaders != null) { appendtoANRFile(tracesFile.getAbsolutePath(), - (subject != null ? "Subject: " + subject + "\n\n" : "") + (subject != null ? "Subject: " + subject + "\n" : "") + + (memoryHeaders != null ? memoryHeaders + "\n\n" : "") + (criticalEventSection != null ? criticalEventSection : "")); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index bbdaa24a694c..12fe6a0dba25 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -100,6 +100,7 @@ import static com.android.server.wm.ActivityInterceptorCallback.MAINLINE_LAST_OR import static com.android.server.wm.ActivityInterceptorCallback.SYSTEM_FIRST_ORDERED_ID; import static com.android.server.wm.ActivityInterceptorCallback.SYSTEM_LAST_ORDERED_ID; import static com.android.server.wm.ActivityRecord.State.PAUSING; +import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL; import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_ROOT_TASK; import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH; @@ -2011,7 +2012,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return; } - if (r == mRootWindowContainer.getTopResumedActivity()) { + if (r.isState(RESUMED) && r == mRootWindowContainer.getTopResumedActivity()) { setLastResumedActivityUncheckLocked(r, "setFocusedTask-alreadyTop"); return; } diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index 4be98a3c88b7..b4dffdcba243 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -48,7 +48,7 @@ import java.io.PrintWriter; * Controller for IME inset source on the server. It's called provider as it provides the * {@link InsetsSource} to the client that uses it in {@link InsetsSourceConsumer}. */ -final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider { +final class ImeInsetsSourceProvider extends InsetsSourceProvider { /** The token tracking the current IME request or {@code null} otherwise. */ @Nullable diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index a8c9cd30b656..fe13b87a079a 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -223,10 +223,10 @@ class InsetsPolicy { startAnimation(false /* show */, () -> { synchronized (mDisplayContent.mWmService.mGlobalLock) { - final SparseArray<WindowContainerInsetsSourceProvider> providers = + final SparseArray<InsetsSourceProvider> providers = mStateController.getSourceProviders(); for (int i = providers.size() - 1; i >= 0; i--) { - final WindowContainerInsetsSourceProvider provider = providers.valueAt(i); + final InsetsSourceProvider provider = providers.valueAt(i); if (!isTransient(provider.getSource().getType())) { continue; } @@ -341,11 +341,10 @@ class InsetsPolicy { } } - final SparseArray<WindowContainerInsetsSourceProvider> providers = - mStateController.getSourceProviders(); + final SparseArray<InsetsSourceProvider> providers = mStateController.getSourceProviders(); final int windowType = attrs.type; for (int i = providers.size() - 1; i >= 0; i--) { - final WindowContainerInsetsSourceProvider otherProvider = providers.valueAt(i); + final InsetsSourceProvider otherProvider = providers.valueAt(i); if (otherProvider.overridesFrame(windowType)) { if (state == originalState) { state = new InsetsState(state); diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 0953604511d7..3b23f9717175 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -58,7 +58,7 @@ import java.util.function.Consumer; * Controller for a specific inset source on the server. It's called provider as it provides the * {@link InsetsSource} to the client that uses it in {@link android.view.InsetsSourceConsumer}. */ -abstract class InsetsSourceProvider { +class InsetsSourceProvider { protected final DisplayContent mDisplayContent; protected final @NonNull InsetsSource mSource; diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index fca333d33731..249ead0a8509 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -56,7 +56,7 @@ class InsetsStateController { private final InsetsState mState = new InsetsState(); private final DisplayContent mDisplayContent; - private final SparseArray<WindowContainerInsetsSourceProvider> mProviders = new SparseArray<>(); + private final SparseArray<InsetsSourceProvider> mProviders = new SparseArray<>(); private final ArrayMap<InsetsControlTarget, ArrayList<InsetsSourceProvider>> mControlTargetProvidersMap = new ArrayMap<>(); private final SparseArray<InsetsControlTarget> mIdControlTargetMap = new SparseArray<>(); @@ -106,22 +106,22 @@ class InsetsStateController { return result; } - SparseArray<WindowContainerInsetsSourceProvider> getSourceProviders() { + SparseArray<InsetsSourceProvider> getSourceProviders() { return mProviders; } /** * @return The provider of a specific source ID. */ - WindowContainerInsetsSourceProvider getOrCreateSourceProvider(int id, @InsetsType int type) { - WindowContainerInsetsSourceProvider provider = mProviders.get(id); + InsetsSourceProvider getOrCreateSourceProvider(int id, @InsetsType int type) { + InsetsSourceProvider provider = mProviders.get(id); if (provider != null) { return provider; } final InsetsSource source = mState.getOrCreateSource(id, type); provider = id == ID_IME ? new ImeInsetsSourceProvider(source, this, mDisplayContent) - : new WindowContainerInsetsSourceProvider(source, this, mDisplayContent); + : new InsetsSourceProvider(source, this, mDisplayContent); mProviders.put(id, provider); return provider; } @@ -334,7 +334,7 @@ class InsetsStateController { } mDisplayContent.mWmService.mAnimator.addAfterPrepareSurfacesRunnable(() -> { for (int i = mProviders.size() - 1; i >= 0; i--) { - final WindowContainerInsetsSourceProvider provider = mProviders.valueAt(i); + final InsetsSourceProvider provider = mProviders.valueAt(i); provider.onSurfaceTransactionApplied(); } final ArraySet<InsetsControlTarget> newControlTargets = new ArraySet<>(); diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 2e217820c264..41176410a789 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -4122,7 +4122,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< } private void hideInsetSourceViewOverflows() { - final SparseArray<WindowContainerInsetsSourceProvider> providers = + final SparseArray<InsetsSourceProvider> providers = getDisplayContent().getInsetsStateController().getSourceProviders(); for (int i = providers.size(); i >= 0; i--) { final InsetsSourceProvider insetProvider = providers.valueAt(i); diff --git a/services/core/java/com/android/server/wm/WindowContainerInsetsSourceProvider.java b/services/core/java/com/android/server/wm/WindowContainerInsetsSourceProvider.java deleted file mode 100644 index aa2e8f541058..000000000000 --- a/services/core/java/com/android/server/wm/WindowContainerInsetsSourceProvider.java +++ /dev/null @@ -1,34 +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.server.wm; - -import android.view.InsetsSource; - -/** - * Controller for a specific inset source on the server. It's called provider as it provides the - * {@link InsetsSource} to the client that uses it in {@link android.view.InsetsSourceConsumer}. - */ -class WindowContainerInsetsSourceProvider extends InsetsSourceProvider { - // TODO(b/218734524): Move the window container specific stuff from InsetsSourceProvider to - // this class. - - WindowContainerInsetsSourceProvider(InsetsSource source, - InsetsStateController stateController, DisplayContent displayContent) { - super(source, stateController, displayContent); - } -} - diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java index ef20f2b8fe64..b35eceb6dd11 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java @@ -42,20 +42,20 @@ import org.junit.runner.RunWith; @SmallTest @Presubmit @RunWith(WindowTestRunner.class) -public class WindowContainerInsetsSourceProviderTest extends WindowTestsBase { +public class InsetsSourceProviderTest extends WindowTestsBase { private InsetsSource mSource = new InsetsSource( InsetsSource.createId(null, 0, statusBars()), statusBars()); - private WindowContainerInsetsSourceProvider mProvider; + private InsetsSourceProvider mProvider; private InsetsSource mImeSource = new InsetsSource(ID_IME, ime()); - private WindowContainerInsetsSourceProvider mImeProvider; + private InsetsSourceProvider mImeProvider; @Before public void setUp() throws Exception { mSource.setVisible(true); - mProvider = new WindowContainerInsetsSourceProvider(mSource, + mProvider = new InsetsSourceProvider(mSource, mDisplayContent.getInsetsStateController(), mDisplayContent); - mImeProvider = new WindowContainerInsetsSourceProvider(mImeSource, + mImeProvider = new InsetsSourceProvider(mImeSource, mDisplayContent.getInsetsStateController(), mDisplayContent); } diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index 74fde65c4dcd..ff2944a80976 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -287,7 +287,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { // IME cannot be the IME target. ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE; - WindowContainerInsetsSourceProvider statusBarProvider = + InsetsSourceProvider statusBarProvider = getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()); final SparseArray<TriConsumer<DisplayFrames, WindowContainer, Rect>> imeOverrideProviders = new SparseArray<>(); @@ -353,7 +353,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { public void testTransientVisibilityOfFixedRotationState() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - final WindowContainerInsetsSourceProvider provider = getController() + final InsetsSourceProvider provider = getController() .getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()); provider.setWindowContainer(statusBar, null, null); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java index 6261e56a87c5..a1ddd5748002 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java @@ -484,7 +484,7 @@ public class WindowContainerTests extends WindowTestsBase { windowState.mSurfaceAnimator).getAnimationType(); assertTrue(parent.isAnimating(CHILDREN)); - windowState.setControllableInsetProvider(mock(WindowContainerInsetsSourceProvider.class)); + windowState.setControllableInsetProvider(mock(InsetsSourceProvider.class)); assertFalse(parent.isAnimating(CHILDREN)); } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java index 48a39e682340..f3cb9baedd4b 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java @@ -74,9 +74,8 @@ import com.android.server.voiceinteraction.VoiceInteractionManagerServiceImpl.De import java.io.PrintWriter; import java.time.Instant; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Function; @@ -122,8 +121,8 @@ final class HotwordDetectionConnection { private static final int DETECTION_SERVICE_TYPE_VISUAL_QUERY = 2; // TODO: This may need to be a Handler(looper) - private final ScheduledExecutorService mScheduledExecutorService = - Executors.newSingleThreadScheduledExecutor(); + private final ScheduledThreadPoolExecutor mScheduledExecutorService = + new ScheduledThreadPoolExecutor(1); @Nullable private final ScheduledFuture<?> mCancellationTaskFuture; private final IBinder.DeathRecipient mAudioServerDeathRecipient = this::audioServerDied; @NonNull private final ServiceConnectionFactory mHotwordDetectionServiceConnectionFactory; @@ -210,6 +209,7 @@ final class HotwordDetectionConnection { if (mReStartPeriodSeconds <= 0) { mCancellationTaskFuture = null; } else { + mScheduledExecutorService.setRemoveOnCancelPolicy(true); // TODO: we need to be smarter here, e.g. schedule it a bit more often, // but wait until the current session is closed. mCancellationTaskFuture = mScheduledExecutorService.scheduleAtFixedRate(() -> { |