Loading packages/SystemUI/res/layout/screenshot.xmldeleted 100644 → 0 +0 −40 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2011 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. --> <com.android.systemui.screenshot.ScreenshotView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screenshot_frame" android:theme="@style/FloatingOverlay" android:layout_width="match_parent" android:layout_height="match_parent" android:importantForAccessibility="no"> <ImageView android:id="@+id/screenshot_scrolling_scrim" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:clickable="true" android:importantForAccessibility="no"/> <ImageView android:id="@+id/screenshot_flash" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:elevation="7dp" android:src="@android:color/white"/> <include layout="@layout/screenshot_static" android:id="@+id/screenshot_static"/> </com.android.systemui.screenshot.ScreenshotView> packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotViewProxy.ktdeleted 100644 → 0 +0 −242 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.systemui.screenshot import android.animation.Animator import android.app.Notification import android.content.Context import android.graphics.Bitmap import android.graphics.Rect import android.util.Log import android.view.KeyEvent import android.view.LayoutInflater import android.view.ScrollCaptureResponse import android.view.View import android.view.ViewTreeObserver import android.view.WindowInsets import android.window.OnBackInvokedCallback import android.window.OnBackInvokedDispatcher import androidx.appcompat.content.res.AppCompatResources import com.android.internal.logging.UiEventLogger import com.android.systemui.flags.FeatureFlags import com.android.systemui.res.R import com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER import com.android.systemui.screenshot.scroll.ScrollCaptureController import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject /** * Legacy implementation of screenshot view methods. Just proxies the calls down into the original * ScreenshotView. */ class LegacyScreenshotViewProxy @AssistedInject constructor( private val logger: UiEventLogger, flags: FeatureFlags, @Assisted private val context: Context, @Assisted private val displayId: Int ) : ScreenshotViewProxy { override val view: ScreenshotView = LayoutInflater.from(context).inflate(R.layout.screenshot, null) as ScreenshotView override val screenshotPreview: View override var packageName: String = "" set(value) { field = value view.setPackageName(value) } override var callbacks: ScreenshotView.ScreenshotViewCallback? = null set(value) { field = value view.setCallbacks(value) } override var screenshot: ScreenshotData? = null set(value) { field = value value?.let { val badgeBg = AppCompatResources.getDrawable(context, R.drawable.overlay_badge_background) val user = it.userHandle if (badgeBg != null && user != null) { view.badgeScreenshot(context.packageManager.getUserBadgedIcon(badgeBg, user)) } view.setScreenshot(it) } } override val isAttachedToWindow get() = view.isAttachedToWindow override val isDismissing get() = view.isDismissing override val isPendingSharedTransition get() = view.isPendingSharedTransition init { view.setUiEventLogger(logger) view.setDefaultDisplay(displayId) view.setFlags(flags) addPredictiveBackListener { requestDismissal(SCREENSHOT_DISMISSED_OTHER) } setOnKeyListener { requestDismissal(SCREENSHOT_DISMISSED_OTHER) } if (LogConfig.DEBUG_WINDOW) { Log.d(TAG, "adding OnComputeInternalInsetsListener") } view.viewTreeObserver.addOnComputeInternalInsetsListener(view) screenshotPreview = view.screenshotPreview } override fun reset() = view.reset() override fun updateInsets(insets: WindowInsets) = view.updateInsets(insets) override fun updateOrientation(insets: WindowInsets) = view.updateOrientation(insets) override fun createScreenshotDropInAnimation(screenRect: Rect, showFlash: Boolean): Animator = view.createScreenshotDropInAnimation(screenRect, showFlash) override fun addQuickShareChip(quickShareAction: Notification.Action) = view.addQuickShareChip(quickShareAction) override fun setChipIntents(imageData: ScreenshotController.SavedImageData) = view.setChipIntents(imageData) override fun requestDismissal(event: ScreenshotEvent?) { if (DEBUG_DISMISS) { Log.d(TAG, "screenshot dismissal requested") } // If we're already animating out, don't restart the animation if (view.isDismissing) { if (DEBUG_DISMISS) { Log.v(TAG, "Already dismissing, ignoring duplicate command $event") } return } event?.let { logger.log(event, 0, packageName) } view.animateDismissal() } override fun showScrollChip(packageName: String, onClick: Runnable) = view.showScrollChip(packageName, onClick) override fun hideScrollChip() = view.hideScrollChip() override fun prepareScrollingTransition( response: ScrollCaptureResponse, screenBitmap: Bitmap, newScreenshot: Bitmap, screenshotTakenInPortrait: Boolean, onTransitionPrepared: Runnable, ) { view.prepareScrollingTransition( response, screenBitmap, newScreenshot, screenshotTakenInPortrait ) view.post { onTransitionPrepared.run() } } override fun startLongScreenshotTransition( transitionDestination: Rect, onTransitionEnd: Runnable, longScreenshot: ScrollCaptureController.LongScreenshot ) = view.startLongScreenshotTransition(transitionDestination, onTransitionEnd, longScreenshot) override fun restoreNonScrollingUi() = view.restoreNonScrollingUi() override fun fadeForSharedTransition() {} // unused override fun stopInputListening() = view.stopInputListening() override fun requestFocus() { view.requestFocus() } override fun announceForAccessibility(string: String) = view.announceForAccessibility(string) override fun prepareEntranceAnimation(runnable: Runnable) { view.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { if (LogConfig.DEBUG_WINDOW) { Log.d(TAG, "onPreDraw: startAnimation") } view.viewTreeObserver.removeOnPreDrawListener(this) runnable.run() return true } } ) } private fun addPredictiveBackListener(onDismissRequested: (ScreenshotEvent) -> Unit) { val onBackInvokedCallback = OnBackInvokedCallback { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "Predictive Back callback dispatched") } onDismissRequested.invoke(SCREENSHOT_DISMISSED_OTHER) } view.addOnAttachStateChangeListener( object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View) { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "Registering Predictive Back callback") } view .findOnBackInvokedDispatcher() ?.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, onBackInvokedCallback ) } override fun onViewDetachedFromWindow(view: View) { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "Unregistering Predictive Back callback") } view .findOnBackInvokedDispatcher() ?.unregisterOnBackInvokedCallback(onBackInvokedCallback) } } ) } private fun setOnKeyListener(onDismissRequested: (ScreenshotEvent) -> Unit) { view.setOnKeyListener( object : View.OnKeyListener { override fun onKey(view: View, keyCode: Int, event: KeyEvent): Boolean { if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE) { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "onKeyEvent: $keyCode") } onDismissRequested.invoke(SCREENSHOT_DISMISSED_OTHER) return true } return false } } ) } @AssistedFactory interface Factory : ScreenshotViewProxy.Factory { override fun getProxy(context: Context, displayId: Int): LegacyScreenshotViewProxy } companion object { private const val TAG = "LegacyScreenshotViewProxy" } } packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt +5 −1 Original line number Diff line number Diff line Loading @@ -137,7 +137,7 @@ constructor( val offset = container.height + params.topMargin + params.bottomMargin val anim = if (animateIn) ValueAnimator.ofFloat(0f, 1f) else ValueAnimator.ofFloat(1f, 0f) with(anim) { duration = ScreenshotView.SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS duration = MESSAGE_EXPANSION_DURATION_MS interpolator = AccelerateDecelerateInterpolator() addUpdateListener { valueAnimator: ValueAnimator -> val interpolation = valueAnimator.animatedValue as Float Loading @@ -147,4 +147,8 @@ constructor( } return anim } companion object { const val MESSAGE_EXPANSION_DURATION_MS: Long = 400 } } packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +1 −67 Original line number Diff line number Diff line Loading @@ -477,9 +477,6 @@ public class ScreenshotController implements ScreenshotHandler { } mViewProxy.setPackageName(mPackageName); mViewProxy.updateOrientation( mWindowManager.getCurrentWindowMetrics().getWindowInsets()); } /** Loading Loading @@ -528,7 +525,7 @@ public class ScreenshotController implements ScreenshotHandler { } mMessageContainerController.setView(mViewProxy.getView()); mViewProxy.setCallbacks(new ScreenshotView.ScreenshotViewCallback() { mViewProxy.setCallbacks(new ScreenshotShelfViewProxy.ScreenshotViewCallback() { @Override public void onUserInteraction() { if (DEBUG_INPUT) { Loading @@ -537,13 +534,6 @@ public class ScreenshotController implements ScreenshotHandler { mScreenshotHandler.resetTimeout(); } @Override public void onAction(Intent intent, UserHandle owner, boolean overrideTransition) { Pair<ActivityOptions, ExitTransitionCoordinator> exit = createWindowTransition(); mActionIntentExecutor.launchIntentAsync( intent, owner, overrideTransition, exit.first, exit.second); } @Override public void onDismiss() { finishDismiss(); Loading Loading @@ -871,62 +861,6 @@ public class ScreenshotController implements ScreenshotHandler { mSaveInBgTask.execute(); } /** * Sets up the action shade and its entrance animation, once we get the screenshot URI. */ private void showUiOnActionsReady(ScreenshotController.SavedImageData imageData) { logSuccessOnActionsReady(imageData); mScreenshotHandler.resetTimeout(); if (imageData.uri != null) { if (DEBUG_UI) { Log.d(TAG, "Showing UI actions"); } if (!imageData.owner.equals(Process.myUserHandle())) { Log.d(TAG, "Screenshot saved to user " + imageData.owner + " as " + imageData.uri); } mScreenshotHandler.post(() -> { if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) { mScreenshotAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mViewProxy.setChipIntents(imageData); } }); } else { mViewProxy.setChipIntents(imageData); } }); } } /** * Sets up the action shade and its entrance animation, once we get the Quick Share action data. */ private void showUiOnQuickShareActionReady(ScreenshotController.QuickShareData quickShareData) { if (DEBUG_UI) { Log.d(TAG, "Showing UI for Quick Share action"); } if (quickShareData.quickShareAction != null) { mScreenshotHandler.post(() -> { if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) { mScreenshotAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mViewProxy.addQuickShareChip(quickShareData.quickShareAction); } }); } else { mViewProxy.addQuickShareChip(quickShareData.quickShareAction); } }); } } /** * Logs success/failure of the screenshot saving task, and shows an error if it failed. */ Loading packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt +14 −12 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.systemui.screenshot import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.app.Notification import android.content.Context import android.graphics.Bitmap import android.graphics.Rect Loading @@ -45,7 +44,6 @@ import com.android.systemui.res.R import com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS import com.android.systemui.screenshot.LogConfig.DEBUG_INPUT import com.android.systemui.screenshot.LogConfig.DEBUG_WINDOW import com.android.systemui.screenshot.ScreenshotController.SavedImageData import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER import com.android.systemui.screenshot.scroll.ScrollCaptureController import com.android.systemui.screenshot.ui.ScreenshotAnimationController Loading @@ -71,11 +69,21 @@ constructor( @Assisted private val context: Context, @Assisted private val displayId: Int ) : ScreenshotViewProxy { interface ScreenshotViewCallback { fun onUserInteraction() fun onDismiss() /** DOWN motion event was observed outside of the touchable areas of this view. */ fun onTouchOutside() } override val view: ScreenshotShelfView = LayoutInflater.from(context).inflate(R.layout.screenshot_shelf, null) as ScreenshotShelfView override val screenshotPreview: View override var packageName: String = "" override var callbacks: ScreenshotView.ScreenshotViewCallback? = null override var callbacks: ScreenshotViewCallback? = null override var screenshot: ScreenshotData? = null set(value) { value?.let { Loading @@ -94,6 +102,7 @@ constructor( override val isAttachedToWindow get() = view.isAttachedToWindow override var isDismissing = false override var isPendingSharedTransition = false Loading Loading @@ -141,10 +150,10 @@ constructor( isPendingSharedTransition = false viewModel.reset() } override fun updateInsets(insets: WindowInsets) { view.updateInsets(insets) } override fun updateOrientation(insets: WindowInsets) {} override fun createScreenshotDropInAnimation(screenRect: Rect, showFlash: Boolean): Animator { val entrance = Loading @@ -164,10 +173,6 @@ constructor( return entrance } override fun addQuickShareChip(quickShareAction: Notification.Action) {} override fun setChipIntents(imageData: SavedImageData) {} override fun requestDismissal(event: ScreenshotEvent?) { requestDismissal(event, null) } Loading @@ -187,6 +192,7 @@ constructor( override fun onAnimationStart(animator: Animator) { isDismissing = true } override fun onAnimationEnd(animator: Animator) { isDismissing = false callbacks?.onDismiss() Loading @@ -196,10 +202,6 @@ constructor( animator.start() } override fun showScrollChip(packageName: String, onClick: Runnable) {} override fun hideScrollChip() {} override fun prepareScrollingTransition( response: ScrollCaptureResponse, screenBitmap: Bitmap, // unused Loading Loading
packages/SystemUI/res/layout/screenshot.xmldeleted 100644 → 0 +0 −40 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2011 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. --> <com.android.systemui.screenshot.ScreenshotView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screenshot_frame" android:theme="@style/FloatingOverlay" android:layout_width="match_parent" android:layout_height="match_parent" android:importantForAccessibility="no"> <ImageView android:id="@+id/screenshot_scrolling_scrim" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:clickable="true" android:importantForAccessibility="no"/> <ImageView android:id="@+id/screenshot_flash" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:elevation="7dp" android:src="@android:color/white"/> <include layout="@layout/screenshot_static" android:id="@+id/screenshot_static"/> </com.android.systemui.screenshot.ScreenshotView>
packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotViewProxy.ktdeleted 100644 → 0 +0 −242 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.systemui.screenshot import android.animation.Animator import android.app.Notification import android.content.Context import android.graphics.Bitmap import android.graphics.Rect import android.util.Log import android.view.KeyEvent import android.view.LayoutInflater import android.view.ScrollCaptureResponse import android.view.View import android.view.ViewTreeObserver import android.view.WindowInsets import android.window.OnBackInvokedCallback import android.window.OnBackInvokedDispatcher import androidx.appcompat.content.res.AppCompatResources import com.android.internal.logging.UiEventLogger import com.android.systemui.flags.FeatureFlags import com.android.systemui.res.R import com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER import com.android.systemui.screenshot.scroll.ScrollCaptureController import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject /** * Legacy implementation of screenshot view methods. Just proxies the calls down into the original * ScreenshotView. */ class LegacyScreenshotViewProxy @AssistedInject constructor( private val logger: UiEventLogger, flags: FeatureFlags, @Assisted private val context: Context, @Assisted private val displayId: Int ) : ScreenshotViewProxy { override val view: ScreenshotView = LayoutInflater.from(context).inflate(R.layout.screenshot, null) as ScreenshotView override val screenshotPreview: View override var packageName: String = "" set(value) { field = value view.setPackageName(value) } override var callbacks: ScreenshotView.ScreenshotViewCallback? = null set(value) { field = value view.setCallbacks(value) } override var screenshot: ScreenshotData? = null set(value) { field = value value?.let { val badgeBg = AppCompatResources.getDrawable(context, R.drawable.overlay_badge_background) val user = it.userHandle if (badgeBg != null && user != null) { view.badgeScreenshot(context.packageManager.getUserBadgedIcon(badgeBg, user)) } view.setScreenshot(it) } } override val isAttachedToWindow get() = view.isAttachedToWindow override val isDismissing get() = view.isDismissing override val isPendingSharedTransition get() = view.isPendingSharedTransition init { view.setUiEventLogger(logger) view.setDefaultDisplay(displayId) view.setFlags(flags) addPredictiveBackListener { requestDismissal(SCREENSHOT_DISMISSED_OTHER) } setOnKeyListener { requestDismissal(SCREENSHOT_DISMISSED_OTHER) } if (LogConfig.DEBUG_WINDOW) { Log.d(TAG, "adding OnComputeInternalInsetsListener") } view.viewTreeObserver.addOnComputeInternalInsetsListener(view) screenshotPreview = view.screenshotPreview } override fun reset() = view.reset() override fun updateInsets(insets: WindowInsets) = view.updateInsets(insets) override fun updateOrientation(insets: WindowInsets) = view.updateOrientation(insets) override fun createScreenshotDropInAnimation(screenRect: Rect, showFlash: Boolean): Animator = view.createScreenshotDropInAnimation(screenRect, showFlash) override fun addQuickShareChip(quickShareAction: Notification.Action) = view.addQuickShareChip(quickShareAction) override fun setChipIntents(imageData: ScreenshotController.SavedImageData) = view.setChipIntents(imageData) override fun requestDismissal(event: ScreenshotEvent?) { if (DEBUG_DISMISS) { Log.d(TAG, "screenshot dismissal requested") } // If we're already animating out, don't restart the animation if (view.isDismissing) { if (DEBUG_DISMISS) { Log.v(TAG, "Already dismissing, ignoring duplicate command $event") } return } event?.let { logger.log(event, 0, packageName) } view.animateDismissal() } override fun showScrollChip(packageName: String, onClick: Runnable) = view.showScrollChip(packageName, onClick) override fun hideScrollChip() = view.hideScrollChip() override fun prepareScrollingTransition( response: ScrollCaptureResponse, screenBitmap: Bitmap, newScreenshot: Bitmap, screenshotTakenInPortrait: Boolean, onTransitionPrepared: Runnable, ) { view.prepareScrollingTransition( response, screenBitmap, newScreenshot, screenshotTakenInPortrait ) view.post { onTransitionPrepared.run() } } override fun startLongScreenshotTransition( transitionDestination: Rect, onTransitionEnd: Runnable, longScreenshot: ScrollCaptureController.LongScreenshot ) = view.startLongScreenshotTransition(transitionDestination, onTransitionEnd, longScreenshot) override fun restoreNonScrollingUi() = view.restoreNonScrollingUi() override fun fadeForSharedTransition() {} // unused override fun stopInputListening() = view.stopInputListening() override fun requestFocus() { view.requestFocus() } override fun announceForAccessibility(string: String) = view.announceForAccessibility(string) override fun prepareEntranceAnimation(runnable: Runnable) { view.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { if (LogConfig.DEBUG_WINDOW) { Log.d(TAG, "onPreDraw: startAnimation") } view.viewTreeObserver.removeOnPreDrawListener(this) runnable.run() return true } } ) } private fun addPredictiveBackListener(onDismissRequested: (ScreenshotEvent) -> Unit) { val onBackInvokedCallback = OnBackInvokedCallback { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "Predictive Back callback dispatched") } onDismissRequested.invoke(SCREENSHOT_DISMISSED_OTHER) } view.addOnAttachStateChangeListener( object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View) { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "Registering Predictive Back callback") } view .findOnBackInvokedDispatcher() ?.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, onBackInvokedCallback ) } override fun onViewDetachedFromWindow(view: View) { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "Unregistering Predictive Back callback") } view .findOnBackInvokedDispatcher() ?.unregisterOnBackInvokedCallback(onBackInvokedCallback) } } ) } private fun setOnKeyListener(onDismissRequested: (ScreenshotEvent) -> Unit) { view.setOnKeyListener( object : View.OnKeyListener { override fun onKey(view: View, keyCode: Int, event: KeyEvent): Boolean { if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE) { if (LogConfig.DEBUG_INPUT) { Log.d(TAG, "onKeyEvent: $keyCode") } onDismissRequested.invoke(SCREENSHOT_DISMISSED_OTHER) return true } return false } } ) } @AssistedFactory interface Factory : ScreenshotViewProxy.Factory { override fun getProxy(context: Context, displayId: Int): LegacyScreenshotViewProxy } companion object { private const val TAG = "LegacyScreenshotViewProxy" } }
packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt +5 −1 Original line number Diff line number Diff line Loading @@ -137,7 +137,7 @@ constructor( val offset = container.height + params.topMargin + params.bottomMargin val anim = if (animateIn) ValueAnimator.ofFloat(0f, 1f) else ValueAnimator.ofFloat(1f, 0f) with(anim) { duration = ScreenshotView.SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS duration = MESSAGE_EXPANSION_DURATION_MS interpolator = AccelerateDecelerateInterpolator() addUpdateListener { valueAnimator: ValueAnimator -> val interpolation = valueAnimator.animatedValue as Float Loading @@ -147,4 +147,8 @@ constructor( } return anim } companion object { const val MESSAGE_EXPANSION_DURATION_MS: Long = 400 } }
packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +1 −67 Original line number Diff line number Diff line Loading @@ -477,9 +477,6 @@ public class ScreenshotController implements ScreenshotHandler { } mViewProxy.setPackageName(mPackageName); mViewProxy.updateOrientation( mWindowManager.getCurrentWindowMetrics().getWindowInsets()); } /** Loading Loading @@ -528,7 +525,7 @@ public class ScreenshotController implements ScreenshotHandler { } mMessageContainerController.setView(mViewProxy.getView()); mViewProxy.setCallbacks(new ScreenshotView.ScreenshotViewCallback() { mViewProxy.setCallbacks(new ScreenshotShelfViewProxy.ScreenshotViewCallback() { @Override public void onUserInteraction() { if (DEBUG_INPUT) { Loading @@ -537,13 +534,6 @@ public class ScreenshotController implements ScreenshotHandler { mScreenshotHandler.resetTimeout(); } @Override public void onAction(Intent intent, UserHandle owner, boolean overrideTransition) { Pair<ActivityOptions, ExitTransitionCoordinator> exit = createWindowTransition(); mActionIntentExecutor.launchIntentAsync( intent, owner, overrideTransition, exit.first, exit.second); } @Override public void onDismiss() { finishDismiss(); Loading Loading @@ -871,62 +861,6 @@ public class ScreenshotController implements ScreenshotHandler { mSaveInBgTask.execute(); } /** * Sets up the action shade and its entrance animation, once we get the screenshot URI. */ private void showUiOnActionsReady(ScreenshotController.SavedImageData imageData) { logSuccessOnActionsReady(imageData); mScreenshotHandler.resetTimeout(); if (imageData.uri != null) { if (DEBUG_UI) { Log.d(TAG, "Showing UI actions"); } if (!imageData.owner.equals(Process.myUserHandle())) { Log.d(TAG, "Screenshot saved to user " + imageData.owner + " as " + imageData.uri); } mScreenshotHandler.post(() -> { if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) { mScreenshotAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mViewProxy.setChipIntents(imageData); } }); } else { mViewProxy.setChipIntents(imageData); } }); } } /** * Sets up the action shade and its entrance animation, once we get the Quick Share action data. */ private void showUiOnQuickShareActionReady(ScreenshotController.QuickShareData quickShareData) { if (DEBUG_UI) { Log.d(TAG, "Showing UI for Quick Share action"); } if (quickShareData.quickShareAction != null) { mScreenshotHandler.post(() -> { if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) { mScreenshotAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mViewProxy.addQuickShareChip(quickShareData.quickShareAction); } }); } else { mViewProxy.addQuickShareChip(quickShareData.quickShareAction); } }); } } /** * Logs success/failure of the screenshot saving task, and shows an error if it failed. */ Loading
packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt +14 −12 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.systemui.screenshot import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.app.Notification import android.content.Context import android.graphics.Bitmap import android.graphics.Rect Loading @@ -45,7 +44,6 @@ import com.android.systemui.res.R import com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS import com.android.systemui.screenshot.LogConfig.DEBUG_INPUT import com.android.systemui.screenshot.LogConfig.DEBUG_WINDOW import com.android.systemui.screenshot.ScreenshotController.SavedImageData import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER import com.android.systemui.screenshot.scroll.ScrollCaptureController import com.android.systemui.screenshot.ui.ScreenshotAnimationController Loading @@ -71,11 +69,21 @@ constructor( @Assisted private val context: Context, @Assisted private val displayId: Int ) : ScreenshotViewProxy { interface ScreenshotViewCallback { fun onUserInteraction() fun onDismiss() /** DOWN motion event was observed outside of the touchable areas of this view. */ fun onTouchOutside() } override val view: ScreenshotShelfView = LayoutInflater.from(context).inflate(R.layout.screenshot_shelf, null) as ScreenshotShelfView override val screenshotPreview: View override var packageName: String = "" override var callbacks: ScreenshotView.ScreenshotViewCallback? = null override var callbacks: ScreenshotViewCallback? = null override var screenshot: ScreenshotData? = null set(value) { value?.let { Loading @@ -94,6 +102,7 @@ constructor( override val isAttachedToWindow get() = view.isAttachedToWindow override var isDismissing = false override var isPendingSharedTransition = false Loading Loading @@ -141,10 +150,10 @@ constructor( isPendingSharedTransition = false viewModel.reset() } override fun updateInsets(insets: WindowInsets) { view.updateInsets(insets) } override fun updateOrientation(insets: WindowInsets) {} override fun createScreenshotDropInAnimation(screenRect: Rect, showFlash: Boolean): Animator { val entrance = Loading @@ -164,10 +173,6 @@ constructor( return entrance } override fun addQuickShareChip(quickShareAction: Notification.Action) {} override fun setChipIntents(imageData: SavedImageData) {} override fun requestDismissal(event: ScreenshotEvent?) { requestDismissal(event, null) } Loading @@ -187,6 +192,7 @@ constructor( override fun onAnimationStart(animator: Animator) { isDismissing = true } override fun onAnimationEnd(animator: Animator) { isDismissing = false callbacks?.onDismiss() Loading @@ -196,10 +202,6 @@ constructor( animator.start() } override fun showScrollChip(packageName: String, onClick: Runnable) {} override fun hideScrollChip() {} override fun prepareScrollingTransition( response: ScrollCaptureResponse, screenBitmap: Bitmap, // unused Loading