summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/WindowManager/Shell/lint-baseline.xml5471
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java45
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java18
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java20
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java23
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java296
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java423
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java36
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java12
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java25
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java80
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java342
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java32
-rw-r--r--libs/hwui/Android.bp1
-rw-r--r--libs/hwui/FrameInfo.cpp29
-rw-r--r--libs/hwui/FrameInfo.h3
-rw-r--r--libs/hwui/Properties.cpp7
-rw-r--r--libs/hwui/Properties.h17
-rw-r--r--libs/hwui/SkiaInterpolator.cpp273
-rw-r--r--libs/hwui/SkiaInterpolator.h119
-rw-r--r--libs/hwui/jni/Interpolator.cpp16
-rw-r--r--libs/hwui/jni/android_graphics_HardwareRenderer.cpp95
-rw-r--r--libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp23
-rw-r--r--libs/hwui/pipeline/skia/SkiaVulkanPipeline.h3
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp6
-rw-r--r--libs/hwui/renderthread/DrawFrameTask.cpp29
-rw-r--r--libs/hwui/renderthread/DrawFrameTask.h6
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp6
-rw-r--r--libs/hwui/renderthread/RenderProxy.h2
-rw-r--r--libs/hwui/thread/CommonPool.cpp26
-rw-r--r--libs/hwui/thread/CommonPool.h5
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(&quot;Unknown task=&quot; + 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(&quot;Unknown task=&quot; + 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 + &quot;1 taskId=&quot; + 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 + &quot;2 taskId=&quot; + 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 &amp;&amp; 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=" &amp;&amp; !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 &amp;&amp; !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=" &amp;&amp; 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=" + &quot; bounds: &quot; + 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 &amp; 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 &amp; 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(&quot;Task appeared more than once: #&quot; + 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, &quot;Task already vanished: #&quot; + 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(&quot;Primary Divider Dim&quot;)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/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(&quot;Secondary Divider Dim&quot;)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/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 + &quot;mPrimary.taskId=&quot; + 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 + &quot;mSecondary.taskId=&quot; + 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=" &amp;&amp; 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(&quot;one-handed-background-panel&quot;)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/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 &amp;&amp; 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(&quot;SizeCompatUILeash&quot;)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/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=" &amp;&amp; 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=" &amp;&amp; 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, &quot; split is active so using split&quot; + &quot;Transition to handle request. triggerTask=%d type=%s mainChildren=%d&quot; + &quot; sideChildren=%d&quot;, 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=" + &quot; with &quot; + taskInfo.taskId + &quot; before startAnimation().&quot;);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/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=" + &quot; with &quot; + taskInfo.taskId + &quot; before startAnimation().&quot;);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/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=" + &quot; to have been called with &quot; + 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=" + &quot; to have been called with &quot; + 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) + &quot; task= &quot; + 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, &quot;isSnapshotCompatible no snapshot &quot; + 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(&quot;SystemWindowLeash&quot;)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/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(&quot;SysUiWIndowManager#attachToParentSurface&quot;).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 + &quot; - task-snapshot-surface&quot;)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="out/.intermediates/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(&quot;release&quot;);"
+ errorLine2=" ~~~~">
+ <location
+ file="out/.intermediates/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 &quot;TaskView&quot; + &quot;:&quot; + (mTaskInfo != null ? mTaskInfo.taskId : &quot;null&quot;);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="out/.intermediates/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 &amp;&amp; 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=&quot;?android:attr/dialogCornerRadius&quot;"
+ 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=&quot;?android:attr/dialogCornerRadius&quot;"
+ 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=&quot;?android:attr/dialogCornerRadius&quot;"
+ 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=&quot;?android:attr/dialogCornerRadius&quot;"
+ 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;