diff options
Diffstat (limited to 'libs')
36 files changed, 7384 insertions, 123 deletions
diff --git a/libs/WindowManager/Shell/lint-baseline.xml b/libs/WindowManager/Shell/lint-baseline.xml new file mode 100644 index 000000000000..06094ffe1930 --- /dev/null +++ b/libs/WindowManager/Shell/lint-baseline.xml @@ -0,0 +1,5471 @@ +<?xml version="1.0" encoding="UTF-8"?> +<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0"> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" return mRootTaskInfo != null ? mRootTaskInfo.taskId : INVALID_TASK_ID;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="73" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" return mTaskInfo1 != null ? mTaskInfo1.taskId : INVALID_TASK_ID;" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="77" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" return mTaskInfo2 != null ? mTaskInfo2.taskId : INVALID_TASK_ID;" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="81" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = task1.taskId; long protoLogParam1 = task2.taskId; String protoLogParam2 = String.valueOf(this); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -742394458, 5, null, protoLogParam0, protoLogParam1, protoLogParam2); " + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="89" + column="113"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = task1.taskId; long protoLogParam1 = task2.taskId; String protoLogParam2 = String.valueOf(this); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -742394458, 5, null, protoLogParam0, protoLogParam1, protoLogParam2); " + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="89" + column="149"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b -> b.setParent(mRootTaskLeash), mDisplayImeController);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="105" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mRootTaskInfo == null || taskInfo.taskId == mRootTaskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="151" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mRootTaskInfo == null || taskInfo.taskId == mRootTaskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="151" + column="57"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.taskId == getTaskId1()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="154" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.taskId == getTaskId2()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="157" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" throw new IllegalStateException("Unknown task=" + taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="161" + column="63"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(dividerLeash, Integer.MAX_VALUE)" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="172" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (taskInfo.taskId == getRootTaskId()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="186" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.taskId == getTaskId1()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="202" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.taskId == getTaskId2()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="204" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" throw new IllegalStateException("Unknown task=" + taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="207" + column="63"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (taskInfo.taskId == getRootTaskId()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="213" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mController.unpair(mRootTaskInfo.taskId, false /* releaseToPool */);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="215" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.taskId == getTaskId1() || taskInfo.taskId == getTaskId2()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="216" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.taskId == getTaskId1() || taskInfo.taskId == getTaskId2()) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="216" + column="55"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mController.unpair(mRootTaskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="217" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mRootTaskLeash);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="224" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mTaskLeash1);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="226" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mTaskLeash2);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="228" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" pw.println(innerPrefix + "1 taskId=" + mTaskInfo1.taskId" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="242" + column="52"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" pw.println(innerPrefix + "2 taskId=" + mTaskInfo2.taskId" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="246" + column="52"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" .setLayer(dividerLeash, Integer.MAX_VALUE)" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java" + line="291" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.content.LocusId`" + errorLine1=" mLocusId = locus != null ? new LocusId(locus) : null;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="177" + column="36"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.service.notification.StatusBarNotification#getUid`" + errorLine1=" mAppUid = entry.getStatusBarNotification().getUid();" + errorLine2=" ~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="449" + column="52"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#getConversationShortcutInfo`" + errorLine1=" mShortcutInfo = entry.getRanking().getConversationShortcutInfo();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="453" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.app.NotificationChannel#isImportantConversation`" + errorLine1=" entry.getRanking().getChannel().isImportantConversation();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="457" + column="57"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.app.Notification.BubbleMetadata#getShortcutId`" + errorLine1=" mMetadataShortcutId = entry.getBubbleMetadata().getShortcutId();" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="461" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDesiredHeight`" + errorLine1=" mDesiredHeight = entry.getBubbleMetadata().getDesiredHeight();" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="463" + column="56"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDesiredHeightResId`" + errorLine1=" mDesiredHeightResId = entry.getBubbleMetadata().getDesiredHeightResId();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="464" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIcon`" + errorLine1=" mIcon = entry.getBubbleMetadata().getIcon();" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="465" + column="47"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`" + errorLine1=" mIntent = entry.getBubbleMetadata().getIntent();" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="471" + column="53"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`" + errorLine1=" } else if (mIntent != null && entry.getBubbleMetadata().getIntent() == null) {" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="475" + column="69"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDeleteIntent`" + errorLine1=" mDeleteIntent = entry.getBubbleMetadata().getDeleteIntent();" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="481" + column="55"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.app.Notification.MessagingStyle.Message#getMessagesFromBundleArray`" + errorLine1=" Notification.MessagingStyle.Message.getMessagesFromBundleArray(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="856" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.app.Notification.MessagingStyle.Message#getSenderPerson`" + errorLine1=" Person sender = latestMessage.getSenderPerson();" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="864" + column="51"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.app.Person#getName`" + errorLine1=" bubbleMessage.senderName = sender != null ? sender.getName() : null;" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="865" + column="72"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.app.Person#getIcon`" + errorLine1=" bubbleMessage.senderIcon = sender != null ? sender.getIcon() : null;" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java" + line="867" + column="72"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (task.taskId == b.getTaskId()) {" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java" + line="357" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`" + errorLine1=" mWmLayoutParams.setFitInsetsTypes(0);" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java" + line="553" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`" + errorLine1=" mWmLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java" + line="558" + column="9"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getAutoExpandBubble`" + errorLine1=" && !notif.getBubbleMetadata().getAutoExpandBubble())" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java" + line="842" + column="51"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#canBubble`" + errorLine1=" if (isActiveBubble && !mTmpRanking.canBubble()) {" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java" + line="919" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`" + errorLine1=" ? entry.getBubbleMetadata().getIntent()" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java" + line="1217" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.app.Notification.BubbleMetadata#getShortcutId`" + errorLine1=" && entry.getBubbleMetadata().getShortcutId() != null) {" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java" + line="1220" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.LocusId#getId`" + errorLine1=" b.locusId?.id" + errorLine2=" ~~"> + <location + file="frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt" + line="85" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification#getLocusId`" + errorLine1=" return mSbn.getNotification().getLocusId();" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java" + line="81" + column="39"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.app.Notification#getBubbleMetadata`" + errorLine1=" return getStatusBarNotification().getNotification().getBubbleMetadata();" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java" + line="87" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#canBubble`" + errorLine1=" return mRanking.canBubble();" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java" + line="115" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.graphics.Bitmap#createBitmap`" + errorLine1=" Bitmap snapshot = Bitmap.createBitmap(p);" + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java" + line="428" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 26): `android.graphics.Bitmap#getHardwareBuffer`" + errorLine1=" return new SurfaceControl.ScreenshotHardwareBuffer(snapshot.getHardwareBuffer()," + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java" + line="429" + column="73"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`" + errorLine1=" if (mTaskView == null || mTaskView.getSurfaceControl() == null) {" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java" + line="432" + column="44"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`" + errorLine1=" mTaskView.getSurfaceControl()," + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java" + line="436" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" ? mExpandedViewContainerLocation[1] - mPositioner.getInsets().top" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java" + line="636" + column="55"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.graphics.Outline#setPath`" + errorLine1=" outline.setPath(rectPath);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java" + line="504" + column="21"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`" + errorLine1=" if (ic.getType() == Icon.TYPE_URI" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java" + line="65" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`" + errorLine1=" || ic.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java" + line="66" + column="31"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getUri`" + errorLine1=" ic.getUri()," + errorLine2=" ~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java" + line="68" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" getContext().getDisplay().getMetrics(displayMetrics);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java" + line="143" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`" + errorLine1=" WindowMetrics windowMetrics = mWindowManager.getCurrentWindowMetrics();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="93" + column="54"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`" + errorLine1=" WindowInsets metricInsets = windowMetrics.getWindowInsets();" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="97" + column="51"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsetsIgnoringVisibility`" + errorLine1=" Insets insets = metricInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="99" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`" + errorLine1=" Insets insets = metricInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()" + errorLine2=" ~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="99" + column="84"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#statusBars`" + errorLine1=" | WindowInsets.Type.statusBars()" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="100" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`" + errorLine1=" | WindowInsets.Type.displayCutout());" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="101" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`" + errorLine1=" + " bounds: " + windowMetrics.getBounds()" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="107" + column="51"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`" + errorLine1=" updateInternal(orientation, insets, windowMetrics.getBounds());" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="110" + column="59"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" mPositionRect.left += mInsets.left;" + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="134" + column="31"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" mPositionRect.top += mInsets.top;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="135" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`" + errorLine1=" mPositionRect.right -= mInsets.right;" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="136" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`" + errorLine1=" mPositionRect.bottom -= mInsets.bottom;" + errorLine2=" ~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="137" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`" + errorLine1=" WindowInsets metricInsets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="156" + column="56"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`" + errorLine1=" WindowInsets metricInsets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="156" + column="82"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsetsIgnoringVisibility`" + errorLine1=" Insets navBarInsets = metricInsets.getInsetsIgnoringVisibility(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="157" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`" + errorLine1=" WindowInsets.Type.navigationBars());" + errorLine2=" ~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="158" + column="39"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" int newInsetLeft = mInsets.left;" + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="159" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`" + errorLine1=" int newInsetRight = mInsets.right;" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="160" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" mPositionRect.left -= navBarInsets.left;" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="162" + column="39"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" newInsetLeft -= navBarInsets.left;" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="163" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`" + errorLine1=" mPositionRect.right += navBarInsets.right;" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="165" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`" + errorLine1=" newInsetRight -= navBarInsets.right;" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="166" + column="34"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.graphics.Insets#of`" + errorLine1=" mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);" + errorLine2=" ~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="168" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`" + errorLine1=" mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);" + errorLine2=" ~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="168" + column="75"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="168" + column="47"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `new android.graphics.PointF`" + errorLine1=" mRestingStackPosition = new PointF(position);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java" + line="229" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#getAnimationMatrix`" + errorLine1=" pw.println(mExpandedViewContainer.getAnimationMatrix());" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="295" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setSystemGestureExclusionRects`" + errorLine1=" mBubbleContainer.setSystemGestureExclusionRects(mSystemGestureExclusionRects);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="1427" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setSystemGestureExclusionRects`" + errorLine1=" mBubbleContainer.setSystemGestureExclusionRects(Collections.emptyList());" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="1430" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix))" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="1750" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix))" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="1775" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="1863" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="1894" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="1986" + column="44"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="2074" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="2091" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`" + errorLine1=" mExpandedViewContainer.setAnimationMatrix(null);" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="2118" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" int leftPadding = insets.left + mExpandedViewPadding;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="2696" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`" + errorLine1=" int rightPadding = insets.right + mExpandedViewPadding;" + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java" + line="2697" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`" + errorLine1=" if (icon.getType() == Icon.TYPE_URI || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java" + line="220" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`" + errorLine1=" if (icon.getType() == Icon.TYPE_URI || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java" + line="220" + column="53"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getUri`" + errorLine1=" icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);" + errorLine2=" ~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java" + line="222" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java" + line="119" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, transformation.getAlpha());" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java" + line="237" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java" + line="239" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="279" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#ime`" + errorLine1=" if ((types & WindowInsets.Type.ime()) == 0) {" + errorLine2=" ~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="285" + column="44"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#ime`" + errorLine1=" if ((types & WindowInsets.Type.ime()) == 0) {" + errorLine2=" ~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="294" + column="44"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(mImeSourceControl.getLeash(), alpha);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="396" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="398" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(mImeSourceControl.getLeash(), alpha);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="420" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="424" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(mImeSourceControl.getLeash(), 1.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="439" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java" + line="446" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetLeft`" + errorLine1=" outInsets.left += displayCutout.getSafeInsetLeft();" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="313" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetTop`" + errorLine1=" outInsets.top += displayCutout.getSafeInsetTop();" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="314" + column="44"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetRight`" + errorLine1=" outInsets.right += displayCutout.getSafeInsetRight();" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="315" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetBottom`" + errorLine1=" outInsets.bottom += displayCutout.getSafeInsetBottom();" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="316" + column="47"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`" + errorLine1=" final Insets waterfallInsets = rotateInsets(cutout.getWaterfallInsets(), rotation);" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="358" + column="60"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`" + errorLine1=" int leftInset = Math.max(cutout.getWaterfallInsets().left," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="405" + column="41"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" int leftInset = Math.max(cutout.getWaterfallInsets().left," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="405" + column="34"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectLeft`" + errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectLeft(), Gravity.LEFT));" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="406" + column="60"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`" + errorLine1=" int topInset = Math.max(cutout.getWaterfallInsets().top," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="407" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" int topInset = Math.max(cutout.getWaterfallInsets().top," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="407" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectTop`" + errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectTop(), Gravity.TOP));" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="408" + column="60"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`" + errorLine1=" int rightInset = Math.max(cutout.getWaterfallInsets().right," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="409" + column="42"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`" + errorLine1=" int rightInset = Math.max(cutout.getWaterfallInsets().right," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="409" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectRight`" + errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectRight(), Gravity.RIGHT));" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="410" + column="60"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`" + errorLine1=" int bottomInset = Math.max(cutout.getWaterfallInsets().bottom," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="411" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`" + errorLine1=" int bottomInset = Math.max(cutout.getWaterfallInsets().bottom," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="411" + column="36"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectBottom`" + errorLine1=" findCutoutInsetForSide(displaySize, cutout.getBoundingRectBottom()," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java" + line="412" + column="60"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java" + line="343" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java" + line="359" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java" + line="406" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java" + line="731" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java" + line="800" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java" + line="878" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(dim, alpha);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java" + line="1065" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java" + line="1106" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java" + line="1171" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`" + errorLine1=" mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerWindowManager.java" + line="64" + column="9"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java" + line="73" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#createWindowContext`" + errorLine1=" .createWindowContext(TYPE_APPLICATION_OVERLAY, null);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java" + line="89" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`" + errorLine1=" layoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java" + line="101" + column="9"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`" + errorLine1=" layoutParams.setFitInsetsTypes(0);" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java" + line="102" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" mTransaction.reparent(dragSurface, null);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java" + line="229" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" mTransaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java" + line="230" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" final int iw = w - insets.left - insets.right;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java" + line="126" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`" + errorLine1=" final int iw = w - insets.left - insets.right;" + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java" + line="126" + column="42"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`" + errorLine1=" final int ih = h - insets.top - insets.bottom;" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java" + line="127" + column="41"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" final int ih = h - insets.top - insets.bottom;" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java" + line="127" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`" + errorLine1=" final int l = insets.left;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java" + line="128" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" final int t = insets.top;" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java" + line="129" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" runningTaskId = task.taskId;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java" + line="279" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`" + errorLine1=" private Insets mInsets = Insets.NONE;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java" + line="59" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsets`" + errorLine1=" mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java" + line="76" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`" + errorLine1=" mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java" + line="76" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#systemBars`" + errorLine1=" mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java" + line="76" + column="41"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 26): `com.google.android.collect.Sets#newHashSet`" + errorLine1=" return Sets.newHashSet(" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java" + line="498" + column="21"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mLeashByTaskId.get(taskInfo.taskId) != null) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="53" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" throw new IllegalStateException("Task appeared more than once: #" + taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="54" + column="81"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, -1501874464, 1, null, protoLogParam0); " + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="56" + column="113"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mLeashByTaskId.put(taskInfo.taskId, leash);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="58" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 1f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="66" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="75" + column="57"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mLeashByTaskId.get(taskInfo.taskId) == null) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="88" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" Slog.e(TAG, "Task already vanished: #" + taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="89" + column="54"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mLeashByTaskId.remove(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="92" + column="31"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, 564235578, 1, null, protoLogParam0); " + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="93" + column="113"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`" + errorLine1=" if (!mLeashByTaskId.contains(taskId)) {" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="99" + column="29"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mLeashByTaskId.get(taskId));" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java" + line="102" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.os.Handler#hasCallbacks`" + errorLine1=" return mHandler.hasCallbacks(r);" + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/HandlerExecutor.java" + line="55" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" final SurfaceControl.Transaction t = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="86" + column="54"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="90" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="107" + column="47"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" final SurfaceControl.Transaction t = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="121" + column="50"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" final SurfaceControl.Transaction t = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="167" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`" + errorLine1=" return Insets.NONE;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="185" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.Display#getCutout`" + errorLine1=" DisplayCutout cutout = display.getCutout();" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="187" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.graphics.Insets#of`" + errorLine1=" Insets insets = cutout != null ? Insets.of(cutout.getSafeInsets()) : Insets.NONE;" + errorLine2=" ~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="188" + column="49"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`" + errorLine1=" Insets insets = cutout != null ? Insets.of(cutout.getSafeInsets()) : Insets.NONE;" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="188" + column="78"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 26): `android.graphics.Rect#inset`" + errorLine1=" mCurrentDisplayBounds.inset(mCurrentCutoutInsets);" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="239" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" if (mCurrentCutoutInsets.top != 0) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="244" + column="17"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`" + errorLine1=" mCurrentDisplayBounds.top = Math.max(mStatusBarHeight, mCurrentCutoutInsets.top);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="245" + column="72"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java" + line="287" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`" + errorLine1=" mContext.getResources().getFloat(" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java" + line="465" + column="41"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1362429294, 4, null, protoLogParam0, protoLogParam1); " + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="129" + column="166"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 982027396, 4, null, protoLogParam0, protoLogParam1); " + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="134" + column="166"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; long protoLogParam2 = winMode; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -298656957, 20, null, protoLogParam0, protoLogParam1, protoLogParam2); " + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="139" + column="166"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" .setParent(mPrimarySurface).setColorLayer()" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="150" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`" + errorLine1=" .setName("Primary Divider Dim")" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="151" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`" + errorLine1=" .build();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="153" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" .setParent(mSecondarySurface).setColorLayer()" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="155" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`" + errorLine1=" .setName("Secondary Divider Dim")" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="156" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`" + errorLine1=" .build();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="158" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(mPrimaryDim, Integer.MAX_VALUE);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="160" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(mSecondaryDim, Integer.MAX_VALUE);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="162" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="164" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mPositionByTaskId.remove(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="173" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mLeashByTaskId.remove(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="175" + column="39"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="192" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (taskInfo.positionInParent.equals(mPositionByTaskId.get(taskInfo.taskId))) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="211" + column="76"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mPositionByTaskId.put(taskInfo.taskId, new Point(taskInfo.positionInParent));" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="218" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mLeashByTaskId.put(taskInfo.taskId, leash);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="223" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mPositionByTaskId.put(taskInfo.taskId, new Point(taskInfo.positionInParent));" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="224" + column="31"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="231" + column="57"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 1f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="242" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="322" + column="65"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`" + errorLine1=" if (!mLeashByTaskId.contains(taskId)) {" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="339" + column="29"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mLeashByTaskId.get(taskId));" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="342" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mPrimary != null) pw.println(innerPrefix + "mPrimary.taskId=" + mPrimary.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="351" + column="77"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mSecondary != null) pw.println(innerPrefix + "mSecondary.taskId=" + mSecondary.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java" + line="352" + column="81"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" && triggerTask.parentTaskId == mListener.mPrimary.taskId)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="94" + column="64"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="132" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="133" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" transaction.setAlpha(leash, end);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="136" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="137" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="180" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="185" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(parentChange.getLeash(), 1.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="245" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" t.reparent(leash, info.getRootLeash());" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="248" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, info.getChanges().size() - i);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="249" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" mFinishTransaction.reparent(leash, parentChange.getLeash());" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="251" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, info.getChanges().size() + 1);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="281" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 0.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="294" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="316" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" mFinishTransaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java" + line="334" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.os.VibrationEffect#createPredefined`" + errorLine1=" vibrator.vibrate(VibrationEffect.createPredefined(effectId))" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt" + line="465" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`" + errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java" + line="141" + column="49"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java" + line="286" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java" + line="295" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`" + errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="101" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" .setParent(mParentLeash)" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="152" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setBufferSize`" + errorLine1=" .setBufferSize(mBkgBounds.width(), mBkgBounds.height())" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="153" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setFormat`" + errorLine1=" .setFormat(PixelFormat.RGB_888)" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="155" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setOpaque`" + errorLine1=" .setOpaque(true)" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="156" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`" + errorLine1=" .setName("one-handed-background-panel")" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="157" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`" + errorLine1=" .build();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="159" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" transaction.setLayer(mBackgroundSurface, -1 /* at bottom-most layer */)" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="179" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" .apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="182" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.remove(mBackgroundSurface).apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java" + line="197" + column="52"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.accessibility.AccessibilityManager#getRecommendedTimeoutMillis`" + errorLine1=" .getRecommendedTimeoutMillis(mOneHandedTimeout * 1000" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java" + line="150" + column="34"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.os.RemoteException#rethrowFromSystemServer`" + errorLine1=" throw e.rethrowFromSystemServer();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java" + line="574" + column="21"/> + </issue> + + <issue + id="NewApi" + message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`" + errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java" + line="130" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java" + line="241" + column="12"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" tx.setAlpha(leash, alpha);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSurfaceTransactionHelper.java" + line="57" + column="12"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`" + errorLine1=" mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java" + line="101" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`" + errorLine1=" mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java" + line="101" + column="64"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`" + errorLine1=" lp.setFitInsetsTypes(0 /* types */);" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java" + line="200" + column="12"/> + </issue> + + <issue + id="NewApi" + message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`" + errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java" + line="244" + column="49"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java" + line="399" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java" + line="413" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java" + line="499" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java" + line="518" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java" + line="532" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`" + errorLine1=" mDefaultAspectRatio = res.getFloat(" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java" + line="77" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`" + errorLine1=" mMinAspectRatio = res.getFloat(" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java" + line="93" + column="31"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`" + errorLine1=" mMaxAspectRatio = res.getFloat(" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java" + line="95" + column="31"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`" + errorLine1=" mDefaultSizePercent = res.getFloat(" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java" + line="97" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`" + errorLine1=" mMaxAspectRatioForMinSize = res.getFloat(" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java" + line="99" + column="41"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mPipBoundsState.setDisplayLayout(new DisplayLayout(mContext, mContext.getDisplay()));" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java" + line="337" + column="79"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" onDisplayChanged(new DisplayLayout(mContext, mContext.getDisplay())," + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java" + line="428" + column="63"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`" + errorLine1=" lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java" + line="247" + column="9"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`" + errorLine1=" lp.setFitInsetsTypes(0 /* types */);" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java" + line="248" + column="12"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.accessibility.AccessibilityManager#getRecommendedTimeoutMillis`" + errorLine1=" int recommendedTimeout = mAccessibilityManager.getRecommendedTimeoutMillis(delay," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuView.java" + line="506" + column="56"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mContext.getDisplay().getRealSize(mMaxSize);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="142" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`" + errorLine1=" mDownPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="388" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`" + errorLine1=" mDownPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="388" + column="60"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`" + errorLine1=" mDownSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="389" + column="41"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`" + errorLine1=" mDownSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="389" + column="67"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`" + errorLine1=" float x0 = ev.getRawX(mFirstIndex);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="403" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`" + errorLine1=" float y0 = ev.getRawY(mFirstIndex);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="404" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`" + errorLine1=" float x1 = ev.getRawX(mSecondIndex);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="405" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`" + errorLine1=" float y1 = ev.getRawY(mSecondIndex);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java" + line="406" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" tx.setAlpha(leash, alpha);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java" + line="66" + column="12"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 31 (current min is 26): `android.graphics.Matrix#IDENTITY_MATRIX`" + errorLine1=" tx.setMatrix(leash, Matrix.IDENTITY_MATRIX, mTmpFloat9)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java" + line="166" + column="29"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" t.reparent(snapshot, parent);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java" + line="188" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(snapshot, Integer.MAX_VALUE);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java" + line="189" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java" + line="191" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`" + errorLine1=" mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="238" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" .getAnimator(mTaskInfo, mLeash, mPipBoundsState.getBounds(), 1f, 0f)" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="397" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" mPipUiEventLoggerLogger.setTaskInfo(mTaskInfo);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="431" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" tx.setAlpha(mLeash, 0f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="462" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="464" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" tx.setAlpha(mLeash, 0f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="502" + column="12"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="503" + column="12"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" .getAnimator(mTaskInfo, mLeash, destinationBounds, 0f, 1f)" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="506" + column="34"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="820" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="858" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" transaction.setAlpha(snapshotSurface, alpha);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="991" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="992" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="1000" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" .getAnimator(mTaskInfo, mLeash, baseBounds, currentBounds, destinationBounds," + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java" + line="1082" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mContext.getDisplay().getRealSize(displaySize);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java" + line="380" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" int displayRotation = mContext.getDisplay().getRotation();" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java" + line="674" + column="52"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`" + errorLine1=" float x = ev.getRawX(pointerIndex);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java" + line="138" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`" + errorLine1=" float y = ev.getRawY(pointerIndex);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java" + line="139" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`" + errorLine1=" mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java" + line="174" + column="39"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`" + errorLine1=" mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java" + line="174" + column="68"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`" + errorLine1=" mLastTouch.set(ev.getRawX(pointerIndex), ev.getRawY(pointerIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java" + line="197" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`" + errorLine1=" mLastTouch.set(ev.getRawX(pointerIndex), ev.getRawY(pointerIndex));" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java" + line="197" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" return startEnterAnimation(change.getTaskInfo(), change.getLeash(), t);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java" + line="79" + column="44"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`" + errorLine1=" setBoundsStateForEntry(taskInfo.topActivity, taskInfo.pictureInPictureParams," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java" + line="105" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 0f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java" + line="118" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java" + line="119" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`" + errorLine1=" if (taskInfo != null && taskInfo.topActivity != null) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java" + line="44" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`" + errorLine1=" mPackageName = taskInfo.topActivity.getPackageName();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java" + line="45" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(sc);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java" + line="97" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#baseIntent`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = info.getTaskInfo().taskId; String protoLogParam1 = String.valueOf(info.getTaskInfo().baseIntent); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1683614271, 1, null, protoLogParam0, protoLogParam1); " + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="168" + column="187"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = info.getTaskInfo().taskId; String protoLogParam1 = String.valueOf(info.getTaskInfo().baseIntent); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1683614271, 1, null, protoLogParam0, protoLogParam1); " + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="168" + column="121"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = info.getTaskInfo().taskId;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="333" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" notifyLocusVisibilityIfNeeded(info.getTaskInfo());" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="341" + column="39"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 157713005, 1, null, protoLogParam0); }" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="348" + column="117"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final TaskAppearedInfo data = mTasks.get(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="349" + column="54"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="352" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" notifyLocusVisibilityIfNeeded(taskInfo);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="358" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" if (updated || !taskInfo.equalsForSizeCompat(data.getTaskInfo())) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="359" + column="58"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 980952660, 1, null, protoLogParam0); }" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="369" + column="117"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -880817403, 1, null, protoLogParam0); }" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="380" + column="117"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="381" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)" + errorLine1=" notifyLocusVisibilityIfNeeded(taskInfo);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="387" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="417" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`" + errorLine1=" mVisibleTasksWithLocusId.remove(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="437" + column="49"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mSizeCompatUI.onSizeCompatInfoChanged(taskInfo.displayId, taskInfo.taskId," + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="466" + column="71"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mSizeCompatUI.onSizeCompatInfoChanged(taskInfo.displayId, taskInfo.taskId," + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="472" + column="67"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = runningTaskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java" + line="483" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`" + errorLine1=" } else if (mActiveLayouts.contains(taskId)) {" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIController.java" + line="96" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, Integer.MAX_VALUE);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUILayout.java" + line="314" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`" + errorLine1=" .setName("SizeCompatUILeash")" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="63" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`" + errorLine1=" mLeash = builder.build();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="67" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mLeash);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="68" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="78" + column="67"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="94" + column="67"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`" + errorLine1=" mViewHost.release();" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="108" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="113" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java" + line="113" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 26): `android.window.SplashScreenView#getIconView`" + errorLine1=" final View iconView = mSplashScreenView.getIconView();" + errorLine2=" ~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java" + line="158" + column="49"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.graphics.Paint#setBlendMode`" + errorLine1=" mVanishPaint.setBlendMode(BlendMode.MODULATE);" + errorLine2=" ~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java" + line="247" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.graphics.BlendMode#MODULATE`" + errorLine1=" mVanishPaint.setBlendMode(BlendMode.MODULATE);" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java" + line="247" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java" + line="284" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" tx.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java" + line="303" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#release`" + errorLine1=" mFirstWindowSurface.release();" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java" + line="304" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager#getMaximumWindowMetrics`" + errorLine1=" .getMaximumWindowMetrics()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java" + line="256" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`" + errorLine1=" .getWindowInsets()" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java" + line="257" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsets`" + errorLine1=" .getInsets(WindowInsets.Type.navigationBars()" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java" + line="258" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`" + errorLine1=" .getInsets(WindowInsets.Type.navigationBars()" + errorLine2=" ~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java" + line="258" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#statusBars`" + errorLine1=" | WindowInsets.Type.statusBars()" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java" + line="259" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`" + errorLine1=" | WindowInsets.Type.displayCutout()).toRect();" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java" + line="260" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(parentChange.getLeash(), 1.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="116" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" t.reparent(leash, info.getRootLeash());" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="119" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, info.getChanges().size() - i);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="120" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" mFinishTransaction.reparent(leash, parentChange.getLeash());" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="122" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 0.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="158" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="164" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" mFinishTransaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="198" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="222" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="223" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" transaction.setAlpha(leash, end);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="226" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="227" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="270" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" transaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java" + line="275" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`" + errorLine1=" .setName(TAG)" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java" + line="101" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`" + errorLine1=" mLeash = builder.build();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java" + line="105" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mLeash);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java" + line="106" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java" + line="116" + column="67"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`" + errorLine1=" mViewHost.release();" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java" + line="145" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java" + line="150" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" new SurfaceControl.Transaction().remove(mLeash).apply();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java" + line="150" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 26): `com.google.android.collect.Sets#newHashSet`" + errorLine1=" return Sets.newHashSet(" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java" + line="692" + column="21"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" .setLayer(dividerLeash, Integer.MAX_VALUE)" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="399" + column="30"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" .setLayer(dividerLeash, Integer.MAX_VALUE)" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="515" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" && taskInfo.parentTaskId == mMainStage.mRootTaskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="570" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" && taskInfo.parentTaskId == mSideStage.mRootTaskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="573" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TRANSITIONS_enabled) { long protoLogParam0 = triggerTask.taskId; String protoLogParam1 = String.valueOf(transitTypeToString(type)); long protoLogParam2 = mMainStage.getChildCount(); long protoLogParam3 = mSideStage.getChildCount(); com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, 165317020, 81, " split is active so using split" + "Transition to handle request. triggerTask=%d type=%s mainChildren=%d" + " sideChildren=%d", protoLogParam0, protoLogParam1, protoLogParam2, protoLogParam3); " + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="597" + column="120"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (!stage.containsTask(taskInfo.taskId)) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="655" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" + " with " + taskInfo.taskId + " before startAnimation().");" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="657" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (stage.containsTask(taskInfo.taskId)) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="660" + column="44"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" + " with " + taskInfo.taskId + " before startAnimation().");" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="662" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (!mMainStage.containsTask(mainChild.getTaskInfo().taskId)) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="732" + column="42"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" + " to have been called with " + mainChild.getTaskInfo().taskId" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="734" + column="58"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (!mSideStage.containsTask(sideChild.getTaskInfo().taskId)) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="737" + column="42"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" + " to have been called with " + sideChild.getTaskInfo().taskId" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="739" + column="58"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 1.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="820" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, Integer.MAX_VALUE);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java" + line="821" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`" + errorLine1=" return mChildrenTaskInfo.contains(taskId);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="85" + column="34"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="96" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="97" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mRootTaskInfo.taskId == taskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="116" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mRootTaskInfo.taskId == taskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="116" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="118" + column="45"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="119" + column="35"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */," + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="120" + column="49"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="124" + column="56"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="140" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mRootTaskInfo.taskId == taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="141" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`" + errorLine1=" } else if (mChildrenTaskInfo.contains(taskId)) {" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="144" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mRootTaskInfo.taskId == taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="161" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mRootLeash);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="162" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`" + errorLine1=" } else if (mChildrenLeashes.contains(taskId)) {" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="163" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mChildrenLeashes.get(taskId));" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="164" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 1f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java" + line="194" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java" + line="131" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" + Integer.toHexString(theme) + " task= " + taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java" + line="141" + column="64"/> + </issue> + + <issue + id="NewApi" + message="Cast from `SplashScreenView` to `View` requires API level 31 (current min is 26)" + errorLine1=" win.setContentView(sView);" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java" + line="280" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Cast from `SplashScreenView` to `View` requires API level 31 (current min is 26)" + errorLine1=" win.setContentView(sView);" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java" + line="284" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = startingWindowInfo.taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java" + line="309" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final TaskSnapshot snapshot = getTaskSnapshot(windowInfo.taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java" + line="162" + column="63"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" Slog.d(TAG, "isSnapshotCompatible no snapshot " + windowInfo.taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java" + line="180" + column="71"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" mTaskLaunchingCallback.accept(runningTaskInfo.taskId, suggestionType);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java" + line="238" + column="47"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" mInFlight.onTransactionReady(mInFlight.mId, new SurfaceControl.Transaction());" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java" + line="55" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java" + line="114" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java" + line="125" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`" + errorLine1=" root.release();" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java" + line="121" + column="14"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`" + errorLine1=" .setName("SystemWindowLeash")" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java" + line="278" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" .setParent(mRootSurface)" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java" + line="280" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`" + errorLine1=" .setCallsite("SysUiWIndowManager#attachToParentSurface").build();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java" + line="281" + column="76"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(leash);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java" + line="285" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" new SurfaceControl.Transaction().remove(mLeashForWindow.get(token))" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java" + line="293" + column="17"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" .apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java" + line="294" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = runningTaskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="151" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`" + errorLine1=" layoutParams.layoutInDisplayCutoutMode = attrs.layoutInDisplayCutoutMode;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="186" + column="9"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`" + errorLine1=" layoutParams.layoutInDisplayCutoutMode = attrs.layoutInDisplayCutoutMode;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="186" + column="50"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#getFitInsetsTypes`" + errorLine1=" layoutParams.setFitInsetsTypes(attrs.getFitInsetsTypes());" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="187" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`" + errorLine1=" layoutParams.setFitInsetsTypes(attrs.getFitInsetsTypes());" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="187" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#getFitInsetsSides`" + errorLine1=" layoutParams.setFitInsetsSides(attrs.getFitInsetsSides());" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="188" + column="46"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsSides`" + errorLine1=" layoutParams.setFitInsetsSides(attrs.getFitInsetsSides());" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="188" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#isFitInsetsIgnoringVisibility`" + errorLine1=" layoutParams.setFitInsetsIgnoringVisibility(attrs.isFitInsetsIgnoringVisibility());" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="189" + column="59"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsIgnoringVisibility`" + errorLine1=" layoutParams.setFitInsetsIgnoringVisibility(attrs.isFitInsetsIgnoringVisibility());" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="189" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`" + errorLine1=" if (runningTaskInfo.taskDescription != null) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="208" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`" + errorLine1=" taskDescription = runningTaskInfo.taskDescription;" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="209" + column="31"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" mTransaction = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="271" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#systemBars`" + errorLine1=" return state.calculateInsets(frame, WindowInsets.Type.systemBars()," + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="328" + column="63"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`" + errorLine1=" .setName(mTitle + " - task-snapshot-surface")" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="374" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setBufferSize`" + errorLine1=" .setBufferSize(buffer.getWidth(), buffer.getHeight())" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="375" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setFormat`" + errorLine1=" .setFormat(buffer.getFormat())" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="376" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" .setParent(mSurfaceControl)" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="377" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`" + errorLine1=" .build();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="379" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" mTransaction.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="406" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 26): `android.graphics.Rect#inset`" + errorLine1=" rect.inset((int) (insets.left * scaleX)," + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java" + line="435" + column="14"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" onTaskMovedToFront(taskInfo.taskId);" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerCallback.java" + line="52" + column="28"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `new android.util.CloseGuard`" + errorLine1=" private final CloseGuard mGuard = new CloseGuard();" + errorLine2=" ~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="73" + column="39"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="81" + column="61"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.CloseGuard#open`" + errorLine1=" mGuard.open("release");" + errorLine2=" ~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="99" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.CloseGuard#warnIfOpen`" + errorLine1=" mGuard.warnIfOpen();" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="204" + column="24"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.util.CloseGuard#close`" + errorLine1=" mGuard.close();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="218" + column="16"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = mTaskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="239" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="255" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`" + errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="255" + column="47"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" .apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="257" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`" + errorLine1=" if (taskInfo.taskDescription != null) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="266" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`" + errorLine1=" setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor());" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="267" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="271" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="284" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="292" + column="49"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="292" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`" + errorLine1=" if (taskInfo.taskDescription != null) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="298" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`" + errorLine1=" setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor());" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="299" + column="38"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" final int taskId = taskInfo.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="307" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" if (mTaskInfo.taskId != taskId) {" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="316" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`" + errorLine1=" b.setParent(mTaskLeash);" + errorLine2=" ~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="319" + column="11"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`" + errorLine1=" return "TaskView" + ":" + (mTaskInfo != null ? mTaskInfo.taskId : "null");" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="331" + column="56"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="349" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`" + errorLine1=" mTransaction.reparent(mTaskLeash, getSurfaceControl())" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="349" + column="47"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" .apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="351" + column="22"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="374" + column="53"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" mTransaction.reparent(mTaskLeash, null).apply();" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java" + line="374" + column="26"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" return new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TransactionPool.java" + line="36" + column="20"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`" + errorLine1=" context.getResources().getFloat(" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="117" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`" + errorLine1=" if (info.getRootLeash().isValid()) {" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="231" + column="33"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 1.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="247" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`" + errorLine1=" t.reparent(leash, info.getRootLeash());" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="256" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, zSplitLine + info.getChanges().size() - i);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="266" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 1.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="270" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 0.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="272" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, zSplitLine - i);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="276" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`" + errorLine1=" t.setAlpha(leash, 1.f);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="277" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, zSplitLine - i);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="282" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, zSplitLine + info.getChanges().size() - i);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="285" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`" + errorLine1=" t.setLayer(leash, zSplitLine + info.getChanges().size() - i);" + errorLine2=" ~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="288" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`" + errorLine1=" if (!info.getRootLeash().isValid()) {" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="304" + column="34"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java" + line="309" + column="15"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.graphics.Outline#setPath`" + errorLine1=" outline.setPath(mTriangularPath);" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TriangleShape.java" + line="75" + column="17"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mPipBoundsState.setDisplayLayout(new DisplayLayout(context, context.getDisplay()));" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java" + line="147" + column="77"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`" + errorLine1=" mPinnedTaskId = pinnedTask.taskId;" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java" + line="283" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`" + errorLine1=" mPipNotificationController.show(pinnedTask.topActivity.getPackageName());" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java" + line="287" + column="41"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`" + errorLine1=" mContext.getDisplay().getDisplayInfo(displayInfo);" + errorLine2=" ~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java" + line="348" + column="18"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" SurfaceControl.Transaction t = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java" + line="134" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`" + errorLine1=" t.apply();" + errorLine2=" ~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java" + line="136" + column="19"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`" + errorLine1=" if (out != null && out.isValid()) {" + errorLine2=" ~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java" + line="188" + column="32"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`" + errorLine1=" final SurfaceControl.Transaction sft = new SurfaceControl.Transaction();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java" + line="326" + column="56"/> + </issue> + + <issue + id="NewApi" + message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)" + errorLine1=" android:bottomLeftRadius="?android:attr/dialogCornerRadius"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml" + line="21" + column="9"/> + </issue> + + <issue + id="NewApi" + message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)" + errorLine1=" android:topLeftRadius="?android:attr/dialogCornerRadius"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml" + line="22" + column="9"/> + </issue> + + <issue + id="NewApi" + message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)" + errorLine1=" android:bottomRightRadius="?android:attr/dialogCornerRadius"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml" + line="23" + column="9"/> + </issue> + + <issue + id="NewApi" + message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)" + errorLine1=" android:topRightRadius="?android:attr/dialogCornerRadius"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml" + line="24" + column="9"/> + </issue> + +</issues> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java index d6079b6ce984..0a15d8468983 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java @@ -571,7 +571,7 @@ public class Bubble implements BubbleViewProvider { * hide the bubble when in the same content). */ boolean isSuppressable() { - return (mFlags & Notification.BubbleMetadata.FLAG_SHOULD_SUPPRESS_BUBBLE) != 0; + return (mFlags & Notification.BubbleMetadata.FLAG_SUPPRESSABLE_BUBBLE) != 0; } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 4ff1ce97ba3c..11c146457844 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -16,6 +16,7 @@ package com.android.wm.shell.bubbles; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.service.notification.NotificationListenerService.REASON_CANCEL; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; @@ -78,6 +79,8 @@ import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; +import com.android.wm.shell.common.TaskStackListenerCallback; +import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.pip.PinnedStackListenerForwarder; import java.io.FileDescriptor; @@ -124,6 +127,7 @@ public class BubbleController { private final LauncherApps mLauncherApps; private final IStatusBarService mBarService; private final WindowManager mWindowManager; + private final TaskStackListenerImpl mTaskStackListener; private final ShellTaskOrganizer mTaskOrganizer; // Used to post to main UI thread @@ -194,6 +198,7 @@ public class BubbleController { WindowManager windowManager, WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, + TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, ShellTaskOrganizer organizer, ShellExecutor mainExecutor, @@ -204,7 +209,7 @@ public class BubbleController { return new BubbleController(context, data, synchronizer, floatingContentCoordinator, new BubbleDataRepository(context, launcherApps, mainExecutor), statusBarService, windowManager, windowManagerShellWrapper, launcherApps, - logger, organizer, positioner, mainExecutor, mainHandler); + logger, taskStackListener, organizer, positioner, mainExecutor, mainHandler); } /** @@ -221,6 +226,7 @@ public class BubbleController { WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, BubbleLogger bubbleLogger, + TaskStackListenerImpl taskStackListener, ShellTaskOrganizer organizer, BubblePositioner positioner, ShellExecutor mainExecutor, @@ -238,6 +244,7 @@ public class BubbleController { mLogger = bubbleLogger; mMainExecutor = mainExecutor; mMainHandler = mainHandler; + mTaskStackListener = taskStackListener; mTaskOrganizer = organizer; mSurfaceSynchronizer = synchronizer; mCurrentUserId = ActivityManager.getCurrentUser(); @@ -319,6 +326,42 @@ public class BubbleController { packageName, validShortcuts, DISMISS_SHORTCUT_REMOVED); } }, mMainHandler); + + mTaskStackListener.addListener(new TaskStackListenerCallback() { + @Override + public void onTaskMovedToFront(int taskId) { + if (mSysuiProxy == null) { + return; + } + + mSysuiProxy.isNotificationShadeExpand((expand) -> { + mMainExecutor.execute(() -> { + int expandedId = INVALID_TASK_ID; + if (mStackView != null && mStackView.getExpandedBubble() != null + && isStackExpanded() && !mStackView.isExpansionAnimating() + && !expand) { + expandedId = mStackView.getExpandedBubble().getTaskId(); + } + + if (expandedId != INVALID_TASK_ID && expandedId != taskId) { + mBubbleData.setExpanded(false); + } + }); + }); + } + + @Override + public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, + boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { + for (Bubble b : mBubbleData.getBubbles()) { + if (task.taskId == b.getTaskId()) { + mBubbleData.setSelectedBubble(b); + mBubbleData.setExpanded(true); + return; + } + } + } + }); } @VisibleForTesting diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java index 9ef3fb54fb35..abe1f7179dda 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java @@ -154,6 +154,7 @@ public class BubbleExpandedView extends LinearLayout { } try { options.setTaskAlwaysOnTop(true); + options.setLaunchedFromBubble(true); if (!mIsOverflow && mBubble.hasMetadataShortcutId()) { options.setApplyActivityFlagsForBubbles(true); mTaskView.startShortcutActivity(mBubble.getShortcutInfo(), @@ -163,7 +164,6 @@ public class BubbleExpandedView extends LinearLayout { // Apply flags to make behaviour match documentLaunchMode=always. fillInIntent.addFlags(FLAG_ACTIVITY_NEW_DOCUMENT); fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); - fillInIntent.putExtra(Intent.EXTRA_IS_BUBBLED, true); if (mBubble != null) { mBubble.setIntentActive(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java index 98978b562011..9fc8aef47064 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java @@ -248,6 +248,8 @@ public interface Bubbles { /** Callback to tell SysUi components execute some methods. */ interface SysuiProxy { + void isNotificationShadeExpand(Consumer<Boolean> callback); + void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback); void getShouldRestoredEntries(ArraySet<String> savedBubbleKeys, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java index d25bef197359..9eacaecc4f50 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; +import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.view.Display.DEFAULT_DISPLAY; @@ -41,8 +42,6 @@ import android.window.TaskOrganizer; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; -import androidx.annotation.Nullable; - import com.android.internal.policy.DividerSnapAlgorithm; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; @@ -63,7 +62,6 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -496,13 +494,15 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays public boolean splitPrimaryTask() { try { - if (ActivityTaskManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED - || isSplitActive()) { + if (ActivityTaskManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED) { return false; } } catch (RemoteException e) { return false; } + if (isSplitActive() || mSplits.mPrimary == null) { + return false; + } // Try fetching the top running task. final List<RunningTaskInfo> runningTasks = @@ -523,8 +523,12 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays return false; } - return ActivityTaskManager.getInstance().setTaskWindowingModeSplitScreenPrimary( - topRunningTask.taskId, true /* onTop */); + final WindowContainerTransaction wct = new WindowContainerTransaction(); + // Clear out current windowing mode before reparenting to split task. + wct.setWindowingMode(topRunningTask.token, WINDOWING_MODE_UNDEFINED); + wct.reparent(topRunningTask.token, mSplits.mPrimary.token, true /* onTop */); + mWindowManagerProxy.applySyncTransaction(wct); + return true; } public void dismissSplitToPrimaryTask() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl index 0c46eaba18ae..8f0892fdcbba 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl @@ -20,6 +20,7 @@ import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; +import android.window.IRemoteTransition; import com.android.wm.shell.splitscreen.ISplitScreenListener; @@ -74,4 +75,11 @@ interface ISplitScreen { */ oneway void startIntent(in PendingIntent intent, in Intent fillInIntent, int stage, int position, in Bundle options) = 9; + + /** + * Starts tasks simultaneously in one transition. The first task in the list will be in the + * main-stage and on the left/top. + */ + oneway void startTasks(int mainTaskId, in Bundle mainOptions, int sideTaskId, + in Bundle sideOptions, int sidePosition, in IRemoteTransition remoteTransition) = 10; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java index 2f2e325aafad..66a4a60d4be6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java @@ -16,10 +16,7 @@ package com.android.wm.shell.splitscreen; -import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; -import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; -import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.graphics.Rect; import android.window.WindowContainerToken; @@ -52,6 +49,7 @@ class MainStage extends StageTaskListener { final WindowContainerToken rootToken = mRootTaskInfo.token; wct.setBounds(rootToken, rootBounds) + .setWindowingMode(rootToken, WINDOWING_MODE_MULTI_WINDOW) .setLaunchRoot( rootToken, CONTROLLED_WINDOWING_MODES, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java index 340b55d7f446..d4506fd32c86 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java @@ -17,18 +17,8 @@ package com.android.wm.shell.splitscreen; import android.annotation.IntDef; -import android.app.ActivityManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.graphics.Rect; -import android.os.Bundle; -import android.os.UserHandle; - -import androidx.annotation.Nullable; import com.android.wm.shell.common.annotations.ExternalThread; -import com.android.wm.shell.draganddrop.DragAndDropPolicy; /** * Interface to engage split-screen feature. @@ -95,4 +85,14 @@ public interface SplitScreen { default ISplitScreen createExternalInterface() { return null; } + + /** Get a string representation of a stage type */ + static String stageTypeToString(@StageType int stage) { + switch (stage) { + case STAGE_TYPE_UNDEFINED: return "UNDEFINED"; + case STAGE_TYPE_MAIN: return "MAIN"; + case STAGE_TYPE_SIDE: return "SIDE"; + default: return "UNKNOWN(" + stage + ")"; + } + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index d4362efe462d..5aa59f283434 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -39,6 +39,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; import android.util.Slog; +import android.window.IRemoteTransition; import androidx.annotation.BinderThread; import androidx.annotation.NonNull; @@ -50,9 +51,11 @@ import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.RemoteCallable; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; +import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.annotations.ExternalThread; import com.android.wm.shell.draganddrop.DragAndDropPolicy; import com.android.wm.shell.splitscreen.ISplitScreenListener; +import com.android.wm.shell.transition.Transitions; import java.io.PrintWriter; @@ -72,19 +75,24 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, private final ShellExecutor mMainExecutor; private final SplitScreenImpl mImpl = new SplitScreenImpl(); private final DisplayImeController mDisplayImeController; + private final Transitions mTransitions; + private final TransactionPool mTransactionPool; private StageCoordinator mStageCoordinator; public SplitScreenController(ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, Context context, RootTaskDisplayAreaOrganizer rootTDAOrganizer, - ShellExecutor mainExecutor, DisplayImeController displayImeController) { + ShellExecutor mainExecutor, DisplayImeController displayImeController, + Transitions transitions, TransactionPool transactionPool) { mTaskOrganizer = shellTaskOrganizer; mSyncQueue = syncQueue; mContext = context; mRootTDAOrganizer = rootTDAOrganizer; mMainExecutor = mainExecutor; mDisplayImeController = displayImeController; + mTransitions = transitions; + mTransactionPool = transactionPool; } public SplitScreen asSplitScreen() { @@ -105,7 +113,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, if (mStageCoordinator == null) { // TODO: Multi-display mStageCoordinator = new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, - mRootTDAOrganizer, mTaskOrganizer, mDisplayImeController); + mRootTDAOrganizer, mTaskOrganizer, mDisplayImeController, mTransitions, + mTransactionPool); } } @@ -407,6 +416,16 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, } @Override + public void startTasks(int mainTaskId, @Nullable Bundle mainOptions, + int sideTaskId, @Nullable Bundle sideOptions, + @SplitScreen.StagePosition int sidePosition, + @Nullable IRemoteTransition remoteTransition) { + executeRemoteCallWithTaskPermission(mController, "startTasks", + (controller) -> controller.mStageCoordinator.startTasks(mainTaskId, mainOptions, + sideTaskId, sideOptions, sidePosition, remoteTransition)); + } + + @Override public void startShortcut(String packageName, String shortcutId, int stage, int position, @Nullable Bundle options, UserHandle user) { executeRemoteCallWithTaskPermission(mController, "startShortcut", diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java new file mode 100644 index 000000000000..c37789ecbc9d --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -0,0 +1,296 @@ +/* + * Copyright (C) 2021 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.wm.shell.splitscreen; + +import static android.view.WindowManager.TRANSIT_CHANGE; +import static android.view.WindowManager.TRANSIT_CLOSE; +import static android.view.WindowManager.TRANSIT_OPEN; +import static android.view.WindowManager.TRANSIT_TO_BACK; +import static android.view.WindowManager.TRANSIT_TO_FRONT; +import static android.window.TransitionInfo.FLAG_FIRST_CUSTOM; + +import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP; +import static com.android.wm.shell.transition.Transitions.isOpeningType; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.graphics.Rect; +import android.os.IBinder; +import android.view.SurfaceControl; +import android.view.WindowManager; +import android.window.IRemoteTransition; +import android.window.TransitionInfo; +import android.window.WindowContainerToken; +import android.window.WindowContainerTransaction; + +import com.android.wm.shell.common.TransactionPool; +import com.android.wm.shell.transition.OneShotRemoteHandler; +import com.android.wm.shell.transition.Transitions; + +import java.util.ArrayList; + +/** Manages transition animations for split-screen. */ +class SplitScreenTransitions { + private static final String TAG = "SplitScreenTransitions"; + + /** Flag applied to a transition change to identify it as a divider bar for animation. */ + public static final int FLAG_IS_DIVIDER_BAR = FLAG_FIRST_CUSTOM; + + private final TransactionPool mTransactionPool; + private final Transitions mTransitions; + private final Runnable mOnFinish; + + IBinder mPendingDismiss = null; + IBinder mPendingEnter = null; + + private IBinder mAnimatingTransition = null; + private OneShotRemoteHandler mRemoteHandler = null; + + private Transitions.TransitionFinishCallback mRemoteFinishCB = (wct, wctCB) -> { + if (wct != null || wctCB != null) { + throw new UnsupportedOperationException("finish transactions not supported yet."); + } + onFinish(); + }; + + /** Keeps track of currently running animations */ + private final ArrayList<Animator> mAnimations = new ArrayList<>(); + + private Transitions.TransitionFinishCallback mFinishCallback = null; + private SurfaceControl.Transaction mFinishTransaction; + + SplitScreenTransitions(@NonNull TransactionPool pool, @NonNull Transitions transitions, + @NonNull Runnable onFinishCallback) { + mTransactionPool = pool; + mTransitions = transitions; + mOnFinish = onFinishCallback; + } + + void playAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, + @NonNull SurfaceControl.Transaction t, + @NonNull Transitions.TransitionFinishCallback finishCallback, + @NonNull WindowContainerToken mainRoot, @NonNull WindowContainerToken sideRoot) { + mFinishCallback = finishCallback; + mAnimatingTransition = transition; + if (mRemoteHandler != null) { + mRemoteHandler.startAnimation(transition, info, t, mRemoteFinishCB); + mRemoteHandler = null; + return; + } + playInternalAnimation(transition, info, t, mainRoot, sideRoot); + } + + private void playInternalAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, + @NonNull SurfaceControl.Transaction t, @NonNull WindowContainerToken mainRoot, + @NonNull WindowContainerToken sideRoot) { + mFinishTransaction = mTransactionPool.acquire(); + + // Play some place-holder fade animations + for (int i = info.getChanges().size() - 1; i >= 0; --i) { + final TransitionInfo.Change change = info.getChanges().get(i); + final SurfaceControl leash = change.getLeash(); + final int mode = info.getChanges().get(i).getMode(); + + if (mode == TRANSIT_CHANGE) { + if (change.getParent() != null) { + // This is probably reparented, so we want the parent to be immediately visible + final TransitionInfo.Change parentChange = info.getChange(change.getParent()); + t.show(parentChange.getLeash()); + t.setAlpha(parentChange.getLeash(), 1.f); + // and then animate this layer outside the parent (since, for example, this is + // the home task animating from fullscreen to part-screen). + t.reparent(leash, info.getRootLeash()); + t.setLayer(leash, info.getChanges().size() - i); + // build the finish reparent/reposition + mFinishTransaction.reparent(leash, parentChange.getLeash()); + mFinishTransaction.setPosition(leash, + change.getEndRelOffset().x, change.getEndRelOffset().y); + } + // TODO(shell-transitions): screenshot here + final Rect startBounds = new Rect(change.getStartAbsBounds()); + if (info.getType() == TRANSIT_SPLIT_DISMISS_SNAP) { + // Dismissing split via snap which means the still-visible task has been + // dragged to its end position at animation start so reflect that here. + startBounds.offsetTo(change.getEndAbsBounds().left, + change.getEndAbsBounds().top); + } + final Rect endBounds = new Rect(change.getEndAbsBounds()); + startBounds.offset(-info.getRootOffset().x, -info.getRootOffset().y); + endBounds.offset(-info.getRootOffset().x, -info.getRootOffset().y); + startExampleResizeAnimation(leash, startBounds, endBounds); + } + if (change.getParent() != null) { + continue; + } + + if (transition == mPendingEnter && (mainRoot.equals(change.getContainer()) + || sideRoot.equals(change.getContainer()))) { + t.setWindowCrop(leash, change.getStartAbsBounds().width(), + change.getStartAbsBounds().height()); + } + boolean isOpening = isOpeningType(info.getType()); + if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { + // fade in + startExampleAnimation(leash, true /* show */); + } else if (!isOpening && (mode == TRANSIT_CLOSE || mode == TRANSIT_TO_BACK)) { + // fade out + if (info.getType() == TRANSIT_SPLIT_DISMISS_SNAP) { + // Dismissing via snap-to-top/bottom means that the dismissed task is already + // not-visible (usually cropped to oblivion) so immediately set its alpha to 0 + // and don't animate it so it doesn't pop-in when reparented. + t.setAlpha(leash, 0.f); + } else { + startExampleAnimation(leash, false /* show */); + } + } + } + t.apply(); + onFinish(); + } + + /** Starts a transition to enter split with a remote transition animator. */ + IBinder startEnterTransition(@WindowManager.TransitionType int transitType, + @NonNull WindowContainerTransaction wct, @Nullable IRemoteTransition remoteTransition, + @NonNull Transitions.TransitionHandler handler) { + if (remoteTransition != null) { + // Wrapping it for ease-of-use (OneShot handles all the binder linking/death stuff) + mRemoteHandler = new OneShotRemoteHandler( + mTransitions.getMainExecutor(), remoteTransition); + } + final IBinder transition = mTransitions.startTransition(transitType, wct, handler); + mPendingEnter = transition; + if (mRemoteHandler != null) { + mRemoteHandler.setTransition(transition); + } + return transition; + } + + /** Starts a transition for dismissing split after dragging the divider to a screen edge */ + IBinder startSnapToDismiss(@NonNull WindowContainerTransaction wct, + @NonNull Transitions.TransitionHandler handler) { + final IBinder transition = mTransitions.startTransition( + TRANSIT_SPLIT_DISMISS_SNAP, wct, handler); + mPendingDismiss = transition; + return transition; + } + + void onFinish() { + if (!mAnimations.isEmpty()) return; + mOnFinish.run(); + if (mFinishTransaction != null) { + mFinishTransaction.apply(); + mTransactionPool.release(mFinishTransaction); + mFinishTransaction = null; + } + mFinishCallback.onTransitionFinished(null /* wct */, null /* wctCB */); + mFinishCallback = null; + if (mAnimatingTransition == mPendingEnter) { + mPendingEnter = null; + } + if (mAnimatingTransition == mPendingDismiss) { + mPendingDismiss = null; + } + mAnimatingTransition = null; + } + + // TODO(shell-transitions): real animations + private void startExampleAnimation(@NonNull SurfaceControl leash, boolean show) { + final float end = show ? 1.f : 0.f; + final float start = 1.f - end; + final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); + final ValueAnimator va = ValueAnimator.ofFloat(start, end); + va.setDuration(500); + va.addUpdateListener(animation -> { + float fraction = animation.getAnimatedFraction(); + transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction); + transaction.apply(); + }); + final Runnable finisher = () -> { + transaction.setAlpha(leash, end); + transaction.apply(); + mTransactionPool.release(transaction); + mTransitions.getMainExecutor().execute(() -> { + mAnimations.remove(va); + onFinish(); + }); + }; + va.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { } + + @Override + public void onAnimationEnd(Animator animation) { + finisher.run(); + } + + @Override + public void onAnimationCancel(Animator animation) { + finisher.run(); + } + + @Override + public void onAnimationRepeat(Animator animation) { } + }); + mAnimations.add(va); + mTransitions.getAnimExecutor().execute(va::start); + } + + // TODO(shell-transitions): real animations + private void startExampleResizeAnimation(@NonNull SurfaceControl leash, + @NonNull Rect startBounds, @NonNull Rect endBounds) { + final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); + final ValueAnimator va = ValueAnimator.ofFloat(0.f, 1.f); + va.setDuration(500); + va.addUpdateListener(animation -> { + float fraction = animation.getAnimatedFraction(); + transaction.setWindowCrop(leash, + (int) (startBounds.width() * (1.f - fraction) + endBounds.width() * fraction), + (int) (startBounds.height() * (1.f - fraction) + + endBounds.height() * fraction)); + transaction.setPosition(leash, + startBounds.left * (1.f - fraction) + endBounds.left * fraction, + startBounds.top * (1.f - fraction) + endBounds.top * fraction); + transaction.apply(); + }); + final Runnable finisher = () -> { + transaction.setWindowCrop(leash, 0, 0); + transaction.setPosition(leash, endBounds.left, endBounds.top); + transaction.apply(); + mTransactionPool.release(transaction); + mTransitions.getMainExecutor().execute(() -> { + mAnimations.remove(va); + onFinish(); + }); + }; + va.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + finisher.run(); + } + + @Override + public void onAnimationCancel(Animator animation) { + finisher.run(); + } + }); + mAnimations.add(va); + mTransitions.getAnimExecutor().execute(va::start); + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index b180bb52e3e3..c91a92ad3242 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -17,31 +17,54 @@ package com.android.wm.shell.splitscreen; import static android.app.ActivityOptions.KEY_LAUNCH_ROOT_TASK_TOKEN; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; +import static android.view.WindowManager.TRANSIT_OPEN; +import static android.view.WindowManager.TRANSIT_TO_BACK; +import static android.view.WindowManager.TRANSIT_TO_FRONT; +import static android.view.WindowManager.transitTypeToString; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_POSITION_TOP_OR_LEFT; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED; - +import static com.android.wm.shell.splitscreen.SplitScreen.stageTypeToString; +import static com.android.wm.shell.splitscreen.SplitScreenTransitions.FLAG_IS_DIVIDER_BAR; +import static com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS; +import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP; +import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN; +import static com.android.wm.shell.transition.Transitions.isClosingType; +import static com.android.wm.shell.transition.Transitions.isOpeningType; + +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.ActivityManager; import android.content.Context; import android.graphics.Rect; import android.os.Bundle; +import android.os.IBinder; +import android.util.Log; import android.view.SurfaceControl; +import android.view.WindowManager; import android.window.DisplayAreaInfo; +import android.window.IRemoteTransition; +import android.window.TransitionInfo; +import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; -import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.SyncTransactionQueue; +import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.split.SplitLayout; +import com.android.wm.shell.protolog.ShellProtoLogGroup; +import com.android.wm.shell.transition.Transitions; import java.io.PrintWriter; import java.util.ArrayList; @@ -61,10 +84,13 @@ import java.util.List; * {@link #onStageHasChildrenChanged(StageListenerImpl).} */ class StageCoordinator implements SplitLayout.LayoutChangeListener, - RootTaskDisplayAreaOrganizer.RootTaskDisplayAreaListener { + RootTaskDisplayAreaOrganizer.RootTaskDisplayAreaListener, Transitions.TransitionHandler { private static final String TAG = StageCoordinator.class.getSimpleName(); + /** internal value for mDismissTop that represents no dismiss */ + private static final int NO_DISMISS = -2; + private final MainStage mMainStage; private final StageListenerImpl mMainStageListener = new StageListenerImpl(); private final SideStage mSideStage; @@ -81,11 +107,25 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, private final Context mContext; private final List<SplitScreen.SplitScreenListener> mListeners = new ArrayList<>(); private final DisplayImeController mDisplayImeController; + private final SplitScreenTransitions mSplitTransitions; private boolean mExitSplitScreenOnHide = true; + @SplitScreen.StageType int mDismissTop = NO_DISMISS; + private final Runnable mOnTransitionAnimationComplete = () -> { + // If still playing, let it finish. + if (!isSplitScreenVisible()) { + // Update divider state after animation so that it is still around and positioned + // properly for the animation itself. + setDividerVisibility(false); + mSplitLayout.resetDividerPosition(); + } + mDismissTop = NO_DISMISS; + }; + StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer, - DisplayImeController displayImeController) { + DisplayImeController displayImeController, Transitions transitions, + TransactionPool transactionPool) { mContext = context; mDisplayId = displayId; mSyncQueue = syncQueue; @@ -95,12 +135,16 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, mSideStage = new SideStage(mTaskOrganizer, mDisplayId, mSideStageListener, mSyncQueue); mDisplayImeController = displayImeController; mRootTDAOrganizer.registerListener(displayId, this); + mSplitTransitions = new SplitScreenTransitions(transactionPool, transitions, + mOnTransitionAnimationComplete); + transitions.addHandler(this); } @VisibleForTesting StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer, - MainStage mainStage, SideStage sideStage, DisplayImeController displayImeController) { + MainStage mainStage, SideStage sideStage, DisplayImeController displayImeController, + SplitLayout splitLayout, Transitions transitions, TransactionPool transactionPool) { mContext = context; mDisplayId = displayId; mSyncQueue = syncQueue; @@ -110,6 +154,15 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, mSideStage = sideStage; mDisplayImeController = displayImeController; mRootTDAOrganizer.registerListener(displayId, this); + mSplitLayout = splitLayout; + mSplitTransitions = new SplitScreenTransitions(transactionPool, transitions, + mOnTransitionAnimationComplete); + transitions.addHandler(this); + } + + @VisibleForTesting + SplitScreenTransitions getSplitTransitions() { + return mSplitTransitions; } boolean isSplitScreenVisible() { @@ -140,6 +193,32 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, return result; } + /** Starts 2 tasks in one transition. */ + void startTasks(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId, + @Nullable Bundle sideOptions, @SplitScreen.StagePosition int sidePosition, + @Nullable IRemoteTransition remoteTransition) { + final WindowContainerTransaction wct = new WindowContainerTransaction(); + mainOptions = mainOptions != null ? mainOptions : new Bundle(); + sideOptions = sideOptions != null ? sideOptions : new Bundle(); + setSideStagePosition(sidePosition); + + // Build a request WCT that will launch both apps such that task 0 is on the main stage + // while task 1 is on the side stage. + mMainStage.activate(getMainStageBounds(), wct); + mSideStage.setBounds(getSideStageBounds(), wct); + + // Make sure the launch options will put tasks in the corresponding split roots + addActivityOptions(mainOptions, mMainStage); + addActivityOptions(sideOptions, mSideStage); + + // Add task launch requests + wct.startTask(mainTaskId, mainOptions); + wct.startTask(sideTaskId, sideOptions); + + mSplitTransitions.startEnterTransition( + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this); + } + @SplitScreen.StagePosition int getSideStagePosition() { return mSideStagePosition; } @@ -150,14 +229,18 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, } void setSideStagePosition(@SplitScreen.StagePosition int sideStagePosition) { - if (mSideStagePosition == sideStagePosition) return; + setSideStagePosition(sideStagePosition, true /* updateVisibility */); + } + private void setSideStagePosition(@SplitScreen.StagePosition int sideStagePosition, + boolean updateVisibility) { + if (mSideStagePosition == sideStagePosition) return; mSideStagePosition = sideStagePosition; - if (mSideStageListener.mVisible) { + sendOnStagePositionChanged(); + + if (mSideStageListener.mVisible && updateVisibility) { onStageVisibilityChanged(mSideStageListener); } - - sendOnStagePositionChanged(); } void setSideStageVisibility(boolean visible) { @@ -185,14 +268,23 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, mSplitLayout.resetDividerPosition(); } + private void prepareExitSplitScreen(@SplitScreen.StageType int stageToTop, + @NonNull WindowContainerTransaction wct) { + mSideStage.removeAllTasks(wct, stageToTop == STAGE_TYPE_SIDE); + mMainStage.deactivate(wct, stageToTop == STAGE_TYPE_MAIN); + } + void getStageBounds(Rect outTopOrLeftBounds, Rect outBottomOrRightBounds) { outTopOrLeftBounds.set(mSplitLayout.getBounds1()); outBottomOrRightBounds.set(mSplitLayout.getBounds2()); } - void updateActivityOptions(Bundle opts, @SplitScreen.StagePosition int position) { - final StageTaskListener stage = position == mSideStagePosition ? mSideStage : mMainStage; + private void addActivityOptions(Bundle opts, StageTaskListener stage) { opts.putParcelable(KEY_LAUNCH_ROOT_TASK_TOKEN, stage.mRootTaskInfo.token); + } + + void updateActivityOptions(Bundle opts, @SplitScreen.StagePosition int position) { + addActivityOptions(opts, position == mSideStagePosition ? mSideStage : mMainStage); if (!mMainStage.isActive()) { // Activate the main stage in anticipation of an app launch. @@ -258,20 +350,21 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, } } + private void setDividerVisibility(boolean visible) { + if (mDividerVisible == visible) return; + mDividerVisible = visible; + if (visible) { + mSplitLayout.init(); + } else { + mSplitLayout.release(); + } + } + private void onStageVisibilityChanged(StageListenerImpl stageListener) { final boolean sideStageVisible = mSideStageListener.mVisible; final boolean mainStageVisible = mMainStageListener.mVisible; // Divider is only visible if both the main stage and side stages are visible - final boolean dividerVisible = sideStageVisible && mainStageVisible; - - if (mDividerVisible != dividerVisible) { - mDividerVisible = dividerVisible; - if (mDividerVisible) { - mSplitLayout.init(); - } else { - mSplitLayout.release(); - } - } + setDividerVisibility(isSplitScreenVisible()); if (mExitSplitScreenOnHide && !mainStageVisible && !sideStageVisible) { // Exit split-screen if both stage are not visible. @@ -360,11 +453,22 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, } } + @VisibleForTesting + IBinder onSnappedToDismissTransition(boolean mainStageToTop) { + final WindowContainerTransaction wct = new WindowContainerTransaction(); + prepareExitSplitScreen(mainStageToTop ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE, wct); + return mSplitTransitions.startSnapToDismiss(wct, this); + } + @Override public void onSnappedToDismiss(boolean bottomOrRight) { final boolean mainStageToTop = bottomOrRight ? mSideStagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT : mSideStagePosition == STAGE_POSITION_TOP_OR_LEFT; + if (ENABLE_SHELL_TRANSITIONS) { + onSnappedToDismissTransition(mainStageToTop); + return; + } exitSplitScreen(mainStageToTop ? mMainStage : mSideStage); } @@ -455,6 +559,271 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, ? mSplitLayout.getBounds2() : mSplitLayout.getBounds1(); } + /** + * Get the stage that should contain this `taskInfo`. The stage doesn't necessarily contain + * this task (yet) so this can also be used to identify which stage to put a task into. + */ + private StageTaskListener getStageOfTask(ActivityManager.RunningTaskInfo taskInfo) { + // TODO(b/184679596): Find a way to either include task-org information in the transition, + // or synchronize task-org callbacks so we can use stage.containsTask + if (mMainStage.mRootTaskInfo != null + && taskInfo.parentTaskId == mMainStage.mRootTaskInfo.taskId) { + return mMainStage; + } else if (mSideStage.mRootTaskInfo != null + && taskInfo.parentTaskId == mSideStage.mRootTaskInfo.taskId) { + return mSideStage; + } + return null; + } + + @SplitScreen.StageType + private int getStageType(StageTaskListener stage) { + return stage == mMainStage ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE; + } + + @Override + public WindowContainerTransaction handleRequest(@NonNull IBinder transition, + @Nullable TransitionRequestInfo request) { + final ActivityManager.RunningTaskInfo triggerTask = request.getTriggerTask(); + if (triggerTask == null) { + // still want to monitor everything while in split-screen, so return non-null. + return isSplitScreenVisible() ? new WindowContainerTransaction() : null; + } + + WindowContainerTransaction out = null; + final @WindowManager.TransitionType int type = request.getType(); + if (isSplitScreenVisible()) { + // try to handle everything while in split-screen, so return a WCT even if it's empty. + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " split is active so using split" + + "Transition to handle request. triggerTask=%d type=%s mainChildren=%d" + + " sideChildren=%d", triggerTask.taskId, transitTypeToString(type), + mMainStage.getChildCount(), mSideStage.getChildCount()); + out = new WindowContainerTransaction(); + final StageTaskListener stage = getStageOfTask(triggerTask); + if (stage != null) { + // dismiss split if the last task in one of the stages is going away + if (isClosingType(type) && stage.getChildCount() == 1) { + // The top should be the opposite side that is closing: + mDismissTop = getStageType(stage) == STAGE_TYPE_MAIN + ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN; + } + } else { + if (triggerTask.getActivityType() == ACTIVITY_TYPE_HOME && isOpeningType(type)) { + // Going home so dismiss both. + mDismissTop = STAGE_TYPE_UNDEFINED; + } + } + if (mDismissTop != NO_DISMISS) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + + " deduced Dismiss from request. toTop=%s", + stageTypeToString(mDismissTop)); + prepareExitSplitScreen(mDismissTop, out); + mSplitTransitions.mPendingDismiss = transition; + } + } else { + // Not in split mode, so look for an open into a split stage just so we can whine and + // complain about how this isn't a supported operation. + if ((type == TRANSIT_OPEN || type == TRANSIT_TO_FRONT)) { + if (getStageOfTask(triggerTask) != null) { + throw new IllegalStateException("Entering split implicitly with only one task" + + " isn't supported."); + } + } + } + return out; + } + + @Override + public boolean startAnimation(@NonNull IBinder transition, + @NonNull TransitionInfo info, + @NonNull SurfaceControl.Transaction t, + @NonNull Transitions.TransitionFinishCallback finishCallback) { + if (transition != mSplitTransitions.mPendingDismiss + && transition != mSplitTransitions.mPendingEnter) { + // Not entering or exiting, so just do some house-keeping and validation. + + // If we're not in split-mode, just abort so something else can handle it. + if (!isSplitScreenVisible()) return false; + + for (int iC = 0; iC < info.getChanges().size(); ++iC) { + final TransitionInfo.Change change = info.getChanges().get(iC); + final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); + if (taskInfo == null || !taskInfo.hasParentTask()) continue; + final StageTaskListener stage = getStageOfTask(taskInfo); + if (stage == null) continue; + if (isOpeningType(change.getMode())) { + if (!stage.containsTask(taskInfo.taskId)) { + Log.w(TAG, "Expected onTaskAppeared on " + stage + " to have been called" + + " with " + taskInfo.taskId + " before startAnimation()."); + } + } else if (isClosingType(change.getMode())) { + if (stage.containsTask(taskInfo.taskId)) { + Log.w(TAG, "Expected onTaskVanished on " + stage + " to have been called" + + " with " + taskInfo.taskId + " before startAnimation()."); + } + } + } + if (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0) { + // TODO(shell-transitions): Implement a fallback behavior for now. + throw new IllegalStateException("Somehow removed the last task in a stage" + + " outside of a proper transition"); + // This can happen in some pathological cases. For example: + // 1. main has 2 tasks [Task A (Single-task), Task B], side has one task [Task C] + // 2. Task B closes itself and starts Task A in LAUNCH_ADJACENT at the same time + // In this case, the result *should* be that we leave split. + // TODO(b/184679596): Find a way to either include task-org information in + // the transition, or synchronize task-org callbacks. + } + + // Use normal animations. + return false; + } + + boolean shouldAnimate = true; + if (mSplitTransitions.mPendingEnter == transition) { + shouldAnimate = startPendingEnterAnimation(transition, info, t); + } else if (mSplitTransitions.mPendingDismiss == transition) { + shouldAnimate = startPendingDismissAnimation(transition, info, t); + } + if (!shouldAnimate) return false; + + mSplitTransitions.playAnimation(transition, info, t, finishCallback, + mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token); + return true; + } + + private boolean startPendingEnterAnimation(@NonNull IBinder transition, + @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t) { + if (info.getType() == TRANSIT_SPLIT_SCREEN_PAIR_OPEN) { + // First, verify that we actually have opened 2 apps in split. + TransitionInfo.Change mainChild = null; + TransitionInfo.Change sideChild = null; + for (int iC = 0; iC < info.getChanges().size(); ++iC) { + final TransitionInfo.Change change = info.getChanges().get(iC); + final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); + if (taskInfo == null || !taskInfo.hasParentTask()) continue; + final @SplitScreen.StageType int stageType = getStageType(getStageOfTask(taskInfo)); + if (stageType == STAGE_TYPE_MAIN) { + mainChild = change; + } else if (stageType == STAGE_TYPE_SIDE) { + sideChild = change; + } + } + if (mainChild == null || sideChild == null) { + throw new IllegalStateException("Launched 2 tasks in split, but didn't receive" + + " 2 tasks in transition. Possibly one of them failed to launch"); + // TODO: fallback logic. Probably start a new transition to exit split before + // applying anything here. Ideally consolidate with transition-merging. + } + + // Update local states (before animating). + setDividerVisibility(true); + setSideStagePosition(STAGE_POSITION_BOTTOM_OR_RIGHT, false /* updateVisibility */); + setSplitsVisible(true); + + addDividerBarToTransition(info, t, true /* show */); + + // Make some noise if things aren't totally expected. These states shouldn't effect + // transitions locally, but remotes (like Launcher) may get confused if they were + // depending on listener callbacks. This can happen because task-organizer callbacks + // aren't serialized with transition callbacks. + // TODO(b/184679596): Find a way to either include task-org information in + // the transition, or synchronize task-org callbacks. + if (!mMainStage.containsTask(mainChild.getTaskInfo().taskId)) { + Log.w(TAG, "Expected onTaskAppeared on " + mMainStage + + " to have been called with " + mainChild.getTaskInfo().taskId + + " before startAnimation()."); + } + if (!mSideStage.containsTask(sideChild.getTaskInfo().taskId)) { + Log.w(TAG, "Expected onTaskAppeared on " + mSideStage + + " to have been called with " + sideChild.getTaskInfo().taskId + + " before startAnimation()."); + } + return true; + } else { + // TODO: other entry method animations + throw new RuntimeException("Unsupported split-entry"); + } + } + + private boolean startPendingDismissAnimation(@NonNull IBinder transition, + @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t) { + // Make some noise if things aren't totally expected. These states shouldn't effect + // transitions locally, but remotes (like Launcher) may get confused if they were + // depending on listener callbacks. This can happen because task-organizer callbacks + // aren't serialized with transition callbacks. + // TODO(b/184679596): Find a way to either include task-org information in + // the transition, or synchronize task-org callbacks. + if (mMainStage.getChildCount() != 0) { + final StringBuilder tasksLeft = new StringBuilder(); + for (int i = 0; i < mMainStage.getChildCount(); ++i) { + tasksLeft.append(i != 0 ? ", " : ""); + tasksLeft.append(mMainStage.mChildrenTaskInfo.keyAt(i)); + } + Log.w(TAG, "Expected onTaskVanished on " + mMainStage + + " to have been called with [" + tasksLeft.toString() + + "] before startAnimation()."); + } + if (mSideStage.getChildCount() != 0) { + final StringBuilder tasksLeft = new StringBuilder(); + for (int i = 0; i < mSideStage.getChildCount(); ++i) { + tasksLeft.append(i != 0 ? ", " : ""); + tasksLeft.append(mSideStage.mChildrenTaskInfo.keyAt(i)); + } + Log.w(TAG, "Expected onTaskVanished on " + mSideStage + + " to have been called with [" + tasksLeft.toString() + + "] before startAnimation()."); + } + + // Update local states. + setSplitsVisible(false); + // Wait until after animation to update divider + + if (info.getType() == TRANSIT_SPLIT_DISMISS_SNAP) { + // Reset crops so they don't interfere with subsequent launches + t.setWindowCrop(mMainStage.mRootLeash, null); + t.setWindowCrop(mSideStage.mRootLeash, null); + } + + if (mDismissTop == STAGE_TYPE_UNDEFINED) { + // Going home (dismissing both splits) + + // TODO: Have a proper remote for this. Until then, though, reset state and use the + // normal animation stuff (which falls back to the normal launcher remote). + t.hide(mSplitLayout.getDividerLeash()); + setDividerVisibility(false); + mSplitTransitions.mPendingDismiss = null; + return false; + } + + addDividerBarToTransition(info, t, false /* show */); + // We're dismissing split by moving the other one to fullscreen. + // Since we don't have any animations for this yet, just use the internal example + // animations. + return true; + } + + private void addDividerBarToTransition(@NonNull TransitionInfo info, + @NonNull SurfaceControl.Transaction t, boolean show) { + final SurfaceControl leash = mSplitLayout.getDividerLeash(); + final TransitionInfo.Change barChange = new TransitionInfo.Change(null /* token */, leash); + final Rect bounds = mSplitLayout.getDividerBounds(); + barChange.setStartAbsBounds(bounds); + barChange.setEndAbsBounds(bounds); + barChange.setMode(show ? TRANSIT_TO_FRONT : TRANSIT_TO_BACK); + barChange.setFlags(FLAG_IS_DIVIDER_BAR); + // Technically this should be order-0, but this is running after layer assignment + // and it's a special case, so just add to end. + info.addChange(barChange); + // Be default, make it visible. The remote animator can adjust alpha if it plans to animate. + if (show) { + t.setAlpha(leash, 1.f); + t.setLayer(leash, Integer.MAX_VALUE); + t.setPosition(leash, bounds.left, bounds.top); + t.show(leash); + } + } + @Override public void dump(@NonNull PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; @@ -469,6 +838,16 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, pw.println(innerPrefix + "mSplitLayout=" + mSplitLayout); } + /** + * Directly set the visibility of both splits. This assumes hasChildren matches visibility. + * This is intended for batch use, so it assumes other state management logic is already + * handled. + */ + private void setSplitsVisible(boolean visible) { + mMainStageListener.mVisible = mSideStageListener.mVisible = visible; + mMainStageListener.mHasChildren = mSideStageListener.mHasChildren = visible; + } + class StageListenerImpl implements StageTaskListener.StageListenerCallbacks { boolean mHasRootTask = false; boolean mVisible = false; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index b8cdc4ab4d75..1da0a2d82766 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -21,6 +21,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; +import static com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS; + import android.annotation.CallSuper; import android.app.ActivityManager; import android.graphics.Point; @@ -33,7 +35,6 @@ import androidx.annotation.NonNull; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.SyncTransactionQueue; -import com.android.wm.shell.transition.Transitions; import java.io.PrintWriter; @@ -76,6 +77,14 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { taskOrganizer.createRootTask(displayId, WINDOWING_MODE_MULTI_WINDOW, this); } + int getChildCount() { + return mChildrenTaskInfo.size(); + } + + boolean containsTask(int taskId) { + return mChildrenTaskInfo.contains(taskId); + } + @Override @CallSuper public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { @@ -83,17 +92,22 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { mRootLeash = leash; mRootTaskInfo = taskInfo; mCallbacks.onRootTaskAppeared(); + sendStatusChanged(); } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) { final int taskId = taskInfo.taskId; mChildrenLeashes.put(taskId, leash); mChildrenTaskInfo.put(taskId, taskInfo); updateChildTaskSurface(taskInfo, leash, true /* firstAppeared */); mCallbacks.onChildTaskStatusChanged(taskId, true /* present */, taskInfo.isVisible); + if (ENABLE_SHELL_TRANSITIONS) { + // Status is managed/synchronized by the transition lifecycle. + return; + } + sendStatusChanged(); } else { throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo + "\n mRootTaskInfo: " + mRootTaskInfo); } - sendStatusChanged(); } @Override @@ -103,14 +117,20 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { mRootTaskInfo = taskInfo; } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) { mChildrenTaskInfo.put(taskInfo.taskId, taskInfo); - updateChildTaskSurface( - taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */); mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */, taskInfo.isVisible); + if (!ENABLE_SHELL_TRANSITIONS) { + updateChildTaskSurface( + taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */); + } } else { throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo + "\n mRootTaskInfo: " + mRootTaskInfo); } + if (ENABLE_SHELL_TRANSITIONS) { + // Status is managed/synchronized by the transition lifecycle. + return; + } sendStatusChanged(); } @@ -124,8 +144,12 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } else if (mChildrenTaskInfo.contains(taskId)) { mChildrenTaskInfo.remove(taskId); mChildrenLeashes.remove(taskId); - sendStatusChanged(); mCallbacks.onChildTaskStatusChanged(taskId, false /* present */, taskInfo.isVisible); + if (ENABLE_SHELL_TRANSITIONS) { + // Status is managed/synchronized by the transition lifecycle. + return; + } + sendStatusChanged(); } else { throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo + "\n mRootTaskInfo: " + mRootTaskInfo); @@ -166,7 +190,7 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { mSyncQueue.runInSync(t -> { t.setWindowCrop(leash, null); t.setPosition(leash, taskPositionInParent.x, taskPositionInParent.y); - if (firstAppeared && !Transitions.ENABLE_SHELL_TRANSITIONS) { + if (firstAppeared && !ENABLE_SHELL_TRANSITIONS) { t.setAlpha(leash, 1f); t.setMatrix(leash, 1, 0, 0, 1); t.show(leash); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index ca1b53d4d46b..64dc47f5549a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -18,6 +18,7 @@ package com.android.wm.shell.transition; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; +import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; @@ -70,6 +71,12 @@ public class Transitions implements RemoteCallable<Transitions> { public static final boolean ENABLE_SHELL_TRANSITIONS = SystemProperties.getBoolean("persist.debug.shell_transit", false); + /** Transition type for dismissing split-screen via dragging the divider off the screen. */ + public static final int TRANSIT_SPLIT_DISMISS_SNAP = TRANSIT_FIRST_CUSTOM + 1; + + /** Transition type for launching 2 tasks simultaneously. */ + public static final int TRANSIT_SPLIT_SCREEN_PAIR_OPEN = TRANSIT_FIRST_CUSTOM + 2; + private final WindowOrganizer mOrganizer; private final Context mContext; private final ShellExecutor mMainExecutor; @@ -209,6 +216,11 @@ public class Transitions implements RemoteCallable<Transitions> { || type == WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; } + /** @return true if the transition was triggered by closing something vs opening something */ + public static boolean isClosingType(@WindowManager.TransitionType int type) { + return type == TRANSIT_CLOSE || type == TRANSIT_TO_BACK; + } + /** * Reparents all participants into a shared parent and orders them based on: the global transit * type, their transit mode, and their destination z-order. diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java index 1f58a8546796..b0de02922f74 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java @@ -17,18 +17,32 @@ package com.android.wm.shell; import static android.app.ActivityTaskManager.INVALID_TASK_ID; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import android.app.ActivityManager; +import android.app.WindowConfiguration; import android.graphics.Rect; +import android.os.IBinder; import android.window.IWindowContainerToken; import android.window.WindowContainerToken; public final class TestRunningTaskInfoBuilder { static int sNextTaskId = 500; private Rect mBounds = new Rect(0, 0, 100, 100); - private WindowContainerToken mToken = - new WindowContainerToken(new IWindowContainerToken.Default()); + + private WindowContainerToken mToken = createMockWCToken(); private int mParentTaskId = INVALID_TASK_ID; + private @WindowConfiguration.ActivityType int mActivityType = ACTIVITY_TYPE_STANDARD; + + public static WindowContainerToken createMockWCToken() { + final IWindowContainerToken itoken = mock(IWindowContainerToken.class); + final IBinder asBinder = mock(IBinder.class); + doReturn(asBinder).when(itoken).asBinder(); + return new WindowContainerToken(itoken); + } public TestRunningTaskInfoBuilder setBounds(Rect bounds) { mBounds.set(bounds); @@ -40,12 +54,19 @@ public final class TestRunningTaskInfoBuilder { return this; } + public TestRunningTaskInfoBuilder setActivityType( + @WindowConfiguration.ActivityType int activityType) { + mActivityType = activityType; + return this; + } + public ActivityManager.RunningTaskInfo build() { final ActivityManager.RunningTaskInfo info = new ActivityManager.RunningTaskInfo(); info.parentTaskId = INVALID_TASK_ID; info.taskId = sNextTaskId++; info.parentTaskId = mParentTaskId; info.configuration.windowConfiguration.setBounds(mBounds); + info.configuration.windowConfiguration.setActivityType(mActivityType); info.token = mToken; info.isResizeable = true; return info; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java new file mode 100644 index 000000000000..ab6f76996398 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2021 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.wm.shell.splitscreen; + +import static android.view.Display.DEFAULT_DISPLAY; +import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import android.content.Context; +import android.graphics.Rect; +import android.view.SurfaceControl; +import android.window.DisplayAreaInfo; +import android.window.IWindowContainerToken; +import android.window.WindowContainerToken; + +import com.android.dx.mockito.inline.extended.ExtendedMockito; +import com.android.wm.shell.RootTaskDisplayAreaOrganizer; +import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.common.DisplayImeController; +import com.android.wm.shell.common.SyncTransactionQueue; +import com.android.wm.shell.common.TransactionPool; +import com.android.wm.shell.common.split.SplitLayout; +import com.android.wm.shell.transition.Transitions; + +public class SplitTestUtils { + + static SplitLayout createMockSplitLayout() { + final Rect dividerBounds = new Rect(48, 0, 52, 100); + final SurfaceControl leash = createMockSurface(); + SplitLayout out = mock(SplitLayout.class); + doReturn(dividerBounds).when(out).getDividerBounds(); + doReturn(leash).when(out).getDividerLeash(); + return out; + } + + static SurfaceControl createMockSurface() { + return createMockSurface(true); + } + + static SurfaceControl createMockSurface(boolean valid) { + SurfaceControl sc = mock(SurfaceControl.class); + ExtendedMockito.doReturn(valid).when(sc).isValid(); + return sc; + } + + static class TestStageCoordinator extends StageCoordinator { + final DisplayAreaInfo mDisplayAreaInfo; + + TestStageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, + RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer, + MainStage mainStage, SideStage sideStage, DisplayImeController imeController, + SplitLayout splitLayout, Transitions transitions, TransactionPool transactionPool) { + super(context, displayId, syncQueue, rootTDAOrganizer, taskOrganizer, mainStage, + sideStage, imeController, splitLayout, transitions, transactionPool); + + // Prepare default TaskDisplayArea for testing. + mDisplayAreaInfo = new DisplayAreaInfo( + new WindowContainerToken(new IWindowContainerToken.Default()), + DEFAULT_DISPLAY, + FEATURE_DEFAULT_TASK_CONTAINER); + this.onDisplayAreaAppeared(mDisplayAreaInfo); + } + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java new file mode 100644 index 000000000000..18642fcfef6c --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2021 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.wm.shell.splitscreen; + +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; +import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.WindowManager.TRANSIT_CHANGE; +import static android.view.WindowManager.TRANSIT_CLOSE; +import static android.view.WindowManager.TRANSIT_OPEN; +import static android.view.WindowManager.TRANSIT_TO_BACK; +import static android.view.WindowManager.TRANSIT_TO_FRONT; +import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT; + +import static com.android.wm.shell.splitscreen.SplitTestUtils.createMockSurface; +import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import android.annotation.NonNull; +import android.app.ActivityManager; +import android.graphics.Rect; +import android.os.IBinder; +import android.os.RemoteException; +import android.view.SurfaceControl; +import android.window.IRemoteTransition; +import android.window.IRemoteTransitionFinishedCallback; +import android.window.TransitionInfo; +import android.window.TransitionRequestInfo; +import android.window.WindowContainerTransaction; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.wm.shell.RootTaskDisplayAreaOrganizer; +import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.ShellTestCase; +import com.android.wm.shell.TestRunningTaskInfoBuilder; +import com.android.wm.shell.common.DisplayImeController; +import com.android.wm.shell.common.ShellExecutor; +import com.android.wm.shell.common.SyncTransactionQueue; +import com.android.wm.shell.common.TransactionPool; +import com.android.wm.shell.common.split.SplitLayout; +import com.android.wm.shell.transition.Transitions; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +/** Tests for {@link StageCoordinator} */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class SplitTransitionTests extends ShellTestCase { + @Mock private ShellTaskOrganizer mTaskOrganizer; + @Mock private SyncTransactionQueue mSyncQueue; + @Mock private RootTaskDisplayAreaOrganizer mRootTDAOrganizer; + @Mock private DisplayImeController mDisplayImeController; + @Mock private TransactionPool mTransactionPool; + @Mock private Transitions mTransitions; + private SplitLayout mSplitLayout; + private MainStage mMainStage; + private SideStage mSideStage; + private StageCoordinator mStageCoordinator; + private SplitScreenTransitions mSplitScreenTransitions; + + private ActivityManager.RunningTaskInfo mMainChild; + private ActivityManager.RunningTaskInfo mSideChild; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + final ShellExecutor mockExecutor = mock(ShellExecutor.class); + doReturn(mockExecutor).when(mTransitions).getMainExecutor(); + doReturn(mockExecutor).when(mTransitions).getAnimExecutor(); + doReturn(mock(SurfaceControl.Transaction.class)).when(mTransactionPool).acquire(); + mSplitLayout = SplitTestUtils.createMockSplitLayout(); + mMainStage = new MainStage(mTaskOrganizer, DEFAULT_DISPLAY, mock( + StageTaskListener.StageListenerCallbacks.class), mSyncQueue); + mMainStage.onTaskAppeared(new TestRunningTaskInfoBuilder().build(), createMockSurface()); + mSideStage = new SideStage(mTaskOrganizer, DEFAULT_DISPLAY, mock( + StageTaskListener.StageListenerCallbacks.class), mSyncQueue); + mSideStage.onTaskAppeared(new TestRunningTaskInfoBuilder().build(), createMockSurface()); + mStageCoordinator = new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY, + mSyncQueue, mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage, + mDisplayImeController, mSplitLayout, mTransitions, mTransactionPool); + mSplitScreenTransitions = mStageCoordinator.getSplitTransitions(); + doAnswer((Answer<IBinder>) invocation -> mock(IBinder.class)) + .when(mTransitions).startTransition(anyInt(), any(), any()); + + mMainChild = new TestRunningTaskInfoBuilder() + .setParentTaskId(mMainStage.mRootTaskInfo.taskId).build(); + mSideChild = new TestRunningTaskInfoBuilder() + .setParentTaskId(mSideStage.mRootTaskInfo.taskId).build(); + } + + @Test + public void testLaunchPair() { + TransitionInfo info = createEnterPairInfo(); + + TestRemoteTransition testRemote = new TestRemoteTransition(); + + IBinder transition = mSplitScreenTransitions.startEnterTransition( + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), testRemote, + mStageCoordinator); + mMainStage.onTaskAppeared(mMainChild, createMockSurface()); + mSideStage.onTaskAppeared(mSideChild, createMockSurface()); + boolean accepted = mStageCoordinator.startAnimation(transition, info, + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + assertTrue(accepted); + + // Make sure split-screen is now visible + assertTrue(mStageCoordinator.isSplitScreenVisible()); + assertTrue(testRemote.mCalled); + } + + @Test + public void testMonitorInSplit() { + enterSplit(); + + ActivityManager.RunningTaskInfo newTask = new TestRunningTaskInfoBuilder() + .setParentTaskId(mSideStage.mRootTaskInfo.taskId).build(); + + // Create a request to start a new task in side stage + TransitionRequestInfo request = new TransitionRequestInfo(TRANSIT_TO_FRONT, newTask, null); + IBinder transition = mock(IBinder.class); + WindowContainerTransaction result = + mStageCoordinator.handleRequest(transition, request); + + // while in split, it should handle everything: + assertNotNull(result); + + // Not exiting, just opening up another side-stage task. + assertFalse(containsSplitExit(result)); + + // simulate the transition + TransitionInfo.Change openChange = createChange(TRANSIT_TO_FRONT, newTask); + TransitionInfo.Change hideChange = createChange(TRANSIT_TO_BACK, mSideChild); + + TransitionInfo info = new TransitionInfo(TRANSIT_TO_FRONT, 0); + info.addChange(openChange); + info.addChange(hideChange); + mSideStage.onTaskAppeared(newTask, createMockSurface()); + boolean accepted = mStageCoordinator.startAnimation(transition, info, + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + assertFalse(accepted); + assertTrue(mStageCoordinator.isSplitScreenVisible()); + + // same, but create request to close the new task + request = new TransitionRequestInfo(TRANSIT_CLOSE, newTask, null); + transition = mock(IBinder.class); + result = mStageCoordinator.handleRequest(transition, request); + assertNotNull(result); + assertFalse(containsSplitExit(result)); + + TransitionInfo.Change showChange = createChange(TRANSIT_TO_FRONT, mSideChild); + TransitionInfo.Change closeChange = createChange(TRANSIT_CLOSE, newTask); + + info = new TransitionInfo(TRANSIT_CLOSE, 0); + info.addChange(showChange); + info.addChange(closeChange); + mSideStage.onTaskVanished(newTask); + accepted = mStageCoordinator.startAnimation(transition, info, + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + assertFalse(accepted); + assertTrue(mStageCoordinator.isSplitScreenVisible()); + } + + @Test + public void testDismissToHome() { + enterSplit(); + + ActivityManager.RunningTaskInfo homeTask = new TestRunningTaskInfoBuilder() + .setActivityType(ACTIVITY_TYPE_HOME).build(); + + // Create a request to bring home forward + TransitionRequestInfo request = new TransitionRequestInfo(TRANSIT_TO_FRONT, homeTask, null); + IBinder transition = mock(IBinder.class); + WindowContainerTransaction result = mStageCoordinator.handleRequest(transition, request); + + assertTrue(containsSplitExit(result)); + + // make sure we haven't made any local changes yet (need to wait until transition is ready) + assertTrue(mStageCoordinator.isSplitScreenVisible()); + + // simulate the transition + TransitionInfo.Change homeChange = createChange(TRANSIT_TO_FRONT, homeTask); + TransitionInfo.Change mainChange = createChange(TRANSIT_TO_BACK, mMainChild); + TransitionInfo.Change sideChange = createChange(TRANSIT_TO_BACK, mSideChild); + + TransitionInfo info = new TransitionInfo(TRANSIT_TO_FRONT, 0); + info.addChange(homeChange); + info.addChange(mainChange); + info.addChange(sideChange); + mMainStage.onTaskVanished(mMainChild); + mSideStage.onTaskVanished(mSideChild); + mStageCoordinator.startAnimation(transition, info, + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + assertFalse(mStageCoordinator.isSplitScreenVisible()); + } + + @Test + public void testDismissSnap() { + enterSplit(); + + // simulate the transition + TransitionInfo.Change mainChange = createChange(TRANSIT_TO_BACK, mMainChild); + TransitionInfo.Change sideChange = createChange(TRANSIT_CHANGE, mSideChild); + + TransitionInfo info = new TransitionInfo(TRANSIT_TO_BACK, 0); + info.addChange(mainChange); + info.addChange(sideChange); + IBinder transition = mStageCoordinator.onSnappedToDismissTransition( + false /* mainStageToTop */); + mMainStage.onTaskVanished(mMainChild); + mSideStage.onTaskVanished(mSideChild); + boolean accepted = mStageCoordinator.startAnimation(transition, info, + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + assertTrue(accepted); + assertFalse(mStageCoordinator.isSplitScreenVisible()); + } + + @Test + public void testDismissFromAppFinish() { + enterSplit(); + + // Create a request to exit the "last" task on side stage + TransitionRequestInfo request = new TransitionRequestInfo(TRANSIT_CLOSE, mSideChild, null); + IBinder transition = mock(IBinder.class); + WindowContainerTransaction result = mStageCoordinator.handleRequest(transition, request); + + assertTrue(containsSplitExit(result)); + + // make sure we haven't made any local changes yet (need to wait until transition is ready) + assertTrue(mStageCoordinator.isSplitScreenVisible()); + + // simulate the transition + TransitionInfo.Change mainChange = createChange(TRANSIT_CHANGE, mMainChild); + TransitionInfo.Change sideChange = createChange(TRANSIT_CLOSE, mSideChild); + + TransitionInfo info = new TransitionInfo(TRANSIT_CLOSE, 0); + info.addChange(mainChange); + info.addChange(sideChange); + mMainStage.onTaskVanished(mMainChild); + mSideStage.onTaskVanished(mSideChild); + boolean accepted = mStageCoordinator.startAnimation(transition, info, + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + assertTrue(accepted); + assertFalse(mStageCoordinator.isSplitScreenVisible()); + } + + private TransitionInfo createEnterPairInfo() { + TransitionInfo.Change mainChange = createChange(TRANSIT_OPEN, mMainChild); + TransitionInfo.Change sideChange = createChange(TRANSIT_OPEN, mSideChild); + + TransitionInfo info = new TransitionInfo(TRANSIT_SPLIT_SCREEN_PAIR_OPEN, 0); + info.addChange(mainChange); + info.addChange(sideChange); + return info; + } + + private void enterSplit() { + TransitionInfo enterInfo = createEnterPairInfo(); + IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), + new TestRemoteTransition(), mStageCoordinator); + mMainStage.onTaskAppeared(mMainChild, createMockSurface()); + mSideStage.onTaskAppeared(mSideChild, createMockSurface()); + mStageCoordinator.startAnimation(enterTransit, enterInfo, + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + mMainStage.activate(new Rect(0, 0, 100, 100), new WindowContainerTransaction()); + } + + private boolean containsSplitExit(@NonNull WindowContainerTransaction wct) { + // reparenting of child tasks to null constitutes exiting split. + boolean reparentedMain = false; + boolean reparentedSide = false; + for (int i = 0; i < wct.getHierarchyOps().size(); ++i) { + WindowContainerTransaction.HierarchyOp op = wct.getHierarchyOps().get(i); + if (op.getType() == HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT) { + if (op.getContainer() == mMainStage.mRootTaskInfo.token.asBinder() + && op.getNewParent() == null) { + reparentedMain = true; + } else if (op.getContainer() == mSideStage.mRootTaskInfo.token.asBinder() + && op.getNewParent() == null) { + reparentedSide = true; + } + } + } + return reparentedMain && reparentedSide; + } + + private static TransitionInfo.Change createChange(@TransitionInfo.TransitionMode int mode, + ActivityManager.RunningTaskInfo taskInfo) { + TransitionInfo.Change out = new TransitionInfo.Change(taskInfo.token, createMockSurface()); + out.setMode(mode); + out.setTaskInfo(taskInfo); + return out; + } + + class TestRemoteTransition extends IRemoteTransition.Stub { + boolean mCalled = false; + final WindowContainerTransaction mRemoteFinishWCT = new WindowContainerTransaction(); + + @Override + public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t, + IRemoteTransitionFinishedCallback finishCallback) throws RemoteException { + mCalled = true; + finishCallback.onTransitionFinished(mRemoteFinishWCT); + } + } + +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index 74753aac4a24..924e94679831 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -17,7 +17,6 @@ package com.android.wm.shell.splitscreen; import static android.view.Display.DEFAULT_DISPLAY; -import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_POSITION_BOTTOM_OR_RIGHT; @@ -27,11 +26,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import android.app.ActivityManager; -import android.content.Context; import android.graphics.Rect; -import android.window.DisplayAreaInfo; -import android.window.IWindowContainerToken; -import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -43,6 +38,8 @@ import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestRunningTaskInfoBuilder; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.SyncTransactionQueue; +import com.android.wm.shell.common.TransactionPool; +import com.android.wm.shell.transition.Transitions; import org.junit.Before; import org.junit.Test; @@ -60,13 +57,16 @@ public class StageCoordinatorTests extends ShellTestCase { @Mock private MainStage mMainStage; @Mock private SideStage mSideStage; @Mock private DisplayImeController mDisplayImeController; + @Mock private Transitions mTransitions; + @Mock private TransactionPool mTransactionPool; private StageCoordinator mStageCoordinator; @Before public void setup() { MockitoAnnotations.initMocks(this); - mStageCoordinator = new TestStageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, - mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage, mDisplayImeController); + mStageCoordinator = new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY, + mSyncQueue, mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage, + mDisplayImeController, null /* splitLayout */, mTransitions, mTransactionPool); } @Test @@ -90,22 +90,4 @@ public class StageCoordinatorTests extends ShellTestCase { verify(mSideStage).removeTask( eq(task.taskId), any(), any(WindowContainerTransaction.class)); } - - private static class TestStageCoordinator extends StageCoordinator { - final DisplayAreaInfo mDisplayAreaInfo; - - TestStageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, - RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer, - MainStage mainStage, SideStage sideStage, DisplayImeController imeController) { - super(context, displayId, syncQueue, rootTDAOrganizer, taskOrganizer, mainStage, - sideStage, imeController); - - // Prepare default TaskDisplayArea for testing. - mDisplayAreaInfo = new DisplayAreaInfo( - new WindowContainerToken(new IWindowContainerToken.Default()), - DEFAULT_DISPLAY, - FEATURE_DEFAULT_TASK_CONTAINER); - this.onDisplayAreaAppeared(mDisplayAreaInfo); - } - } } diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index c75b21f739cd..9270901bcacd 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -503,6 +503,7 @@ cc_defaults { "RenderProperties.cpp", "RootRenderNode.cpp", "SkiaCanvas.cpp", + "SkiaInterpolator.cpp", "VectorDrawable.cpp", ], diff --git a/libs/hwui/FrameInfo.cpp b/libs/hwui/FrameInfo.cpp index 2448cc904104..51fbf363f51c 100644 --- a/libs/hwui/FrameInfo.cpp +++ b/libs/hwui/FrameInfo.cpp @@ -21,29 +21,16 @@ namespace android { namespace uirenderer { const std::array FrameInfoNames{ - "Flags", - "FrameTimelineVsyncId", - "IntendedVsync", - "Vsync", - "InputEventId", - "HandleInputStart", - "AnimationStart", - "PerformTraversalsStart", - "DrawStart", - "FrameDeadline", - "SyncQueued", - "SyncStart", - "IssueDrawCommandsStart", - "SwapBuffers", - "FrameCompleted", - "DequeueBufferDuration", - "QueueBufferDuration", - "GpuCompleted", - "SwapBuffersCompleted", - "DisplayPresentTime", + "Flags", "FrameTimelineVsyncId", "IntendedVsync", + "Vsync", "InputEventId", "HandleInputStart", + "AnimationStart", "PerformTraversalsStart", "DrawStart", + "FrameDeadline", "FrameStartTime", "SyncQueued", + "SyncStart", "IssueDrawCommandsStart", "SwapBuffers", + "FrameCompleted", "DequeueBufferDuration", "QueueBufferDuration", + "GpuCompleted", "SwapBuffersCompleted", "DisplayPresentTime", }; -static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 20, +static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 21, "Must update value in FrameMetrics.java#FRAME_STATS_COUNT (and here)"); void FrameInfo::importUiThreadInfo(int64_t* info) { diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h index e9b2f4a9bb3b..62ac4ca5fdad 100644 --- a/libs/hwui/FrameInfo.h +++ b/libs/hwui/FrameInfo.h @@ -28,7 +28,7 @@ namespace android { namespace uirenderer { -static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 10; +static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 11; enum class FrameInfoIndex { Flags = 0, @@ -41,6 +41,7 @@ enum class FrameInfoIndex { PerformTraversalsStart, DrawStart, FrameDeadline, + FrameStartTime, // End of UI frame info SyncQueued, diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index e58f31fd15eb..7af0a221d228 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -81,6 +81,9 @@ bool Properties::isolatedProcess = false; int Properties::contextPriority = 0; float Properties::defaultSdrWhitePoint = 200.f; +bool Properties::useHintManager = true; +int Properties::targetCpuTimePercentage = 70; + bool Properties::load() { bool prevDebugLayersUpdates = debugLayersUpdates; bool prevDebugOverdraw = debugOverdraw; @@ -128,6 +131,10 @@ bool Properties::load() { runningInEmulator = base::GetBoolProperty(PROPERTY_IS_EMULATOR, false); + useHintManager = base::GetBoolProperty(PROPERTY_USE_HINT_MANAGER, true); + targetCpuTimePercentage = base::GetIntProperty(PROPERTY_TARGET_CPU_TIME_PERCENTAGE, 70); + if (targetCpuTimePercentage <= 0 || targetCpuTimePercentage > 100) targetCpuTimePercentage = 70; + return (prevDebugLayersUpdates != debugLayersUpdates) || (prevDebugOverdraw != debugOverdraw); } diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index ea9cbd592d29..1cb87be98051 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -158,6 +158,20 @@ enum DebugLevel { #define PROPERTY_CAPTURE_SKP_FILENAME "debug.hwui.skp_filename" /** + * Controls whether HWUI will send timing hints to HintManager for + * better CPU scheduling. Accepted values are "true" and "false". + */ +#define PROPERTY_USE_HINT_MANAGER "debug.hwui.use_hint_manager" + +/** + * Percentage of frame time that's used for CPU work. The rest is + * reserved for GPU work. This is used with use_hint_manager to + * provide timing hints to HintManager. Accepted values are + * integer from 1-100. + */ +#define PROPERTY_TARGET_CPU_TIME_PERCENTAGE "debug.hwui.target_cpu_time_percent" + +/** * Property for whether this is running in the emulator. */ #define PROPERTY_IS_EMULATOR "ro.boot.qemu" @@ -253,6 +267,9 @@ public: static float defaultSdrWhitePoint; + static bool useHintManager; + static int targetCpuTimePercentage; + private: static ProfileType sProfileType; static bool sDisableProfileBars; diff --git a/libs/hwui/SkiaInterpolator.cpp b/libs/hwui/SkiaInterpolator.cpp new file mode 100644 index 000000000000..0695dd1ab218 --- /dev/null +++ b/libs/hwui/SkiaInterpolator.cpp @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2008 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. + */ + +#include "SkiaInterpolator.h" + +#include "include/core/SkMath.h" +#include "include/private/SkFixed.h" +#include "include/private/SkMalloc.h" +#include "include/private/SkTo.h" +#include "src/core/SkTSearch.h" + +typedef int Dot14; +#define Dot14_ONE (1 << 14) +#define Dot14_HALF (1 << 13) + +#define Dot14ToFloat(x) ((x) / 16384.f) + +static inline Dot14 Dot14Mul(Dot14 a, Dot14 b) { + return (a * b + Dot14_HALF) >> 14; +} + +static inline Dot14 eval_cubic(Dot14 t, Dot14 A, Dot14 B, Dot14 C) { + return Dot14Mul(Dot14Mul(Dot14Mul(C, t) + B, t) + A, t); +} + +static inline Dot14 pin_and_convert(float x) { + if (x <= 0) { + return 0; + } + if (x >= SK_Scalar1) { + return Dot14_ONE; + } + return SkScalarToFixed(x) >> 2; +} + +static float SkUnitCubicInterp(float value, float bx, float by, float cx, float cy) { + // pin to the unit-square, and convert to 2.14 + Dot14 x = pin_and_convert(value); + + if (x == 0) return 0; + if (x == Dot14_ONE) return SK_Scalar1; + + Dot14 b = pin_and_convert(bx); + Dot14 c = pin_and_convert(cx); + + // Now compute our coefficients from the control points + // t -> 3b + // t^2 -> 3c - 6b + // t^3 -> 3b - 3c + 1 + Dot14 A = 3 * b; + Dot14 B = 3 * (c - 2 * b); + Dot14 C = 3 * (b - c) + Dot14_ONE; + + // Now search for a t value given x + Dot14 t = Dot14_HALF; + Dot14 dt = Dot14_HALF; + for (int i = 0; i < 13; i++) { + dt >>= 1; + Dot14 guess = eval_cubic(t, A, B, C); + if (x < guess) { + t -= dt; + } else { + t += dt; + } + } + + // Now we have t, so compute the coeff for Y and evaluate + b = pin_and_convert(by); + c = pin_and_convert(cy); + A = 3 * b; + B = 3 * (c - 2 * b); + C = 3 * (b - c) + Dot14_ONE; + return SkFixedToScalar(eval_cubic(t, A, B, C) << 2); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +SkiaInterpolatorBase::SkiaInterpolatorBase() { + fStorage = nullptr; + fTimes = nullptr; + SkDEBUGCODE(fTimesArray = nullptr;) +} + +SkiaInterpolatorBase::~SkiaInterpolatorBase() { + if (fStorage) { + sk_free(fStorage); + } +} + +void SkiaInterpolatorBase::reset(int elemCount, int frameCount) { + fFlags = 0; + fElemCount = SkToU8(elemCount); + fFrameCount = SkToS16(frameCount); + fRepeat = SK_Scalar1; + if (fStorage) { + sk_free(fStorage); + fStorage = nullptr; + fTimes = nullptr; + SkDEBUGCODE(fTimesArray = nullptr); + } +} + +/* Each value[] run is formatted as: + <time (in msec)> + <blend> + <data[fElemCount]> + + Totaling fElemCount+2 entries per keyframe +*/ + +bool SkiaInterpolatorBase::getDuration(SkMSec* startTime, SkMSec* endTime) const { + if (fFrameCount == 0) { + return false; + } + + if (startTime) { + *startTime = fTimes[0].fTime; + } + if (endTime) { + *endTime = fTimes[fFrameCount - 1].fTime; + } + return true; +} + +float SkiaInterpolatorBase::ComputeRelativeT(SkMSec time, SkMSec prevTime, SkMSec nextTime, + const float blend[4]) { + SkASSERT(time > prevTime && time < nextTime); + + float t = (float)(time - prevTime) / (float)(nextTime - prevTime); + return blend ? SkUnitCubicInterp(t, blend[0], blend[1], blend[2], blend[3]) : t; +} + +SkiaInterpolatorBase::Result SkiaInterpolatorBase::timeToT(SkMSec time, float* T, int* indexPtr, + bool* exactPtr) const { + SkASSERT(fFrameCount > 0); + Result result = kNormal_Result; + if (fRepeat != SK_Scalar1) { + SkMSec startTime = 0, endTime = 0; // initialize to avoid warning + this->getDuration(&startTime, &endTime); + SkMSec totalTime = endTime - startTime; + SkMSec offsetTime = time - startTime; + endTime = SkScalarFloorToInt(fRepeat * totalTime); + if (offsetTime >= endTime) { + float fraction = SkScalarFraction(fRepeat); + offsetTime = fraction == 0 && fRepeat > 0 + ? totalTime + : (SkMSec)SkScalarFloorToInt(fraction * totalTime); + result = kFreezeEnd_Result; + } else { + int mirror = fFlags & kMirror; + offsetTime = offsetTime % (totalTime << mirror); + if (offsetTime > totalTime) { // can only be true if fMirror is true + offsetTime = (totalTime << 1) - offsetTime; + } + } + time = offsetTime + startTime; + } + + int index = SkTSearch<SkMSec>(&fTimes[0].fTime, fFrameCount, time, sizeof(SkTimeCode)); + + bool exact = true; + + if (index < 0) { + index = ~index; + if (index == 0) { + result = kFreezeStart_Result; + } else if (index == fFrameCount) { + if (fFlags & kReset) { + index = 0; + } else { + index -= 1; + } + result = kFreezeEnd_Result; + } else { + exact = false; + } + } + SkASSERT(index < fFrameCount); + const SkTimeCode* nextTime = &fTimes[index]; + SkMSec nextT = nextTime[0].fTime; + if (exact) { + *T = 0; + } else { + SkMSec prevT = nextTime[-1].fTime; + *T = ComputeRelativeT(time, prevT, nextT, nextTime[-1].fBlend); + } + *indexPtr = index; + *exactPtr = exact; + return result; +} + +SkiaInterpolator::SkiaInterpolator() { + INHERITED::reset(0, 0); + fValues = nullptr; + SkDEBUGCODE(fScalarsArray = nullptr;) +} + +SkiaInterpolator::SkiaInterpolator(int elemCount, int frameCount) { + SkASSERT(elemCount > 0); + this->reset(elemCount, frameCount); +} + +void SkiaInterpolator::reset(int elemCount, int frameCount) { + INHERITED::reset(elemCount, frameCount); + fStorage = sk_malloc_throw((sizeof(float) * elemCount + sizeof(SkTimeCode)) * frameCount); + fTimes = (SkTimeCode*)fStorage; + fValues = (float*)((char*)fStorage + sizeof(SkTimeCode) * frameCount); +#ifdef SK_DEBUG + fTimesArray = (SkTimeCode(*)[10])fTimes; + fScalarsArray = (float(*)[10])fValues; +#endif +} + +#define SK_Fixed1Third (SK_Fixed1 / 3) +#define SK_Fixed2Third (SK_Fixed1 * 2 / 3) + +static const float gIdentityBlend[4] = {0.33333333f, 0.33333333f, 0.66666667f, 0.66666667f}; + +bool SkiaInterpolator::setKeyFrame(int index, SkMSec time, const float values[], + const float blend[4]) { + SkASSERT(values != nullptr); + + if (blend == nullptr) { + blend = gIdentityBlend; + } + + bool success = ~index == SkTSearch<SkMSec>(&fTimes->fTime, index, time, sizeof(SkTimeCode)); + SkASSERT(success); + if (success) { + SkTimeCode* timeCode = &fTimes[index]; + timeCode->fTime = time; + memcpy(timeCode->fBlend, blend, sizeof(timeCode->fBlend)); + float* dst = &fValues[fElemCount * index]; + memcpy(dst, values, fElemCount * sizeof(float)); + } + return success; +} + +SkiaInterpolator::Result SkiaInterpolator::timeToValues(SkMSec time, float values[]) const { + float T; + int index; + bool exact; + Result result = timeToT(time, &T, &index, &exact); + if (values) { + const float* nextSrc = &fValues[index * fElemCount]; + + if (exact) { + memcpy(values, nextSrc, fElemCount * sizeof(float)); + } else { + SkASSERT(index > 0); + + const float* prevSrc = nextSrc - fElemCount; + + for (int i = fElemCount - 1; i >= 0; --i) { + values[i] = SkScalarInterp(prevSrc[i], nextSrc[i], T); + } + } + } + return result; +} diff --git a/libs/hwui/SkiaInterpolator.h b/libs/hwui/SkiaInterpolator.h new file mode 100644 index 000000000000..c03f502528be --- /dev/null +++ b/libs/hwui/SkiaInterpolator.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2006 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. + */ + +#ifndef SkiaInterpolator_DEFINED +#define SkiaInterpolator_DEFINED + +#include "include/private/SkTo.h" + +class SkiaInterpolatorBase { +public: + enum Result { kNormal_Result, kFreezeStart_Result, kFreezeEnd_Result }; + +protected: + SkiaInterpolatorBase(); + ~SkiaInterpolatorBase(); + +public: + void reset(int elemCount, int frameCount); + + /** Return the start and end time for this interpolator. + If there are no key frames, return false. + @param startTime If not null, returns the time (in milliseconds) of the + first keyframe. If there are no keyframes, this param + is ignored (left unchanged). + @param endTime If not null, returns the time (in milliseconds) of the + last keyframe. If there are no keyframes, this parameter + is ignored (left unchanged). + @return True if there are key frames, or false if there are none. + */ + bool getDuration(uint32_t* startTime, uint32_t* endTime) const; + + /** Set the whether the repeat is mirrored. + @param mirror If true, the odd repeats interpolate from the last key + frame and the first. + */ + void setMirror(bool mirror) { fFlags = SkToU8((fFlags & ~kMirror) | (int)mirror); } + + /** Set the repeat count. The repeat count may be fractional. + @param repeatCount Multiplies the total time by this scalar. + */ + void setRepeatCount(float repeatCount) { fRepeat = repeatCount; } + + /** Set the whether the repeat is mirrored. + @param reset If true, the odd repeats interpolate from the last key + frame and the first. + */ + void setReset(bool reset) { fFlags = SkToU8((fFlags & ~kReset) | (int)reset); } + + Result timeToT(uint32_t time, float* T, int* index, bool* exact) const; + +protected: + enum Flags { kMirror = 1, kReset = 2, kHasBlend = 4 }; + static float ComputeRelativeT(uint32_t time, uint32_t prevTime, uint32_t nextTime, + const float blend[4] = nullptr); + int16_t fFrameCount; + uint8_t fElemCount; + uint8_t fFlags; + float fRepeat; + struct SkTimeCode { + uint32_t fTime; + float fBlend[4]; + }; + SkTimeCode* fTimes; // pointer into fStorage + void* fStorage; +#ifdef SK_DEBUG + SkTimeCode (*fTimesArray)[10]; +#endif +}; + +class SkiaInterpolator : public SkiaInterpolatorBase { +public: + SkiaInterpolator(); + SkiaInterpolator(int elemCount, int frameCount); + + void reset(int elemCount, int frameCount); + + /** Add or replace a key frame, copying the values[] data into the + interpolator. + @param index The index of this frame (frames must be ordered by time) + @param time The millisecond time for this frame + @param values The array of values [elemCount] for this frame. The data + is copied into the interpolator. + @param blend A positive scalar specifying how to blend between this + and the next key frame. [0...1) is a cubic lag/log/lag + blend (slow to change at the beginning and end) + 1 is a linear blend (default) + */ + bool setKeyFrame(int index, uint32_t time, const float values[], + const float blend[4] = nullptr); + + /** Return the computed values given the specified time. Return whether + those values are the result of pinning to either the first + (kFreezeStart) or last (kFreezeEnd), or from interpolated the two + nearest key values (kNormal). + @param time The time to sample (in milliseconds) + @param (may be null) where to write the computed values. + */ + Result timeToValues(uint32_t time, float values[] = nullptr) const; + +private: + float* fValues; // pointer into fStorage + + using INHERITED = SkiaInterpolatorBase; +}; + +#endif diff --git a/libs/hwui/jni/Interpolator.cpp b/libs/hwui/jni/Interpolator.cpp index 146d634a297c..fc3d70b87f5a 100644 --- a/libs/hwui/jni/Interpolator.cpp +++ b/libs/hwui/jni/Interpolator.cpp @@ -1,26 +1,26 @@ #include "GraphicsJNI.h" -#include "SkInterpolator.h" +#include "SkiaInterpolator.h" static jlong Interpolator_constructor(JNIEnv* env, jobject clazz, jint valueCount, jint frameCount) { - return reinterpret_cast<jlong>(new SkInterpolator(valueCount, frameCount)); + return reinterpret_cast<jlong>(new SkiaInterpolator(valueCount, frameCount)); } static void Interpolator_destructor(JNIEnv* env, jobject clazz, jlong interpHandle) { - SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); + SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle); delete interp; } static void Interpolator_reset(JNIEnv* env, jobject clazz, jlong interpHandle, jint valueCount, jint frameCount) { - SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); + SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle); interp->reset(valueCount, frameCount); } static void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, jlong interpHandle, jint index, jint msec, jfloatArray valueArray, jfloatArray blendArray) { - SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); + SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle); AutoJavaFloatArray autoValues(env, valueArray); AutoJavaFloatArray autoBlend(env, blendArray, 4); @@ -36,7 +36,7 @@ static void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, jlong interpHan static void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, jlong interpHandle, jfloat repeatCount, jboolean mirror) { - SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); + SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle); if (repeatCount > 32000) repeatCount = 32000; @@ -46,8 +46,8 @@ static void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, jlong inter static jint Interpolator_timeToValues(JNIEnv* env, jobject clazz, jlong interpHandle, jint msec, jfloatArray valueArray) { - SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); - SkInterpolatorBase::Result result; + SkiaInterpolator* interp = reinterpret_cast<SkiaInterpolator*>(interpHandle); + SkiaInterpolator::Result result; float* values = valueArray ? env->GetFloatArrayElements(valueArray, NULL) : NULL; result = interp->timeToValues(msec, (SkScalar*)values); diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index f24ba5c1c878..bd1da985a33e 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -34,14 +34,18 @@ #include <renderthread/RenderProxy.h> #include <renderthread/RenderTask.h> #include <renderthread/RenderThread.h> +#include <thread/CommonPool.h> #include <utils/Color.h> #include <utils/RefBase.h> #include <utils/StrongPointer.h> #include <utils/Timers.h> #include <utils/TraceUtils.h> +#include <pthread.h> + #include <algorithm> #include <atomic> +#include <vector> #include "android_graphics_HardwareRendererObserver.h" @@ -53,6 +57,10 @@ using namespace android::uirenderer::renderthread; struct { jclass clazz; jmethodID invokePictureCapturedCallback; + jmethodID createHintSession; + jmethodID updateTargetWorkDuration; + jmethodID reportActualWorkDuration; + jmethodID closeHintSession; } gHardwareRenderer; struct { @@ -71,6 +79,14 @@ static JNIEnv* getenv(JavaVM* vm) { return env; } +static bool hasExceptionAndClear(JNIEnv* env) { + if (GraphicsJNI::hasException(env)) { + env->ExceptionClear(); + return true; + } + return false; +} + typedef ANativeWindow* (*ANW_fromSurface)(JNIEnv* env, jobject surface); ANW_fromSurface fromSurface; @@ -120,6 +136,67 @@ private: } }; +class HintSessionWrapper : public LightRefBase<HintSessionWrapper> { +public: + static sp<HintSessionWrapper> create(JNIEnv* env, RenderProxy* proxy) { + if (!Properties::useHintManager) return nullptr; + + // Include UI thread (self), render thread, and thread pool. + std::vector<int> tids = CommonPool::getThreadIds(); + tids.push_back(proxy->getRenderThreadTid()); + tids.push_back(pthread_gettid_np(pthread_self())); + + jintArray tidsArray = env->NewIntArray(tids.size()); + if (hasExceptionAndClear(env)) return nullptr; + env->SetIntArrayRegion(tidsArray, 0, tids.size(), reinterpret_cast<jint*>(tids.data())); + if (hasExceptionAndClear(env)) return nullptr; + jobject session = env->CallStaticObjectMethod( + gHardwareRenderer.clazz, gHardwareRenderer.createHintSession, tidsArray); + if (hasExceptionAndClear(env) || !session) return nullptr; + return new HintSessionWrapper(env, session); + } + + ~HintSessionWrapper() { + if (!mSession) return; + JNIEnv* env = getenv(mVm); + env->CallStaticVoidMethod(gHardwareRenderer.clazz, gHardwareRenderer.closeHintSession, + mSession); + hasExceptionAndClear(env); + env->DeleteGlobalRef(mSession); + mSession = nullptr; + } + + void updateTargetWorkDuration(long targetDurationNanos) { + if (!mSession) return; + JNIEnv* env = getenv(mVm); + env->CallStaticVoidMethod(gHardwareRenderer.clazz, + gHardwareRenderer.updateTargetWorkDuration, mSession, + static_cast<jlong>(targetDurationNanos)); + hasExceptionAndClear(env); + } + + void reportActualWorkDuration(long actualDurationNanos) { + if (!mSession) return; + JNIEnv* env = getenv(mVm); + env->CallStaticVoidMethod(gHardwareRenderer.clazz, + gHardwareRenderer.reportActualWorkDuration, mSession, + static_cast<jlong>(actualDurationNanos)); + hasExceptionAndClear(env); + } + +private: + HintSessionWrapper(JNIEnv* env, jobject jobject) { + env->GetJavaVM(&mVm); + if (jobject) { + mSession = env->NewGlobalRef(jobject); + LOG_ALWAYS_FATAL_IF(!mSession, "Failed to make global ref"); + } + } + + JavaVM* mVm = nullptr; + jobject mSession = nullptr; +}; + static void android_view_ThreadedRenderer_rotateProcessStatsBuffer(JNIEnv* env, jobject clazz) { RenderProxy::rotateProcessStatsBuffer(); } @@ -147,6 +224,12 @@ static jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject claz RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr); ContextFactoryImpl factory(rootRenderNode); RenderProxy* proxy = new RenderProxy(translucent, rootRenderNode, &factory); + sp<HintSessionWrapper> wrapper = HintSessionWrapper::create(env, proxy); + if (wrapper) { + proxy->setHintSessionCallbacks( + [wrapper](int64_t nanos) { wrapper->updateTargetWorkDuration(nanos); }, + [wrapper](int64_t nanos) { wrapper->reportActualWorkDuration(nanos); }); + } return (jlong) proxy; } @@ -769,6 +852,18 @@ int register_android_view_ThreadedRenderer(JNIEnv* env) { gHardwareRenderer.invokePictureCapturedCallback = GetStaticMethodIDOrDie(env, hardwareRenderer, "invokePictureCapturedCallback", "(JLandroid/graphics/HardwareRenderer$PictureCapturedCallback;)V"); + gHardwareRenderer.createHintSession = + GetStaticMethodIDOrDie(env, hardwareRenderer, "createHintSession", + "([I)Landroid/os/PerformanceHintManager$Session;"); + gHardwareRenderer.updateTargetWorkDuration = + GetStaticMethodIDOrDie(env, hardwareRenderer, "updateTargetWorkDuration", + "(Landroid/os/PerformanceHintManager$Session;J)V"); + gHardwareRenderer.reportActualWorkDuration = + GetStaticMethodIDOrDie(env, hardwareRenderer, "reportActualWorkDuration", + "(Landroid/os/PerformanceHintManager$Session;J)V"); + gHardwareRenderer.closeHintSession = + GetStaticMethodIDOrDie(env, hardwareRenderer, "closeHintSession", + "(Landroid/os/PerformanceHintManager$Session;)V"); jclass frameCallbackClass = FindClassOrDie(env, "android/graphics/HardwareRenderer$FrameDrawingCallback"); diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp index 1bd943f4c21d..30a3fc5ac93f 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp @@ -43,8 +43,7 @@ namespace android { namespace uirenderer { namespace skiapipeline { -SkiaVulkanPipeline::SkiaVulkanPipeline(renderthread::RenderThread& thread) - : SkiaPipeline(thread), mVkManager(thread.vulkanManager()) { +SkiaVulkanPipeline::SkiaVulkanPipeline(renderthread::RenderThread& thread) : SkiaPipeline(thread) { thread.renderState().registerContextCallback(this); } @@ -52,13 +51,17 @@ SkiaVulkanPipeline::~SkiaVulkanPipeline() { mRenderThread.renderState().removeContextCallback(this); } +VulkanManager& SkiaVulkanPipeline::vulkanManager() { + return mRenderThread.vulkanManager(); +} + MakeCurrentResult SkiaVulkanPipeline::makeCurrent() { return MakeCurrentResult::AlreadyCurrent; } Frame SkiaVulkanPipeline::getFrame() { LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr, "getFrame() called on a context with no surface!"); - return mVkManager.dequeueNextBuffer(mVkSurface); + return vulkanManager().dequeueNextBuffer(mVkSurface); } bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, @@ -85,7 +88,7 @@ bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, con { ATRACE_NAME("flush commands"); - mVkManager.finishFrame(backBuffer.get()); + vulkanManager().finishFrame(backBuffer.get()); } layerUpdateQueue->clear(); @@ -106,7 +109,7 @@ bool SkiaVulkanPipeline::swapBuffers(const Frame& frame, bool drew, const SkRect currentFrameInfo->markSwapBuffers(); if (*requireSwap) { - mVkManager.swapBuffers(mVkSurface, screenDirty); + vulkanManager().swapBuffers(mVkSurface, screenDirty); } return *requireSwap; @@ -122,15 +125,15 @@ void SkiaVulkanPipeline::onStop() {} bool SkiaVulkanPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBehavior) { if (mVkSurface) { - mVkManager.destroySurface(mVkSurface); + vulkanManager().destroySurface(mVkSurface); mVkSurface = nullptr; } if (surface) { mRenderThread.requireVkContext(); mVkSurface = - mVkManager.createSurface(surface, mColorMode, mSurfaceColorSpace, mSurfaceColorType, - mRenderThread.getGrContext(), 0); + vulkanManager().createSurface(surface, mColorMode, mSurfaceColorSpace, + mSurfaceColorType, mRenderThread.getGrContext(), 0); } return mVkSurface != nullptr; @@ -141,7 +144,7 @@ bool SkiaVulkanPipeline::isSurfaceReady() { } bool SkiaVulkanPipeline::isContextReady() { - return CC_LIKELY(mVkManager.hasVkContext()); + return CC_LIKELY(vulkanManager().hasVkContext()); } void SkiaVulkanPipeline::invokeFunctor(const RenderThread& thread, Functor* functor) { @@ -156,7 +159,7 @@ sk_sp<Bitmap> SkiaVulkanPipeline::allocateHardwareBitmap(renderthread::RenderThr void SkiaVulkanPipeline::onContextDestroyed() { if (mVkSurface) { - mVkManager.destroySurface(mVkSurface); + vulkanManager().destroySurface(mVkSurface); mVkSurface = nullptr; } } diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h index 6268daa6213f..56d42e013f31 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h @@ -55,7 +55,8 @@ protected: void onContextDestroyed() override; private: - renderthread::VulkanManager& mVkManager; + renderthread::VulkanManager& vulkanManager(); + renderthread::VulkanSurface* mVkSurface = nullptr; }; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 800c58095041..aedb5c28dc3e 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -452,6 +452,12 @@ void CanvasContext::notifyFramePending() { } void CanvasContext::draw() { + if (auto grContext = getGrContext()) { + if (grContext->abandoned()) { + LOG_ALWAYS_FATAL("GrContext is abandoned/device lost at start of CanvasContext::draw"); + return; + } + } SkRect dirty; mDamageAccumulator.finish(&dirty); diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 3408ffda3f9d..7a38a3bc9c05 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -21,6 +21,7 @@ #include "../DeferredLayerUpdater.h" #include "../DisplayList.h" +#include "../Properties.h" #include "../RenderNode.h" #include "CanvasContext.h" #include "RenderThread.h" @@ -44,6 +45,12 @@ void DrawFrameTask::setContext(RenderThread* thread, CanvasContext* context, mTargetNode = targetNode; } +void DrawFrameTask::setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration, + std::function<void(int64_t)> reportActualWorkDuration) { + mUpdateTargetWorkDuration = std::move(updateTargetWorkDuration); + mReportActualWorkDuration = std::move(reportActualWorkDuration); +} + void DrawFrameTask::pushLayerUpdate(DeferredLayerUpdater* layer) { LOG_ALWAYS_FATAL_IF(!mContext, "Lifecycle violation, there's no context to pushLayerUpdate with!"); @@ -102,6 +109,9 @@ void DrawFrameTask::run() { CanvasContext* context = mContext; std::function<void(int64_t)> callback = std::move(mFrameCallback); mFrameCallback = nullptr; + int64_t intendedVsync = mFrameInfo[static_cast<int>(FrameInfoIndex::IntendedVsync)]; + int64_t frameDeadline = mFrameInfo[static_cast<int>(FrameInfoIndex::FrameDeadline)]; + int64_t frameStartTime = mFrameInfo[static_cast<int>(FrameInfoIndex::FrameStartTime)]; // From this point on anything in "this" is *UNSAFE TO ACCESS* if (canUnblockUiThread) { @@ -124,6 +134,25 @@ void DrawFrameTask::run() { if (!canUnblockUiThread) { unblockUiThread(); } + + // These member callbacks are effectively const as they are set once during init, so it's safe + // to use these directly instead of making local copies. + if (mUpdateTargetWorkDuration && mReportActualWorkDuration) { + constexpr int64_t kSanityCheckLowerBound = 100000; // 0.1ms + constexpr int64_t kSanityCheckUpperBound = 10000000000; // 10s + int64_t targetWorkDuration = frameDeadline - intendedVsync; + targetWorkDuration = targetWorkDuration * Properties::targetCpuTimePercentage / 100; + if (targetWorkDuration > kSanityCheckLowerBound && + targetWorkDuration < kSanityCheckUpperBound && + targetWorkDuration != mLastTargetWorkDuration) { + mLastTargetWorkDuration = targetWorkDuration; + mUpdateTargetWorkDuration(targetWorkDuration); + } + int64_t frameDuration = systemTime(SYSTEM_TIME_MONOTONIC) - frameStartTime; + if (frameDuration > kSanityCheckLowerBound && frameDuration < kSanityCheckUpperBound) { + mReportActualWorkDuration(frameDuration); + } + } } bool DrawFrameTask::syncFrameState(TreeInfo& info) { diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h index 696cfaef3cd7..3bb574aff59b 100644 --- a/libs/hwui/renderthread/DrawFrameTask.h +++ b/libs/hwui/renderthread/DrawFrameTask.h @@ -61,6 +61,8 @@ public: virtual ~DrawFrameTask(); void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode); + void setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration, + std::function<void(int64_t)> reportActualWorkDuration); void setContentDrawBounds(int left, int top, int right, int bottom) { mContentDrawBounds.set(left, top, right, bottom); } @@ -107,6 +109,10 @@ private: std::function<void(int64_t)> mFrameCallback; std::function<void(int64_t)> mFrameCompleteCallback; + + nsecs_t mLastTargetWorkDuration = 0; + std::function<void(int64_t)> mUpdateTargetWorkDuration; + std::function<void(int64_t)> mReportActualWorkDuration; }; } /* namespace renderthread */ diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 423cc08189ca..9361abd20852 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -76,6 +76,12 @@ void RenderProxy::setName(const char* name) { mRenderThread.queue().runSync([this, name]() { mContext->setName(std::string(name)); }); } +void RenderProxy::setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration, + std::function<void(int64_t)> reportActualWorkDuration) { + mDrawFrameTask.setHintSessionCallbacks(std::move(updateTargetWorkDuration), + std::move(reportActualWorkDuration)); +} + void RenderProxy::setSurface(ANativeWindow* window, bool enableTimeout) { if (window) { ANativeWindow_acquire(window); } mRenderThread.queue().post([this, win = window, enableTimeout]() mutable { diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 366d6b5a172c..8d55d3c55570 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -71,6 +71,8 @@ public: void setSwapBehavior(SwapBehavior swapBehavior); bool loadSystemProperties(); void setName(const char* name); + void setHintSessionCallbacks(std::function<void(int64_t)> updateTargetWorkDuration, + std::function<void(int64_t)> reportActualWorkDuration); void setSurface(ANativeWindow* window, bool enableTimeout = true); void setSurfaceControl(ASurfaceControl* surfaceControl); diff --git a/libs/hwui/thread/CommonPool.cpp b/libs/hwui/thread/CommonPool.cpp index d011bdfe945e..dc92f9f0d39a 100644 --- a/libs/hwui/thread/CommonPool.cpp +++ b/libs/hwui/thread/CommonPool.cpp @@ -29,14 +29,23 @@ CommonPool::CommonPool() { ATRACE_CALL(); CommonPool* pool = this; + std::mutex mLock; + std::vector<int> tids(THREAD_COUNT); + std::vector<std::condition_variable> tidConditionVars(THREAD_COUNT); + // Create 2 workers for (int i = 0; i < THREAD_COUNT; i++) { - std::thread worker([pool, i] { + std::thread worker([pool, i, &mLock, &tids, &tidConditionVars] { { std::array<char, 20> name{"hwuiTask"}; snprintf(name.data(), name.size(), "hwuiTask%d", i); auto self = pthread_self(); pthread_setname_np(self, name.data()); + { + std::unique_lock lock(mLock); + tids[i] = pthread_gettid_np(self); + tidConditionVars[i].notify_one(); + } setpriority(PRIO_PROCESS, 0, PRIORITY_FOREGROUND); auto startHook = renderthread::RenderThread::getOnStartHook(); if (startHook) { @@ -47,6 +56,15 @@ CommonPool::CommonPool() { }); worker.detach(); } + { + std::unique_lock lock(mLock); + for (int i = 0; i < THREAD_COUNT; i++) { + while (!tids[i]) { + tidConditionVars[i].wait(lock); + } + } + } + mWorkerThreadIds = std::move(tids); } CommonPool& CommonPool::instance() { @@ -58,6 +76,10 @@ void CommonPool::post(Task&& task) { instance().enqueue(std::move(task)); } +std::vector<int> CommonPool::getThreadIds() { + return instance().mWorkerThreadIds; +} + void CommonPool::enqueue(Task&& task) { std::unique_lock lock(mLock); while (!mWorkQueue.hasSpace()) { @@ -104,4 +126,4 @@ void CommonPool::doWaitForIdle() { } } // namespace uirenderer -} // namespace android
\ No newline at end of file +} // namespace android diff --git a/libs/hwui/thread/CommonPool.h b/libs/hwui/thread/CommonPool.h index 7603eeef4692..74f852bd1413 100644 --- a/libs/hwui/thread/CommonPool.h +++ b/libs/hwui/thread/CommonPool.h @@ -25,6 +25,7 @@ #include <functional> #include <future> #include <mutex> +#include <vector> namespace android { namespace uirenderer { @@ -97,6 +98,8 @@ public: return task.get_future().get(); }; + static std::vector<int> getThreadIds(); + // For testing purposes only, blocks until all worker threads are parked. static void waitForIdle(); @@ -111,6 +114,8 @@ private: void workerLoop(); + std::vector<int> mWorkerThreadIds; + std::mutex mLock; std::condition_variable mCondition; int mWaitingThreads = 0; |