diff options
40 files changed, 421 insertions, 481 deletions
diff --git a/Android.bp b/Android.bp index c97ee3da36e4..9077344adf21 100644 --- a/Android.bp +++ b/Android.bp @@ -352,12 +352,8 @@ java_defaults { "core/java/android/service/chooser/IChooserTargetResult.aidl", "core/java/android/service/resolver/IResolverRankerService.aidl", "core/java/android/service/resolver/IResolverRankerResult.aidl", - "core/java/android/service/textclassifier/IConversationActionsCallback.aidl", - "core/java/android/service/textclassifier/ITextClassificationCallback.aidl", + "core/java/android/service/textclassifier/ITextClassifierCallback.aidl", "core/java/android/service/textclassifier/ITextClassifierService.aidl", - "core/java/android/service/textclassifier/ITextLanguageCallback.aidl", - "core/java/android/service/textclassifier/ITextLinksCallback.aidl", - "core/java/android/service/textclassifier/ITextSelectionCallback.aidl", "core/java/android/service/attention/IAttentionService.aidl", "core/java/android/service/attention/IAttentionCallback.aidl", "core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl", diff --git a/api/current.txt b/api/current.txt index 0176b9b6e12b..da8790bd7247 100644 --- a/api/current.txt +++ b/api/current.txt @@ -25137,7 +25137,7 @@ package android.media { field public static final long POSITION_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL } - public static class MediaItem2.Builder { + public static final class MediaItem2.Builder { ctor public MediaItem2.Builder(); method @NonNull public android.media.MediaItem2 build(); method @NonNull public android.media.MediaItem2.Builder setEndPosition(long); @@ -51972,6 +51972,7 @@ package android.view { method public int getStableInsetRight(); method public int getStableInsetTop(); method @NonNull public android.graphics.Insets getStableInsets(); + method @NonNull public android.graphics.Insets getSystemGestureInsets(); method public int getSystemWindowInsetBottom(); method public int getSystemWindowInsetLeft(); method public int getSystemWindowInsetRight(); @@ -51993,6 +51994,7 @@ package android.view { method @NonNull public android.view.WindowInsets build(); method @NonNull public android.view.WindowInsets.Builder setDisplayCutout(@Nullable android.view.DisplayCutout); method @NonNull public android.view.WindowInsets.Builder setStableInsets(@NonNull android.graphics.Insets); + method @NonNull public android.view.WindowInsets.Builder setSystemGestureInsets(@NonNull android.graphics.Insets); method @NonNull public android.view.WindowInsets.Builder setSystemWindowInsets(@NonNull android.graphics.Insets); } diff --git a/api/system-current.txt b/api/system-current.txt index 752640bb8d02..8dedd2c12af4 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6763,15 +6763,15 @@ package android.service.textclassifier { method public static android.view.textclassifier.TextClassifier getDefaultTextClassifierImplementation(@NonNull android.content.Context); method @Deprecated public final android.view.textclassifier.TextClassifier getLocalTextClassifier(); method @Nullable public final android.os.IBinder onBind(android.content.Intent); - method public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>); - method public void onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId); - method public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId); - method public void onDetectLanguage(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLanguage.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLanguage>); - method public abstract void onGenerateLinks(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLinks.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>); - method @Deprecated public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent); - method public void onSuggestConversationActions(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.ConversationActions.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.ConversationActions>); - method public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>); - method public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent); + method @MainThread public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>); + method @MainThread public void onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId); + method @MainThread public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId); + method @MainThread public void onDetectLanguage(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLanguage.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLanguage>); + method @MainThread public abstract void onGenerateLinks(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLinks.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>); + method @Deprecated @MainThread public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent); + method @MainThread public void onSuggestConversationActions(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.ConversationActions.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.ConversationActions>); + method @MainThread public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>); + method @MainThread public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent); field public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService"; } diff --git a/api/test-current.txt b/api/test-current.txt index 684524e8987b..c0701718306d 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -523,6 +523,7 @@ package android.app.role { method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void removeRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback); method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean removeRoleHolderFromController(@NonNull String, @NonNull String); method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>); + field public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; // 0x1 } public interface RoleManagerCallback { diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index b654258e6dcb..08239a1e7ed9 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -332,7 +332,6 @@ public final class ActivityThread extends ClientTransactionHandler { String[] mInstrumentedSplitAppDirs = null; String mInstrumentedLibDir = null; boolean mSystemThread = false; - boolean mJitEnabled = false; boolean mSomeActivitiesChanged = false; boolean mUpdatingSystemConfig = false; /* package */ boolean mHiddenApiWarningShown = false; @@ -1696,7 +1695,6 @@ public final class ActivityThread extends ClientTransactionHandler { public static final int SUICIDE = 130; @UnsupportedAppUsage public static final int REMOVE_PROVIDER = 131; - public static final int ENABLE_JIT = 132; public static final int DISPATCH_PACKAGE_BROADCAST = 133; @UnsupportedAppUsage public static final int SCHEDULE_CRASH = 134; @@ -1746,7 +1744,6 @@ public final class ActivityThread extends ClientTransactionHandler { case DESTROY_BACKUP_AGENT: return "DESTROY_BACKUP_AGENT"; case SUICIDE: return "SUICIDE"; case REMOVE_PROVIDER: return "REMOVE_PROVIDER"; - case ENABLE_JIT: return "ENABLE_JIT"; case DISPATCH_PACKAGE_BROADCAST: return "DISPATCH_PACKAGE_BROADCAST"; case SCHEDULE_CRASH: return "SCHEDULE_CRASH"; case DUMP_HEAP: return "DUMP_HEAP"; @@ -1858,9 +1855,6 @@ public final class ActivityThread extends ClientTransactionHandler { completeRemoveProvider((ProviderRefCount)msg.obj); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; - case ENABLE_JIT: - ensureJitEnabled(); - break; case DISPATCH_PACKAGE_BROADCAST: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastPackage"); handleDispatchPackageBroadcast(msg.arg1, (String[])msg.obj); @@ -1996,7 +1990,6 @@ public final class ActivityThread extends ClientTransactionHandler { if (stopProfiling) { mProfiler.stopProfiling(); } - ensureJitEnabled(); return false; } } @@ -2330,13 +2323,6 @@ public final class ActivityThread extends ClientTransactionHandler { } } - void ensureJitEnabled() { - if (!mJitEnabled) { - mJitEnabled = true; - dalvik.system.VMRuntime.getRuntime().startJitCompilation(); - } - } - @UnsupportedAppUsage void scheduleGcIdler() { if (!mGcIdlerScheduled) { @@ -3782,7 +3768,6 @@ public final class ActivityThread extends ClientTransactionHandler { ActivityManager.getService().serviceDoneExecuting( data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0); } - ensureJitEnabled(); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } @@ -3896,7 +3881,6 @@ public final class ActivityThread extends ClientTransactionHandler { } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - ensureJitEnabled(); } catch (Exception e) { if (!mInstrumentation.onException(s, e)) { throw new RuntimeException( @@ -6177,9 +6161,6 @@ public final class ActivityThread extends ClientTransactionHandler { if (!data.restrictedBackupMode) { if (!ArrayUtils.isEmpty(data.providers)) { installContentProviders(app, data.providers); - // For process that contains content providers, we want to - // ensure that the JIT is enabled "at some point". - mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000); } } @@ -6812,12 +6793,6 @@ public final class ActivityThread extends ClientTransactionHandler { sCurrentActivityThread = this; mSystemThread = system; if (!system) { - ViewRootImpl.addFirstDrawHandler(new Runnable() { - @Override - public void run() { - ensureJitEnabled(); - } - }); android.ddm.DdmHandleAppName.setAppName("<pre-initialized>", UserHandle.myUserId()); RuntimeInit.setApplicationObject(mAppThread.asBinder()); diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java index c665cb238028..f91d8780084f 100644 --- a/core/java/android/app/role/RoleManager.java +++ b/core/java/android/app/role/RoleManager.java @@ -187,6 +187,7 @@ public final class RoleManager { * @hide */ @SystemApi + @TestApi public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; /** diff --git a/core/java/android/service/textclassifier/IConversationActionsCallback.aidl b/core/java/android/service/textclassifier/IConversationActionsCallback.aidl deleted file mode 100644 index c35d4246e924..000000000000 --- a/core/java/android/service/textclassifier/IConversationActionsCallback.aidl +++ /dev/null @@ -1,28 +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 android.service.textclassifier; - -import android.view.textclassifier.ConversationActions; - -/** - * Callback for a ConversationActions request. - * @hide - */ -oneway interface IConversationActionsCallback { - void onSuccess(in ConversationActions conversationActions); - void onFailure(); -}
\ No newline at end of file diff --git a/core/java/android/service/textclassifier/ITextClassificationCallback.aidl b/core/java/android/service/textclassifier/ITextClassificationCallback.aidl deleted file mode 100644 index 10bfe6324509..000000000000 --- a/core/java/android/service/textclassifier/ITextClassificationCallback.aidl +++ /dev/null @@ -1,28 +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 android.service.textclassifier; - -import android.view.textclassifier.TextClassification; - -/** - * Callback for a TextClassification request. - * @hide - */ -oneway interface ITextClassificationCallback { - void onSuccess(in TextClassification classification); - void onFailure(); -} diff --git a/core/java/android/service/textclassifier/ITextSelectionCallback.aidl b/core/java/android/service/textclassifier/ITextClassifierCallback.aidl index 1b4c4d10d427..2926734086a5 100644 --- a/core/java/android/service/textclassifier/ITextSelectionCallback.aidl +++ b/core/java/android/service/textclassifier/ITextClassifierCallback.aidl @@ -16,13 +16,14 @@ package android.service.textclassifier; +import android.os.Bundle; import android.view.textclassifier.TextSelection; /** - * Callback for a TextSelection request. + * Callback for all requests from SystemTextClassifier. * @hide */ -oneway interface ITextSelectionCallback { - void onSuccess(in TextSelection selection); +oneway interface ITextClassifierCallback { + void onSuccess(in Bundle result); void onFailure(); }
\ No newline at end of file diff --git a/core/java/android/service/textclassifier/ITextClassifierService.aidl b/core/java/android/service/textclassifier/ITextClassifierService.aidl index 794179415fc0..2f8d67b6ccee 100644 --- a/core/java/android/service/textclassifier/ITextClassifierService.aidl +++ b/core/java/android/service/textclassifier/ITextClassifierService.aidl @@ -16,11 +16,7 @@ package android.service.textclassifier; -import android.service.textclassifier.IConversationActionsCallback; -import android.service.textclassifier.ITextClassificationCallback; -import android.service.textclassifier.ITextLanguageCallback; -import android.service.textclassifier.ITextLinksCallback; -import android.service.textclassifier.ITextSelectionCallback; +import android.service.textclassifier.ITextClassifierCallback; import android.view.textclassifier.ConversationActions; import android.view.textclassifier.SelectionEvent; import android.view.textclassifier.TextClassification; @@ -41,17 +37,17 @@ oneway interface ITextClassifierService { void onSuggestSelection( in TextClassificationSessionId sessionId, in TextSelection.Request request, - in ITextSelectionCallback callback); + in ITextClassifierCallback callback); void onClassifyText( in TextClassificationSessionId sessionId, in TextClassification.Request request, - in ITextClassificationCallback callback); + in ITextClassifierCallback callback); void onGenerateLinks( in TextClassificationSessionId sessionId, in TextLinks.Request request, - in ITextLinksCallback callback); + in ITextClassifierCallback callback); // TODO: Remove void onSelectionEvent( @@ -72,10 +68,10 @@ oneway interface ITextClassifierService { void onDetectLanguage( in TextClassificationSessionId sessionId, in TextLanguage.Request request, - in ITextLanguageCallback callback); + in ITextClassifierCallback callback); void onSuggestConversationActions( in TextClassificationSessionId sessionId, in ConversationActions.Request request, - in IConversationActionsCallback callback); + in ITextClassifierCallback callback); } diff --git a/core/java/android/service/textclassifier/ITextLanguageCallback.aidl b/core/java/android/service/textclassifier/ITextLanguageCallback.aidl deleted file mode 100644 index 263d99afca5c..000000000000 --- a/core/java/android/service/textclassifier/ITextLanguageCallback.aidl +++ /dev/null @@ -1,28 +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 android.service.textclassifier; - -import android.view.textclassifier.TextLanguage; - -/** - * Callback for a TextLanguage request. - * @hide - */ -oneway interface ITextLanguageCallback { - void onSuccess(in TextLanguage textLanguage); - void onFailure(); -}
\ No newline at end of file diff --git a/core/java/android/service/textclassifier/ITextLinksCallback.aidl b/core/java/android/service/textclassifier/ITextLinksCallback.aidl deleted file mode 100644 index a9e0dde56773..000000000000 --- a/core/java/android/service/textclassifier/ITextLinksCallback.aidl +++ /dev/null @@ -1,28 +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 android.service.textclassifier; - -import android.view.textclassifier.TextLinks; - -/** - * Callback for a TextLinks request. - * @hide - */ -oneway interface ITextLinksCallback { - void onSuccess(in TextLinks links); - void onFailure(); -}
\ No newline at end of file diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 235b8e8c9176..4088ce8ea4b0 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -17,6 +17,7 @@ package android.service.textclassifier; import android.Manifest; +import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; @@ -27,8 +28,12 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.os.Bundle; import android.os.CancellationSignal; +import android.os.Handler; import android.os.IBinder; +import android.os.Looper; +import android.os.Parcelable; import android.os.RemoteException; import android.text.TextUtils; import android.util.Slog; @@ -46,6 +51,10 @@ import android.view.textclassifier.TextSelection; import com.android.internal.util.Preconditions; +import java.lang.ref.WeakReference; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + /** * Abstract base class for the TextClassifier service. * @@ -68,6 +77,11 @@ import com.android.internal.util.Preconditions; * </intent-filter> * </service>}</pre> * + * <p>From {@link android.os.Build.VERSION_CODES#Q} onward, all callbacks are called on the main + * thread. Prior to Q, there is no guarantee on what thread the callback will happen. You should + * make sure the callbacks are executed in your desired thread by using a executor, a handler or + * something else along the line. + * * @see TextClassifier * @hide */ @@ -85,201 +99,102 @@ public abstract class TextClassifierService extends Service { public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService"; + /** @hide **/ + private static final String KEY_RESULT = "key_result"; + + private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper(), null, true); + private final ExecutorService mSingleThreadExecutor = Executors.newSingleThreadExecutor(); + private final ITextClassifierService.Stub mBinder = new ITextClassifierService.Stub() { // TODO(b/72533911): Implement cancellation signal @NonNull private final CancellationSignal mCancellationSignal = new CancellationSignal(); - /** {@inheritDoc} */ @Override public void onSuggestSelection( TextClassificationSessionId sessionId, - TextSelection.Request request, ITextSelectionCallback callback) { + TextSelection.Request request, ITextClassifierCallback callback) { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); - TextClassifierService.this.onSuggestSelection( - sessionId, request, mCancellationSignal, - new Callback<TextSelection>() { - @Override - public void onSuccess(TextSelection result) { - try { - callback.onSuccess(result); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - - @Override - public void onFailure(CharSequence error) { - try { - if (callback.asBinder().isBinderAlive()) { - callback.onFailure(); - } - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - }); + mMainThreadHandler.post(() -> TextClassifierService.this.onSuggestSelection( + sessionId, request, mCancellationSignal, new ProxyCallback<>(callback))); + } - /** {@inheritDoc} */ @Override public void onClassifyText( TextClassificationSessionId sessionId, - TextClassification.Request request, ITextClassificationCallback callback) { + TextClassification.Request request, ITextClassifierCallback callback) { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); - TextClassifierService.this.onClassifyText( - sessionId, request, mCancellationSignal, - new Callback<TextClassification>() { - @Override - public void onSuccess(TextClassification result) { - try { - callback.onSuccess(result); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - - @Override - public void onFailure(CharSequence error) { - try { - callback.onFailure(); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - }); + mMainThreadHandler.post(() -> TextClassifierService.this.onClassifyText( + sessionId, request, mCancellationSignal, new ProxyCallback<>(callback))); } - /** {@inheritDoc} */ @Override public void onGenerateLinks( TextClassificationSessionId sessionId, - TextLinks.Request request, ITextLinksCallback callback) { + TextLinks.Request request, ITextClassifierCallback callback) { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); - TextClassifierService.this.onGenerateLinks( - sessionId, request, - mCancellationSignal, - new Callback<TextLinks>() { - @Override - public void onSuccess(TextLinks result) { - try { - callback.onSuccess(result); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - - @Override - public void onFailure(CharSequence error) { - try { - callback.onFailure(); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - }); + mMainThreadHandler.post(() -> TextClassifierService.this.onGenerateLinks( + sessionId, request, mCancellationSignal, new ProxyCallback<>(callback))); } - /** {@inheritDoc} */ @Override public void onSelectionEvent( TextClassificationSessionId sessionId, SelectionEvent event) { Preconditions.checkNotNull(event); - TextClassifierService.this.onSelectionEvent(sessionId, event); + mMainThreadHandler.post( + () -> TextClassifierService.this.onSelectionEvent(sessionId, event)); } - /** {@inheritDoc} */ @Override public void onTextClassifierEvent( TextClassificationSessionId sessionId, TextClassifierEvent event) { Preconditions.checkNotNull(event); - TextClassifierService.this.onTextClassifierEvent(sessionId, event); + mMainThreadHandler.post( + () -> TextClassifierService.this.onTextClassifierEvent(sessionId, event)); } - /** {@inheritDoc} */ @Override public void onDetectLanguage( TextClassificationSessionId sessionId, TextLanguage.Request request, - ITextLanguageCallback callback) { + ITextClassifierCallback callback) { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); - TextClassifierService.this.onDetectLanguage( - sessionId, - request, - mCancellationSignal, - new Callback<TextLanguage>() { - @Override - public void onSuccess(TextLanguage result) { - try { - callback.onSuccess(result); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - - @Override - public void onFailure(CharSequence error) { - try { - callback.onFailure(); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - }; - }); + mMainThreadHandler.post(() -> TextClassifierService.this.onDetectLanguage( + sessionId, request, mCancellationSignal, new ProxyCallback<>(callback))); } - /** {@inheritDoc} */ @Override public void onSuggestConversationActions( TextClassificationSessionId sessionId, ConversationActions.Request request, - IConversationActionsCallback callback) { + ITextClassifierCallback callback) { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); - TextClassifierService.this.onSuggestConversationActions( - sessionId, - request, - mCancellationSignal, - new Callback<ConversationActions>() { - @Override - public void onSuccess(ConversationActions result) { - try { - callback.onSuccess(result); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - - @Override - public void onFailure(CharSequence error) { - try { - callback.onFailure(); - } catch (RemoteException e) { - Slog.d(LOG_TAG, "Error calling callback"); - } - } - }); + mMainThreadHandler.post(() -> TextClassifierService.this.onSuggestConversationActions( + sessionId, request, mCancellationSignal, new ProxyCallback<>(callback))); } - /** {@inheritDoc} */ @Override public void onCreateTextClassificationSession( TextClassificationContext context, TextClassificationSessionId sessionId) { Preconditions.checkNotNull(context); Preconditions.checkNotNull(sessionId); - TextClassifierService.this.onCreateTextClassificationSession(context, sessionId); + mMainThreadHandler.post( + () -> TextClassifierService.this.onCreateTextClassificationSession( + context, sessionId)); } - /** {@inheritDoc} */ @Override public void onDestroyTextClassificationSession(TextClassificationSessionId sessionId) { - TextClassifierService.this.onDestroyTextClassificationSession(sessionId); + mMainThreadHandler.post( + () -> TextClassifierService.this.onDestroyTextClassificationSession(sessionId)); } }; @@ -301,6 +216,7 @@ public abstract class TextClassifierService extends Service { * @param cancellationSignal object to watch for canceling the current operation * @param callback the callback to return the result to */ + @MainThread public abstract void onSuggestSelection( @Nullable TextClassificationSessionId sessionId, @NonNull TextSelection.Request request, @@ -316,6 +232,7 @@ public abstract class TextClassifierService extends Service { * @param cancellationSignal object to watch for canceling the current operation * @param callback the callback to return the result to */ + @MainThread public abstract void onClassifyText( @Nullable TextClassificationSessionId sessionId, @NonNull TextClassification.Request request, @@ -331,6 +248,7 @@ public abstract class TextClassifierService extends Service { * @param cancellationSignal object to watch for canceling the current operation * @param callback the callback to return the result to */ + @MainThread public abstract void onGenerateLinks( @Nullable TextClassificationSessionId sessionId, @NonNull TextLinks.Request request, @@ -345,12 +263,14 @@ public abstract class TextClassifierService extends Service { * @param cancellationSignal object to watch for canceling the current operation * @param callback the callback to return the result to */ + @MainThread public void onDetectLanguage( @Nullable TextClassificationSessionId sessionId, @NonNull TextLanguage.Request request, @NonNull CancellationSignal cancellationSignal, @NonNull Callback<TextLanguage> callback) { - callback.onSuccess(getLocalTextClassifier().detectLanguage(request)); + mSingleThreadExecutor.submit(() -> + callback.onSuccess(getLocalTextClassifier().detectLanguage(request))); } /** @@ -361,12 +281,14 @@ public abstract class TextClassifierService extends Service { * @param cancellationSignal object to watch for canceling the current operation * @param callback the callback to return the result to */ + @MainThread public void onSuggestConversationActions( @Nullable TextClassificationSessionId sessionId, @NonNull ConversationActions.Request request, @NonNull CancellationSignal cancellationSignal, @NonNull Callback<ConversationActions> callback) { - callback.onSuccess(getLocalTextClassifier().suggestConversationActions(request)); + mSingleThreadExecutor.submit(() -> + callback.onSuccess(getLocalTextClassifier().suggestConversationActions(request))); } /** @@ -383,6 +305,7 @@ public abstract class TextClassifierService extends Service { * instead */ @Deprecated + @MainThread public void onSelectionEvent( @Nullable TextClassificationSessionId sessionId, @NonNull SelectionEvent event) {} @@ -396,6 +319,7 @@ public abstract class TextClassifierService extends Service { * @param sessionId the session id * @param event the TextClassifier event */ + @MainThread public void onTextClassifierEvent( @Nullable TextClassificationSessionId sessionId, @NonNull TextClassifierEvent event) {} @@ -405,6 +329,7 @@ public abstract class TextClassifierService extends Service { * @param context the text classification context * @param sessionId the session's Id */ + @MainThread public void onCreateTextClassificationSession( @NonNull TextClassificationContext context, @NonNull TextClassificationSessionId sessionId) {} @@ -414,6 +339,7 @@ public abstract class TextClassifierService extends Service { * * @param sessionId the id of the session to destroy */ + @MainThread public void onDestroyTextClassificationSession( @NonNull TextClassificationSessionId sessionId) {} @@ -441,6 +367,11 @@ public abstract class TextClassifierService extends Service { return TextClassifier.NO_OP; } + /** @hide **/ + public static <T extends Parcelable> T getResponse(Bundle bundle) { + return bundle.getParcelable(KEY_RESULT); + } + /** * Callbacks for TextClassifierService results. * @@ -494,4 +425,44 @@ public abstract class TextClassifierService extends Service { si.permission)); return null; } + + /** + * Forwards the callback result to a wrapped binder callback. + */ + private static final class ProxyCallback<T extends Parcelable> implements Callback<T> { + private WeakReference<ITextClassifierCallback> mTextClassifierCallback; + + private ProxyCallback(ITextClassifierCallback textClassifierCallback) { + mTextClassifierCallback = + new WeakReference<>(Preconditions.checkNotNull(textClassifierCallback)); + } + + @Override + public void onSuccess(T result) { + ITextClassifierCallback callback = mTextClassifierCallback.get(); + if (callback == null) { + return; + } + try { + Bundle bundle = new Bundle(1); + bundle.putParcelable(KEY_RESULT, result); + callback.onSuccess(bundle); + } catch (RemoteException e) { + Slog.d(LOG_TAG, "Error calling callback"); + } + } + + @Override + public void onFailure(CharSequence error) { + ITextClassifierCallback callback = mTextClassifierCallback.get(); + if (callback == null) { + return; + } + try { + callback.onFailure(); + } catch (RemoteException e) { + Slog.d(LOG_TAG, "Error calling callback"); + } + } + } } diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java index 135a8912fc60..f3bbca3500c7 100644 --- a/core/java/android/view/WindowInsets.java +++ b/core/java/android/view/WindowInsets.java @@ -22,6 +22,7 @@ import static android.view.WindowInsets.Type.IME; import static android.view.WindowInsets.Type.LAST; import static android.view.WindowInsets.Type.SIDE_BARS; import static android.view.WindowInsets.Type.SIZE; +import static android.view.WindowInsets.Type.SYSTEM_GESTURES; import static android.view.WindowInsets.Type.TOP_BAR; import static android.view.WindowInsets.Type.all; import static android.view.WindowInsets.Type.compatSystemInsets; @@ -35,7 +36,6 @@ import android.annotation.UnsupportedAppUsage; import android.graphics.Insets; import android.graphics.Rect; import android.util.SparseArray; -import android.view.InsetsState.InternalInsetType; import android.view.WindowInsets.Type.InsetType; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethod; @@ -229,6 +229,7 @@ public final class WindowInsets { static void assignCompatInsets(Insets[] typeInsetMap, Rect insets) { typeInsetMap[indexOf(TOP_BAR)] = Insets.of(0, insets.top, 0, 0); typeInsetMap[indexOf(SIDE_BARS)] = Insets.of(insets.left, 0, insets.right, insets.bottom); + typeInsetMap[indexOf(SYSTEM_GESTURES)] = Insets.of(insets); } private static boolean[] createCompatVisibilityMap(@Nullable Insets[] typeInsetMap) { @@ -630,6 +631,28 @@ public final class WindowInsets { } /** + * Returns the system gesture insets. + * + * <p>The system gesture insets represent the area of a window where system gestures have + * priority and may consume some or all touch input, e.g. due to the a system bar + * occupying it, or it being reserved for touch-only gestures. + * + * <p>Simple taps are guaranteed to reach the window even within the system gesture insets, + * as long as they are outside the {@link #getSystemWindowInsets() system window insets}. + * + * <p>When {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} is requested, an inset will be returned + * even when the system gestures are inactive due to + * {@link View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN} or + * {@link View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}. + * + * <p>This inset does not affect the result of {@link #isConsumed()} and cannot be consumed. + */ + @NonNull + public Insets getSystemGestureInsets() { + return getInsets(mTypeInsetsMap, SYSTEM_GESTURES); + } + + /** * Returns a copy of this WindowInsets with the stable insets fully consumed. * * @return A modified copy of this WindowInsets @@ -853,6 +876,22 @@ public final class WindowInsets { } /** + * Sets system gesture insets in pixels. + * + * <p>The system gesture insets represent the area of a window where system gestures have + * priority and may consume some or all touch input, e.g. due to the a system bar + * occupying it, or it being reserved for touch-only gestures. + * + * @see #getSystemGestureInsets() + * @return itself + */ + @NonNull + public Builder setSystemGestureInsets(@NonNull Insets insets) { + WindowInsets.setInsets(mTypeInsetsMap, SYSTEM_GESTURES, insets); + return this; + } + + /** * Sets the insets of a specific window type in pixels. * * <p>The insets represents the area of a a window that is partially or fully obscured by @@ -1005,8 +1044,10 @@ public final class WindowInsets { static final int IME = 0x2; static final int SIDE_BARS = 0x4; - static final int LAST = 0x8; - static final int SIZE = 4; + static final int SYSTEM_GESTURES = 0x8; + + static final int LAST = 0x10; + static final int SIZE = 5; static final int WINDOW_DECOR = LAST; static int indexOf(@InsetType int type) { @@ -1017,8 +1058,10 @@ public final class WindowInsets { return 1; case SIDE_BARS: return 2; - case WINDOW_DECOR: + case SYSTEM_GESTURES: return 3; + case WINDOW_DECOR: + return 4; default: throw new IllegalArgumentException("type needs to be >= FIRST and <= LAST," + " type=" + type); @@ -1030,7 +1073,7 @@ public final class WindowInsets { /** @hide */ @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = true, value = { TOP_BAR, IME, SIDE_BARS, WINDOW_DECOR }) + @IntDef(flag = true, value = { TOP_BAR, IME, SIDE_BARS, WINDOW_DECOR, SYSTEM_GESTURES }) public @interface InsetType { } @@ -1064,6 +1107,27 @@ public final class WindowInsets { } /** + * Returns an inset type representing the system gesture insets. + * + * <p>The system gesture insets represent the area of a window where system gestures have + * priority and may consume some or all touch input, e.g. due to the a system bar + * occupying it, or it being reserved for touch-only gestures. + * + * <p>Simple taps are guaranteed to reach the window even within the system gesture insets, + * as long as they are outside the {@link #getSystemWindowInsets() system window insets}. + * + * <p>When {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} is requested, an inset will be returned + * even when the system gestures are inactive due to + * {@link View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN} or + * {@link View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}. + * + * @see #getSystemGestureInsets() + */ + public static @InsetType int systemGestures() { + return SYSTEM_GESTURES; + } + + /** * @return All system bars. Includes {@link #topBar()} as well as {@link #sideBars()}, but * not {@link #ime()}. */ @@ -1082,6 +1146,9 @@ public final class WindowInsets { /** * @return All inset types combined. + * + * TODO: Figure out if this makes sense at all, mixing e.g {@link #systemGestures()} and + * {@link #ime()} does not seem very useful. */ public static @InsetType int all() { return 0xFFFFFFFF; diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java index 8b370f543ccc..8f8766e3f783 100644 --- a/core/java/android/view/textclassifier/SystemTextClassifier.java +++ b/core/java/android/view/textclassifier/SystemTextClassifier.java @@ -20,15 +20,14 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.WorkerThread; import android.content.Context; +import android.os.Bundle; import android.os.Looper; +import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; -import android.service.textclassifier.IConversationActionsCallback; -import android.service.textclassifier.ITextClassificationCallback; +import android.service.textclassifier.ITextClassifierCallback; import android.service.textclassifier.ITextClassifierService; -import android.service.textclassifier.ITextLanguageCallback; -import android.service.textclassifier.ITextLinksCallback; -import android.service.textclassifier.ITextSelectionCallback; +import android.service.textclassifier.TextClassifierService; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; @@ -73,9 +72,10 @@ public final class SystemTextClassifier implements TextClassifier { Utils.checkMainThread(); try { request.setCallingPackageName(mPackageName); - final TextSelectionCallback callback = new TextSelectionCallback(); + final BlockingCallback<TextSelection> callback = + new BlockingCallback<>("textselection"); mManagerService.onSuggestSelection(mSessionId, request, callback); - final TextSelection selection = callback.mReceiver.get(); + final TextSelection selection = callback.get(); if (selection != null) { return selection; } @@ -95,9 +95,10 @@ public final class SystemTextClassifier implements TextClassifier { Utils.checkMainThread(); try { request.setCallingPackageName(mPackageName); - final TextClassificationCallback callback = new TextClassificationCallback(); + final BlockingCallback<TextClassification> callback = + new BlockingCallback<>("textclassification"); mManagerService.onClassifyText(mSessionId, request, callback); - final TextClassification classification = callback.mReceiver.get(); + final TextClassification classification = callback.get(); if (classification != null) { return classification; } @@ -122,9 +123,10 @@ public final class SystemTextClassifier implements TextClassifier { try { request.setCallingPackageName(mPackageName); - final TextLinksCallback callback = new TextLinksCallback(); + final BlockingCallback<TextLinks> callback = + new BlockingCallback<>("textlinks"); mManagerService.onGenerateLinks(mSessionId, request, callback); - final TextLinks links = callback.mReceiver.get(); + final TextLinks links = callback.get(); if (links != null) { return links; } @@ -165,9 +167,10 @@ public final class SystemTextClassifier implements TextClassifier { try { request.setCallingPackageName(mPackageName); - final TextLanguageCallback callback = new TextLanguageCallback(); + final BlockingCallback<TextLanguage> callback = + new BlockingCallback<>("textlanguage"); mManagerService.onDetectLanguage(mSessionId, request, callback); - final TextLanguage textLanguage = callback.mReceiver.get(); + final TextLanguage textLanguage = callback.get(); if (textLanguage != null) { return textLanguage; } @@ -184,9 +187,10 @@ public final class SystemTextClassifier implements TextClassifier { try { request.setCallingPackageName(mPackageName); - final ConversationActionsCallback callback = new ConversationActionsCallback(); + final BlockingCallback<ConversationActions> callback = + new BlockingCallback<>("conversation-actions"); mManagerService.onSuggestConversationActions(mSessionId, request, callback); - final ConversationActions conversationActions = callback.mReceiver.get(); + final ConversationActions conversationActions = callback.get(); if (conversationActions != null) { return conversationActions; } @@ -245,82 +249,28 @@ public final class SystemTextClassifier implements TextClassifier { } } - private static final class TextSelectionCallback extends ITextSelectionCallback.Stub { + private static final class BlockingCallback<T extends Parcelable> + extends ITextClassifierCallback.Stub { + private final ResponseReceiver<T> mReceiver; - final ResponseReceiver<TextSelection> mReceiver = new ResponseReceiver<>("textselection"); - - @Override - public void onSuccess(TextSelection selection) { - mReceiver.onSuccess(selection); + BlockingCallback(String name) { + mReceiver = new ResponseReceiver<>(name); } @Override - public void onFailure() { - mReceiver.onFailure(); - } - } - - private static final class TextClassificationCallback extends ITextClassificationCallback.Stub { - - final ResponseReceiver<TextClassification> mReceiver = - new ResponseReceiver<>("textclassification"); - - @Override - public void onSuccess(TextClassification classification) { - mReceiver.onSuccess(classification); + public void onSuccess(Bundle result) { + mReceiver.onSuccess(TextClassifierService.getResponse(result)); } @Override public void onFailure() { mReceiver.onFailure(); } - } - private static final class TextLinksCallback extends ITextLinksCallback.Stub { - - final ResponseReceiver<TextLinks> mReceiver = new ResponseReceiver<>("textlinks"); - - @Override - public void onSuccess(TextLinks links) { - mReceiver.onSuccess(links); - } - - @Override - public void onFailure() { - mReceiver.onFailure(); - } - } - - private static final class TextLanguageCallback extends ITextLanguageCallback.Stub { - - final ResponseReceiver<TextLanguage> mReceiver = new ResponseReceiver<>("textlanguage"); - - @Override - public void onSuccess(TextLanguage textLanguage) { - mReceiver.onSuccess(textLanguage); - } - - @Override - public void onFailure() { - mReceiver.onFailure(); - } - } - - private static final class ConversationActionsCallback - extends IConversationActionsCallback.Stub { - - final ResponseReceiver<ConversationActions> mReceiver = - new ResponseReceiver<>("conversationaction"); - - @Override - public void onSuccess(ConversationActions conversationActions) { - mReceiver.onSuccess(conversationActions); + public T get() { + return mReceiver.get(); } - @Override - public void onFailure() { - mReceiver.onFailure(); - } } private static final class ResponseReceiver<T> { diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index 5064d23453a7..445075da7f90 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -616,7 +616,7 @@ enum Action { // OS: Q ACTION_PANEL_INTERACTION = 1658; - // ACTION: Show Contextual homepage, log latency in loading cards + // ACTION: Show Contextual homepage. Log total loading latency. ACTION_CONTEXTUAL_HOME_SHOW = 1662; // ACTION: Contextual card displays @@ -649,6 +649,15 @@ enum Action { ACTION_ATCSCUC = 1680; ACTION_ATCHNUC = 1681; + + // ACTION: Individual contextual card loading time + ACTION_CONTEXTUAL_CARD_LOAD = 1684; + + //ACTION: Contextual card loading timeout + ACTION_CONTEXTUAL_CARD_LOAD_TIMEOUT = 1685; + + //ACTION: Log result for each card's eligibility check + ACTION_CONTEXTUAL_CARD_ELIGIBILITY = 1686; } /** diff --git a/media/apex/java/android/media/MediaItem2.java b/media/apex/java/android/media/MediaItem2.java index fc0f08ead46e..ff0d43e41350 100644 --- a/media/apex/java/android/media/MediaItem2.java +++ b/media/apex/java/android/media/MediaItem2.java @@ -245,7 +245,7 @@ public final class MediaItem2 implements Parcelable { /** * Builder for {@link MediaItem2}. */ - public static class Builder { + public static final class Builder { @SuppressWarnings("WeakerAccess") /* synthetic access */ MediaMetadata mMetadata; @SuppressWarnings("WeakerAccess") /* synthetic access */ diff --git a/packages/CaptivePortalLogin/Android.bp b/packages/CaptivePortalLogin/Android.bp index a71977f8cc6c..bc614e9fc14c 100644 --- a/packages/CaptivePortalLogin/Android.bp +++ b/packages/CaptivePortalLogin/Android.bp @@ -18,6 +18,7 @@ android_app { name: "CaptivePortalLogin", srcs: ["src/**/*.java"], sdk_version: "system_current", + min_sdk_version: "28", certificate: "networkstack", static_libs: [ "androidx.legacy_legacy-support-v4", diff --git a/packages/CaptivePortalLogin/AndroidManifest.xml b/packages/CaptivePortalLogin/AndroidManifest.xml index a5f3b88fef0a..44e0a659212a 100644 --- a/packages/CaptivePortalLogin/AndroidManifest.xml +++ b/packages/CaptivePortalLogin/AndroidManifest.xml @@ -18,7 +18,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.captiveportallogin" - android:versionCode="10" + android:versionCode="11" android:versionName="Q-initial"> <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="28" /> diff --git a/packages/NetworkStack/Android.bp b/packages/NetworkStack/Android.bp index 5f1f26d88171..f210840b976f 100644 --- a/packages/NetworkStack/Android.bp +++ b/packages/NetworkStack/Android.bp @@ -36,6 +36,7 @@ java_library { android_app { name: "NetworkStack", sdk_version: "system_current", + min_sdk_version: "28", certificate: "networkstack", privileged: true, static_libs: [ diff --git a/packages/NetworkStack/AndroidManifest.xml b/packages/NetworkStack/AndroidManifest.xml index 740c573eb914..003f1e59d743 100644 --- a/packages/NetworkStack/AndroidManifest.xml +++ b/packages/NetworkStack/AndroidManifest.xml @@ -19,7 +19,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.networkstack" android:sharedUserId="android.uid.networkstack" - android:versionCode="10" + android:versionCode="11" android:versionName="Q-initial"> <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="28" /> <uses-permission android:name="android.permission.INTERNET" /> diff --git a/packages/NetworkStackPermissionStub/Android.bp b/packages/NetworkStackPermissionStub/Android.bp index dd70cf56b51b..8cee92e5fe6d 100644 --- a/packages/NetworkStackPermissionStub/Android.bp +++ b/packages/NetworkStackPermissionStub/Android.bp @@ -21,6 +21,7 @@ android_app { // a classes.dex. srcs: ["src/**/*.java"], platform_apis: true, + min_sdk_version: "28", certificate: "networkstack", privileged: true, manifest: "AndroidManifest.xml", diff --git a/packages/NetworkStackPermissionStub/AndroidManifest.xml b/packages/NetworkStackPermissionStub/AndroidManifest.xml index 62bf3de3fb95..e83f0503d280 100644 --- a/packages/NetworkStackPermissionStub/AndroidManifest.xml +++ b/packages/NetworkStackPermissionStub/AndroidManifest.xml @@ -19,7 +19,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.networkstack.permissionstub" android:sharedUserId="android.uid.networkstack" - android:versionCode="10" + android:versionCode="11" android:versionName="Q-initial"> <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="28" /> <!-- diff --git a/packages/SystemUI/res/drawable/qs_detail_background.xml b/packages/SystemUI/res/drawable/qs_detail_background.xml index 84c793f6abd6..672abf14774e 100644 --- a/packages/SystemUI/res/drawable/qs_detail_background.xml +++ b/packages/SystemUI/res/drawable/qs_detail_background.xml @@ -14,6 +14,20 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> <transition xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:drawable="@color/qs_detail_transition" /> - <item android:drawable="?android:attr/colorPrimary" /> + <item> + <inset> + <shape> + <solid android:color="@color/qs_detail_transition"/> + <corners android:radius="?android:attr/dialogCornerRadius" /> + </shape> + </inset> + </item> + <item> + <inset> + <shape> + <solid android:color="?android:attr/colorPrimary"/> + <corners android:radius="?android:attr/dialogCornerRadius" /> + </shape> + </inset> + </item> </transition>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout-land/global_actions_grid.xml b/packages/SystemUI/res/layout-land/global_actions_grid.xml index 480f5235f75a..235d0fc62e2d 100644 --- a/packages/SystemUI/res/layout-land/global_actions_grid.xml +++ b/packages/SystemUI/res/layout-land/global_actions_grid.xml @@ -10,14 +10,12 @@ android:gravity="top|right" android:clipChildren="false" > - <LinearLayout android:layout_height="match_parent" android:layout_width="wrap_content" android:gravity="top|right" android:padding="0dp" android:orientation="vertical" - android:layoutDirection="ltr" android:layout_marginRight="@dimen/global_actions_grid_container_bottom_margin" > <!-- Grid of action items --> @@ -26,7 +24,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" - android:layoutDirection="ltr" android:layout_marginTop="@dimen/global_actions_grid_side_margin" android:translationZ="@dimen/global_actions_translate" android:paddingLeft="@dimen/global_actions_grid_horizontal_padding" @@ -39,25 +36,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:layoutDirection="ltr" - android:orientation="horizontal" + android:layoutDirection="locale" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:layoutDirection="ltr" - android:orientation="horizontal" + android:layoutDirection="locale" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:layoutDirection="ltr" - android:orientation="horizontal" + android:layoutDirection="locale" /> </com.android.systemui.globalactions.ListGridLayout> - <!-- For separated items--> <LinearLayout android:id="@+id/separated_button" diff --git a/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml b/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml index 4f868263226d..e028214532f0 100644 --- a/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml +++ b/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml @@ -10,7 +10,6 @@ android:gravity="top|left" android:clipChildren="false" > - <LinearLayout android:layout_height="match_parent" android:layout_width="wrap_content" @@ -37,11 +36,11 @@ android:gravity="center" android:translationZ="@dimen/global_actions_translate" /> - <!-- Grid of action items --> <com.android.systemui.globalactions.ListGridLayout android:id="@android:id/list" android:layout_gravity="bottom|left" + android:gravity="right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" @@ -54,28 +53,22 @@ android:background="?android:attr/colorBackgroundFloating" > <LinearLayout - android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:layoutDirection="rtl" - android:orientation="horizontal" + android:layoutDirection="locale" /> <LinearLayout - android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:layoutDirection="rtl" - android:orientation="horizontal" + android:layoutDirection="locale" /> <LinearLayout - android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:layoutDirection="rtl" - android:orientation="horizontal" + android:layoutDirection="locale" /> </com.android.systemui.globalactions.ListGridLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/global_actions_grid.xml b/packages/SystemUI/res/layout/global_actions_grid.xml index 729e96ebc22e..a620a8eb144b 100644 --- a/packages/SystemUI/res/layout/global_actions_grid.xml +++ b/packages/SystemUI/res/layout/global_actions_grid.xml @@ -10,7 +10,6 @@ android:gravity="bottom|center" android:clipChildren="false" > - <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" @@ -35,14 +34,13 @@ android:gravity="center" android:translationZ="@dimen/global_actions_translate" /> - <!-- Grid of action items --> <com.android.systemui.globalactions.ListGridLayout android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - android:layoutDirection="rtl" + android:orientation="vertical" + android:gravity="right" android:layout_marginRight="@dimen/global_actions_grid_side_margin" android:translationZ="@dimen/global_actions_translate" android:paddingLeft="@dimen/global_actions_grid_horizontal_padding" @@ -55,19 +53,19 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:orientation="vertical" + android:layoutDirection="locale" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:orientation="vertical" + android:layoutDirection="locale" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - android:orientation="vertical" + android:layoutDirection="locale" /> </com.android.systemui.globalactions.ListGridLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index 863c1ccd7eaf..bd9d3fb43528 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -44,7 +44,7 @@ android:id="@+id/pkgname" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@*android:style/TextAppearance.Material.Notification.Info" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Info" android:layout_marginStart="3dp" android:layout_marginEnd="2dp" android:singleLine="true" @@ -54,7 +54,7 @@ android:id="@+id/pkg_divider" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@*android:style/TextAppearance.Material.Notification.Info" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Info" android:layout_marginStart="2dp" android:layout_marginEnd="2dp" android:text="@*android:string/notification_header_divider_symbol" @@ -64,7 +64,7 @@ android:id="@+id/delegate_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@*android:style/TextAppearance.Material.Notification.Info" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Info" android:layout_marginStart="2dp" android:layout_marginEnd="2dp" android:ellipsize="end" @@ -129,7 +129,7 @@ asked for it --> android:id="@+id/group_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@*android:style/TextAppearance.Material.Notification.Title" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Title" android:layout_marginStart="2dp" android:layout_marginEnd="2dp" android:ellipsize="end" @@ -139,7 +139,7 @@ asked for it --> android:id="@+id/pkg_group_divider" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@*android:style/TextAppearance.Material.Notification.Title" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Title" android:layout_marginStart="2dp" android:layout_marginEnd="2dp" android:text="@*android:string/notification_header_divider_symbol" @@ -151,7 +151,7 @@ asked for it --> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" - style="@android:style/TextAppearance.Material.Notification.Title" + style="@*android:style/TextAppearance.DeviceDefault.Notification.Title" android:layout_toEndOf="@id/pkg_group_divider"/> </RelativeLayout> <!-- Question prompt --> @@ -159,7 +159,7 @@ asked for it --> android:id="@+id/block_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@android:style/TextAppearance.Material.Notification" /> + style="@*android:style/TextAppearance.DeviceDefault.Notification" /> </LinearLayout> <!-- Settings and Done buttons --> diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java index f5451e952dd9..26c5ef95981f 100644 --- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java +++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java @@ -90,7 +90,7 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable { } @Override - public ViewGroup getParentView(boolean separated, int index, boolean reverse) { + public ViewGroup getParentView(boolean separated, int index, int rotation) { if (separated) { return getSeparatedView(); } else { diff --git a/packages/SystemUI/src/com/android/systemui/MultiListLayout.java b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java index 8c49d56ae348..8259da6efe2d 100644 --- a/packages/SystemUI/src/com/android/systemui/MultiListLayout.java +++ b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java @@ -57,12 +57,12 @@ public abstract class MultiListLayout extends LinearLayout { * @param separated Whether or not this index refers to a position in the separated or list * container. * @param index The index of the item within the container. - * @param reverse If the MultiListLayout contains sub-lists within the list container, reverse - * the order that they are filled. + * @param rotation Specifies the rotation of the device, which is used in some cases to + * determine child ordering. * @return The parent ViewGroup which will be used to contain the specified item * after it has been added to the layout. */ - public abstract ViewGroup getParentView(boolean separated, int index, boolean reverse); + public abstract ViewGroup getParentView(boolean separated, int index, int rotation); /** * Sets the divided view, which may have a differently-colored background. diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 3fa6035387c7..c16c91bd4625 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -96,6 +96,7 @@ import com.android.systemui.volume.SystemUIInterpolators.LogAccelerateInterpolat import java.util.ArrayList; import java.util.List; +import java.util.Locale; /** * Helper to show the global actions dialog. Each item is an {@link Action} that @@ -1546,33 +1547,40 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, ArrayList<Action> listActions = mAdapter.getListActions(mShouldDisplaySeparatedButton); mGlobalActionsLayout.setExpectedListItemCount(listActions.size()); mGlobalActionsLayout.setExpectedSeparatedItemCount(separatedActions.size()); + int rotation = RotationUtils.getRotation(mContext); + + boolean reverse = false; // should we add items to parents in the reverse order? + if (isGridEnabled(mContext)) { + if (rotation == RotationUtils.ROTATION_NONE + || rotation == RotationUtils.ROTATION_SEASCAPE) { + reverse = !reverse; // if we're in portrait or seascape, reverse items + } + if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) + == View.LAYOUT_DIRECTION_RTL) { + reverse = !reverse; // if we're in an RTL language, reverse items (again) + } + } for (int i = 0; i < mAdapter.getCount(); i++) { Action action = mAdapter.getItem(i); int separatedIndex = separatedActions.indexOf(action); ViewGroup parent; if (separatedIndex != -1) { - parent = mGlobalActionsLayout.getParentView(true, separatedIndex, false); + parent = mGlobalActionsLayout.getParentView(true, separatedIndex, rotation); } else { - boolean reverse = false; - - // If we're using the grid layout and we're in seascape, reverse the order - // of sublists to make sure they render in the correct positions, - // since we can't reverse vertical LinearLayouts through the layout xml. - - if (isGridEnabled(mContext) && RotationUtils.getRotation(mContext) - == RotationUtils.ROTATION_SEASCAPE) { - reverse = true; - } int listIndex = listActions.indexOf(action); - parent = mGlobalActionsLayout.getParentView(false, listIndex, reverse); + parent = mGlobalActionsLayout.getParentView(false, listIndex, rotation); } View v = mAdapter.getView(i, null, parent); final int pos = i; v.setOnClickListener(view -> mClickListener.onClick(this, pos)); v.setOnLongClickListener(view -> mLongClickListener.onItemLongClick(null, v, pos, 0)); - parent.addView(v); + if (reverse) { + parent.addView(v, 0); // reverse order of items + } else { + parent.addView(v); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java index 1d042776efc9..036d8ca3afb6 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java @@ -23,6 +23,7 @@ import android.view.ViewGroup; import com.android.systemui.HardwareBgDrawable; import com.android.systemui.MultiListLayout; +import com.android.systemui.util.leak.RotationUtils; /** * Grid-based implementation of the button layout created by the global actions dialog. @@ -83,11 +84,18 @@ public class GlobalActionsGridLayout extends MultiListLayout { } @Override - public ViewGroup getParentView(boolean separated, int index, boolean reverseOrder) { + public ViewGroup getParentView(boolean separated, int index, int rotation) { if (separated) { return getSeparatedView(); } else { - return getListView().getParentView(index, reverseOrder); + switch (rotation) { + case RotationUtils.ROTATION_LANDSCAPE: + return getListView().getParentView(index, false, true); + case RotationUtils.ROTATION_SEASCAPE: + return getListView().getParentView(index, true, true); + default: + return getListView().getParentView(index, false, false); + } } } @@ -96,6 +104,6 @@ public class GlobalActionsGridLayout extends MultiListLayout { */ @Override public void setDivisionView(View v) { - + // do nothing } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java index d5dcd74c7ea8..4df1c5a43a1b 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java @@ -62,11 +62,11 @@ public class ListGridLayout extends LinearLayout { /** * Get the parent view associated with the item which should be placed at the given position. */ - public ViewGroup getParentView(int index, boolean reverseSublists) { + public ViewGroup getParentView(int index, boolean reverseSublists, boolean swapRowsAndColumns) { if (mRows == 0) { return null; } - int column = getParentViewIndex(index, reverseSublists); + int column = getParentViewIndex(index, reverseSublists, swapRowsAndColumns); return (ViewGroup) getChildAt(column); } @@ -74,13 +74,18 @@ public class ListGridLayout extends LinearLayout { return getChildCount() - (index + 1); } - private int getParentViewIndex(int index, boolean reverseSublists) { - int column = (int) Math.floor(index / mRows); - int columnCount = getChildCount(); + private int getParentViewIndex(int index, boolean reverseSublists, boolean swapRowsAndColumns) { + int sublistIndex; + ViewGroup row; + if (swapRowsAndColumns) { + sublistIndex = (int) Math.floor(index / mRows); + } else { + sublistIndex = index % mRows; + } if (reverseSublists) { - column = reverseSublistIndex(column); + sublistIndex = reverseSublistIndex(sublistIndex); } - return column; + return sublistIndex; } /** diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto index 0a6e92371d6a..91b161d3192f 100644 --- a/proto/src/metrics_constants/metrics_constants.proto +++ b/proto/src/metrics_constants/metrics_constants.proto @@ -7078,6 +7078,15 @@ message MetricsEvent { // Open: Settings will show the conditional when Grayscale mode is on SETTINGS_CONDITION_GRAYSCALE_MODE = 1683; + // ACTION: Individual contextual card loading time + ACTION_CONTEXTUAL_CARD_LOAD = 1684; + + //ACTION: Contextual card loading timeout + ACTION_CONTEXTUAL_CARD_LOAD_TIMEOUT = 1685; + + //ACTION: Log result for each card's eligibility check + ACTION_CONTEXTUAL_CARD_ELIGIBILITY = 1686; + // ---- End Q Constants, all Q constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java index 18c272202990..d26663520850 100644 --- a/services/core/java/com/android/server/RescueParty.java +++ b/services/core/java/com/android/server/RescueParty.java @@ -38,9 +38,11 @@ import android.util.StatsLog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import com.android.server.am.SettingsToPropertiesMapper; import com.android.server.utils.FlagNamespaceUtils; import java.io.File; +import java.util.Arrays; /** * Utilities to help rescue the system from crash loops. Callers are expected to @@ -158,6 +160,7 @@ public class RescueParty { * opportunity to reset any settings depending on our rescue level. */ public static void onSettingsProviderPublished(Context context) { + handleNativeRescuePartyResets(); executeRescueLevel(context); } @@ -176,6 +179,13 @@ public class RescueParty { return SystemClock.elapsedRealtime(); } + private static void handleNativeRescuePartyResets() { + if (SettingsToPropertiesMapper.isNativeFlagsResetPerformed()) { + FlagNamespaceUtils.resetDeviceConfig(Settings.RESET_MODE_TRUSTED_DEFAULTS, + Arrays.asList(SettingsToPropertiesMapper.getResetNativeCategories())); + } + } + /** * Escalate to the next rescue level. After incrementing the level you'll * probably want to call {@link #executeRescueLevel(Context)}. diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index 5da1ce610079..194549f15ecf 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -16,6 +16,7 @@ package com.android.server.am; +import android.annotation.NonNull; import android.content.ContentResolver; import android.database.ContentObserver; import android.net.Uri; @@ -167,7 +168,7 @@ public class SettingsToPropertiesMapper { * booting. * @return */ - public static String[] getResetNativeCategories() { + public static @NonNull String[] getResetNativeCategories() { if (!isNativeFlagsResetPerformed()) { return new String[0]; } diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java index ef771406805b..a5d291f94751 100644 --- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java +++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java @@ -27,12 +27,8 @@ import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; -import android.service.textclassifier.IConversationActionsCallback; -import android.service.textclassifier.ITextClassificationCallback; +import android.service.textclassifier.ITextClassifierCallback; import android.service.textclassifier.ITextClassifierService; -import android.service.textclassifier.ITextLanguageCallback; -import android.service.textclassifier.ITextLinksCallback; -import android.service.textclassifier.ITextSelectionCallback; import android.service.textclassifier.TextClassifierService; import android.util.Slog; import android.util.SparseArray; @@ -132,7 +128,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi @Override public void onSuggestSelection( TextClassificationSessionId sessionId, - TextSelection.Request request, ITextSelectionCallback callback) + TextSelection.Request request, ITextClassifierCallback callback) throws RemoteException { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); @@ -155,7 +151,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi @Override public void onClassifyText( TextClassificationSessionId sessionId, - TextClassification.Request request, ITextClassificationCallback callback) + TextClassification.Request request, ITextClassifierCallback callback) throws RemoteException { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); @@ -178,7 +174,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi @Override public void onGenerateLinks( TextClassificationSessionId sessionId, - TextLinks.Request request, ITextLinksCallback callback) + TextLinks.Request request, ITextClassifierCallback callback) throws RemoteException { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); @@ -241,7 +237,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi public void onDetectLanguage( TextClassificationSessionId sessionId, TextLanguage.Request request, - ITextLanguageCallback callback) throws RemoteException { + ITextClassifierCallback callback) throws RemoteException { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); validateInput(mContext, request.getCallingPackageName()); @@ -264,7 +260,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi public void onSuggestConversationActions( TextClassificationSessionId sessionId, ConversationActions.Request request, - IConversationActionsCallback callback) throws RemoteException { + ITextClassifierCallback callback) throws RemoteException { Preconditions.checkNotNull(request); Preconditions.checkNotNull(callback); validateInput(mContext, request.getCallingPackageName()); diff --git a/services/core/java/com/android/server/utils/FlagNamespaceUtils.java b/services/core/java/com/android/server/utils/FlagNamespaceUtils.java index f26121eac939..f8c7447fc55d 100644 --- a/services/core/java/com/android/server/utils/FlagNamespaceUtils.java +++ b/services/core/java/com/android/server/utils/FlagNamespaceUtils.java @@ -19,6 +19,7 @@ package com.android.server.utils; import android.annotation.Nullable; import android.provider.DeviceConfig; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.RescueParty; import java.util.ArrayList; @@ -41,20 +42,23 @@ public final class FlagNamespaceUtils { /** * Name of the special namespace in DeviceConfig table used for communicating resets. */ - private static final String NAMESPACE_RESCUE_PARTY = "rescue_party_namespace"; + @VisibleForTesting + public static final String NAMESPACE_RESCUE_PARTY = "rescue_party_namespace"; /** * Flag in the {@link DeviceConfig} in {@link #NAMESPACE_RESCUE_PARTY}, holding all known {@link * DeviceConfig} namespaces, as a {@link #DELIMITER} separated String. It's updated after the * first time flags are written to the new namespace in the {@link DeviceConfig}. */ - private static final String ALL_KNOWN_NAMESPACES_FLAG = "all_known_namespaces"; + @VisibleForTesting + public static final String ALL_KNOWN_NAMESPACES_FLAG = "all_known_namespaces"; /** * Flag in the {@link DeviceConfig} in {@link #NAMESPACE_RESCUE_PARTY} with integer counter * suffix added to it, holding {@link DeviceConfig} namespace value whose flags were recently * reset by the {@link RescueParty}. It's updated by {@link RescueParty} every time given * namespace flags are reset. */ - private static final String RESET_PLATFORM_PACKAGE_FLAG = "reset_platform_package"; + @VisibleForTesting + public static final String RESET_PLATFORM_PACKAGE_FLAG = "reset_platform_package"; private static final String DELIMITER = ":"; /** * Maximum value of the counter used in combination with {@link #RESET_PLATFORM_PACKAGE_FLAG} @@ -97,11 +101,25 @@ public final class FlagNamespaceUtils { * Reset all namespaces in DeviceConfig with consumed resetMode. */ public static void resetDeviceConfig(int resetMode) { - List<String> allKnownNamespaces = getAllKnownDeviceConfigNamespacesList(); - for (String namespace : allKnownNamespaces) { + resetDeviceConfig(resetMode, getAllKnownDeviceConfigNamespacesList()); + } + + /** + * Reset all consumed namespaces in DeviceConfig with consumed resetMode. + */ + public static void resetDeviceConfig(int resetMode, List<String> namespacesList) { + for (String namespace : namespacesList) { DeviceConfig.resetToDefaults(resetMode, namespace); } - addToKnownResetNamespaces(allKnownNamespaces); + addToKnownResetNamespaces(namespacesList); + } + + /** + * Resets known reset namespaces flag counter for tests only. + */ + @VisibleForTesting + public static void resetKnownResetNamespacesFlagCounterForTest() { + sKnownResetNamespacesFlagCounter = -1; } /** diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index a19d5d5a5d76..eba0081291ca 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1881,19 +1881,6 @@ public final class SystemServer { mSystemServiceManager.startService(IncidentCompanionService.class); traceEnd(); - if (safeMode) { - traceBeginAndSlog("EnterSafeModeAndDisableJitCompilation"); - mActivityManagerService.enterSafeMode(); - // Disable the JIT for the system_server process - VMRuntime.getRuntime().disableJitCompilation(); - traceEnd(); - } else { - // Enable the JIT for the system_server process - traceBeginAndSlog("StartJitCompilation"); - VMRuntime.getRuntime().startJitCompilation(); - traceEnd(); - } - // MMS service broker traceBeginAndSlog("StartMmsService"); mmsService = mSystemServiceManager.startService(MmsServiceBroker.class); diff --git a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java index b13735cbf3b7..36825af527b1 100644 --- a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java @@ -35,9 +35,12 @@ import android.content.Context; import android.os.RecoverySystem; import android.os.SystemProperties; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; import com.android.dx.mockito.inline.extended.ExtendedMockito; +import com.android.server.am.SettingsToPropertiesMapper; +import com.android.server.utils.FlagNamespaceUtils; import org.junit.After; import org.junit.Before; @@ -56,6 +59,10 @@ import java.util.HashMap; public class RescuePartyTest { private static final int PERSISTENT_APP_UID = 12; private static final long CURRENT_NETWORK_TIME_MILLIS = 0L; + private static final String FAKE_NATIVE_NAMESPACE1 = "native1"; + private static final String FAKE_NATIVE_NAMESPACE2 = "native2"; + private static final String[] FAKE_RESET_NATIVE_NAMESPACES = + {FAKE_NATIVE_NAMESPACE1, FAKE_NATIVE_NAMESPACE2}; private MockitoSession mSession; @@ -73,9 +80,11 @@ public class RescuePartyTest { ExtendedMockito.mockitoSession().initMocks( this) .strictness(Strictness.LENIENT) + .spyStatic(DeviceConfig.class) .spyStatic(SystemProperties.class) .spyStatic(Settings.Global.class) .spyStatic(Settings.Secure.class) + .spyStatic(SettingsToPropertiesMapper.class) .spyStatic(RecoverySystem.class) .spyStatic(RescueParty.class) .startMocking(); @@ -121,8 +130,17 @@ public class RescuePartyTest { } ).when(() -> SystemProperties.getLong(anyString(), anyLong())); + // Mock DeviceConfig + doAnswer((Answer<Boolean>) invocationOnMock -> true) + .when(() -> DeviceConfig.setProperty(anyString(), anyString(), anyString(), + anyBoolean())); + doAnswer((Answer<Void>) invocationOnMock -> null) + .when(() -> DeviceConfig.resetToDefaults(anyInt(), anyString())); + + doReturn(CURRENT_NETWORK_TIME_MILLIS).when(() -> RescueParty.getElapsedRealtime()); RescueParty.resetAllThresholds(); + FlagNamespaceUtils.resetKnownResetNamespacesFlagCounterForTest(); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString(RescueParty.LEVEL_NONE)); @@ -278,10 +296,32 @@ public class RescuePartyTest { SystemProperties.getInt(RescueParty.PROP_RESCUE_LEVEL, RescueParty.LEVEL_NONE)); } + @Test + public void testNativeRescuePartyResets() { + doReturn(true).when(() -> SettingsToPropertiesMapper.isNativeFlagsResetPerformed()); + doReturn(FAKE_RESET_NATIVE_NAMESPACES).when( + () -> SettingsToPropertiesMapper.getResetNativeCategories()); + + RescueParty.onSettingsProviderPublished(mMockContext); + + verify(() -> DeviceConfig.resetToDefaults(Settings.RESET_MODE_TRUSTED_DEFAULTS, + FAKE_NATIVE_NAMESPACE1)); + verify(() -> DeviceConfig.resetToDefaults(Settings.RESET_MODE_TRUSTED_DEFAULTS, + FAKE_NATIVE_NAMESPACE2)); + + ExtendedMockito.verify( + () -> DeviceConfig.setProperty(FlagNamespaceUtils.NAMESPACE_RESCUE_PARTY, + FlagNamespaceUtils.RESET_PLATFORM_PACKAGE_FLAG + 0, + FAKE_NATIVE_NAMESPACE1, /*makeDefault=*/true)); + ExtendedMockito.verify( + () -> DeviceConfig.setProperty(FlagNamespaceUtils.NAMESPACE_RESCUE_PARTY, + FlagNamespaceUtils.RESET_PLATFORM_PACKAGE_FLAG + 1, + FAKE_NATIVE_NAMESPACE2, /*makeDefault=*/true)); + } + private void verifySettingsResets(int resetMode) { verify(() -> Settings.Global.resetToDefaultsAsUser(mMockContentResolver, null, - resetMode, - UserHandle.USER_SYSTEM)); + resetMode, UserHandle.USER_SYSTEM)); verify(() -> Settings.Secure.resetToDefaultsAsUser(eq(mMockContentResolver), isNull(), eq(resetMode), anyInt())); } |