diff options
author | Laker <lakerman1987@gmail.com> | 2021-04-19 18:11:49 +0300 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2021-09-27 21:17:05 +0800 |
commit | 61eaf79c49593f1ec220c35abadbd8b4a203fd1c (patch) | |
tree | 659749b8066482f4f4e6d6925c77ee8e8e2264e6 | |
parent | 52acd38eb0b12bdbdee2fbeaa1767fa8d20474f0 (diff) |
[crdroid][11.0] base: Use Asus Stitchimage as default screenshot service
Also add delete action for partial screenshot notification
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
Change-Id: I10880a731b6c91edd32f6a0084ad609e07b2564f
3 files changed, 32 insertions, 414 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 1b4440e7907a..0cf0224feaec 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -32,26 +32,19 @@ import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.Notification; -import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; -import android.graphics.Color; import android.graphics.Insets; import android.graphics.Outline; import android.graphics.PixelFormat; -import android.graphics.PointF; import android.graphics.Rect; import android.graphics.Region; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.InsetDrawable; -import android.graphics.drawable.LayerDrawable; import android.hardware.camera2.CameraManager; import android.media.AudioManager; import android.media.MediaActionSound; @@ -81,7 +74,6 @@ import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; import android.view.WindowInsets; import android.view.WindowManager; -import android.view.accessibility.AccessibilityManager; import android.view.animation.AccelerateInterpolator; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; @@ -89,7 +81,6 @@ import android.widget.FrameLayout; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.Toast; import com.android.internal.logging.UiEventLogger; import com.android.internal.statusbar.IStatusBarService; @@ -100,7 +91,6 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; import java.util.function.Consumer; @@ -172,6 +162,10 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset // From WizardManagerHelper.java private static final String SETTINGS_SECURE_USER_SETUP_COMPLETE = "user_setup_complete"; + private static final String STITCHIMAGE_APP_PACKAGE_NAME = "com.asus.stitchimage"; + private static final String STITCHIMAGE_OVERLAY_SERVICE_CLASS = "com.asus.stitchimage.OverlayService"; + private static final String EXTRA_KEY_STITCHIMAGE_SETTINGS_CALLFROM = "callfrom"; + private static final String EXTRA_VALUE_STITCHIMAGE_SETTINGS_CALLFROM_ASUSSETTINGS = "AsusSettings"; private static final String TAG = "GlobalScreenshot"; private static final long SCREENSHOT_FLASH_IN_DURATION_MS = 133; @@ -193,7 +187,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private final Interpolator mAccelerateInterpolator = new AccelerateInterpolator(); - private final ScreenshotNotificationsController mNotificationsController; + private static ScreenshotNotificationsController mNotificationsController; private final UiEventLogger mUiEventLogger; private final Context mContext; @@ -226,6 +220,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private boolean mInDarkMode; private boolean mDirectionLTR; private boolean mOrientationPortrait; + private boolean isFullScreenshot; private float mCornerSizeX; private float mDismissDeltaY; @@ -241,6 +236,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private int mLeftInset; private int mRightInset; + private LayoutInflater inflater; + // standard material ease private final Interpolator mFastOutSlowIn; @@ -385,11 +382,24 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset void takeScreenshotFullscreen(Consumer<Uri> finisher, Runnable onComplete) { mOnCompleteRunnable = onComplete; - mDisplay.getRealMetrics(mDisplayMetrics); - takeScreenshotInternal( - finisher, - new Rect(0, 0, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels)); + + try { + Log.i(TAG, "Take full screenshot."); + Intent intent = new Intent(); + intent.setComponent(new ComponentName(STITCHIMAGE_APP_PACKAGE_NAME, STITCHIMAGE_OVERLAY_SERVICE_CLASS)); + intent.putExtra(EXTRA_KEY_STITCHIMAGE_SETTINGS_CALLFROM, EXTRA_VALUE_STITCHIMAGE_SETTINGS_CALLFROM_ASUSSETTINGS); + mContext.startService(intent); + isFullScreenshot = true; + } catch (Exception e) { + Log.e(TAG, "Trigger stitchimage failed, Exception :" + e); + } + + mScreenshotHandler.postDelayed(() -> { + finisher.accept(null); + mOnCompleteRunnable.run(); + isFullScreenshot = false; + }, 1500); } void handleImageAsScreenshot(Bitmap screenshot, Rect screenshotScreenBounds, @@ -472,7 +482,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset */ @SuppressLint("ClickableViewAccessibility") void takeScreenshotPartial(final Consumer<Uri> finisher, Runnable onComplete) { - if (mScreenshotLayout.getParent() != null) { + if (isFullScreenshot) { finisher.accept(null); return; } @@ -509,6 +519,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset View view, int transitionType) { takeScreenshotInternal(finisher, adjustedRect); transition.removeTransitionListener(this); + playShutterSound(); } }); mScreenshotLayout.post(() -> hideScreenshotSelector()); @@ -708,11 +719,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset * Takes a screenshot of the current display and shows an animation. */ private void takeScreenshotInternal(Consumer<Uri> finisher, Rect crop) { - if (mScreenshotLayout.getParent() != null) { - finisher.accept(null); - return; - } - // Dismiss the old screenshot first to prevent it from showing up in the new screenshot dismissScreenshot("new screenshot requested", true); @@ -756,13 +762,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset return; } - if (!isUserSetupComplete()) { - // User setup isn't complete, so we don't want to show any UI beyond a toast, as editing - // and sharing shouldn't be exposed to the user. - saveScreenshotAndToast(finisher); - return; - } - // Optimizations mScreenBitmap.setHasAlpha(false); mScreenBitmap.prepareToDraw(); @@ -776,82 +775,15 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset // The window is focusable by default setWindowFocusable(true); - // Start the post-screenshot animation - startAnimation(finisher, screenRect, screenInsets, showFlash); - } - - /** - * Save the bitmap but don't show the normal screenshot UI.. just a toast (or notification on - * failure). - */ - private void saveScreenshotAndToast(Consumer<Uri> finisher) { - // Play the shutter sound to notify that we've taken a screenshot - mScreenshotHandler.post(() -> { - playShutterSound(); - }); - saveScreenshotInWorkerThread(finisher, new ActionsReadyListener() { @Override void onActionsReady(SavedImageData imageData) { - finisher.accept(imageData.uri); - if (imageData.uri == null) { - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_NOT_SAVED); - mNotificationsController.notifyScreenshotError( - R.string.screenshot_failed_to_capture_text); - } else { - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED); - - mScreenshotHandler.post(() -> { - Toast.makeText(mContext, R.string.screenshot_saved_title, - Toast.LENGTH_SHORT).show(); - }); - } + mNotificationsController.showSilentScreenshotNotification(imageData); } }); } /** - * Starts the animation after taking the screenshot - */ - private void startAnimation(final Consumer<Uri> finisher, Rect screenRect, Insets screenInsets, - boolean showFlash) { - mScreenshotHandler.post(() -> { - if (!mScreenshotLayout.isAttachedToWindow()) { - mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); - } - mScreenshotAnimatedView.setImageDrawable( - createScreenDrawable(mScreenBitmap, screenInsets)); - setAnimatedViewSize(screenRect.width(), screenRect.height()); - // Show when the animation starts - mScreenshotAnimatedView.setVisibility(View.GONE); - - mScreenshotPreview.setImageDrawable(createScreenDrawable(mScreenBitmap, screenInsets)); - // make static preview invisible (from gone) so we can query its location on screen - mScreenshotPreview.setVisibility(View.INVISIBLE); - - mScreenshotHandler.post(() -> { - mScreenshotLayout.getViewTreeObserver().addOnComputeInternalInsetsListener(this); - - mScreenshotAnimation = - createScreenshotDropInAnimation(screenRect, showFlash); - - saveScreenshotInWorkerThread(finisher, new ActionsReadyListener() { - @Override - void onActionsReady(SavedImageData imageData) { - showUiOnActionsReady(imageData); - } - }); - - playShutterSound(); - - mScreenshotPreview.setLayerType(View.LAYER_TYPE_HARDWARE, null); - mScreenshotPreview.buildLayer(); - mScreenshotAnimation.start(); - }); - }); - } - - /** * Creates a new worker thread and saves the screenshot to the media store. */ private void saveScreenshotInWorkerThread( @@ -881,41 +813,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } /** - * Sets up the action shade and its entrance animation, once we get the screenshot URI. - */ - private void showUiOnActionsReady(SavedImageData imageData) { - logSuccessOnActionsReady(imageData); - mImageData = imageData; - - AccessibilityManager accessibilityManager = (AccessibilityManager) - mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); - long timeoutMs = accessibilityManager.getRecommendedTimeoutMillis( - SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS, - AccessibilityManager.FLAG_CONTENT_CONTROLS); - - mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT); - mScreenshotHandler.sendMessageDelayed( - mScreenshotHandler.obtainMessage(MESSAGE_CORNER_TIMEOUT), - timeoutMs); - - if (imageData.uri != null) { - mScreenshotHandler.post(() -> { - if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) { - mScreenshotAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - createScreenshotActionsShadeAnimation(imageData).start(); - } - }); - } else { - createScreenshotActionsShadeAnimation(imageData).start(); - } - }); - } - } - - /** * Logs success/failure of the screenshot saving task, and shows an error if it failed. */ private void logSuccessOnActionsReady(SavedImageData imageData) { @@ -928,243 +825,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } } - private AnimatorSet createScreenshotDropInAnimation(Rect bounds, boolean showFlash) { - Rect previewBounds = new Rect(); - mScreenshotPreview.getBoundsOnScreen(previewBounds); - - float cornerScale = - mCornerSizeX / (mOrientationPortrait ? bounds.width() : bounds.height()); - final float currentScale = 1f; - - mScreenshotAnimatedView.setScaleX(currentScale); - mScreenshotAnimatedView.setScaleY(currentScale); - - mDismissButton.setAlpha(0); - mDismissButton.setVisibility(View.VISIBLE); - - AnimatorSet dropInAnimation = new AnimatorSet(); - ValueAnimator flashInAnimator = ValueAnimator.ofFloat(0, 1); - flashInAnimator.setDuration(SCREENSHOT_FLASH_IN_DURATION_MS); - flashInAnimator.setInterpolator(mFastOutSlowIn); - flashInAnimator.addUpdateListener(animation -> - mScreenshotFlash.setAlpha((float) animation.getAnimatedValue())); - - ValueAnimator flashOutAnimator = ValueAnimator.ofFloat(1, 0); - flashOutAnimator.setDuration(SCREENSHOT_FLASH_OUT_DURATION_MS); - flashOutAnimator.setInterpolator(mFastOutSlowIn); - flashOutAnimator.addUpdateListener(animation -> - mScreenshotFlash.setAlpha((float) animation.getAnimatedValue())); - - // animate from the current location, to the static preview location - final PointF startPos = new PointF(bounds.centerX(), bounds.centerY()); - final PointF finalPos = new PointF(previewBounds.centerX(), previewBounds.centerY()); - - ValueAnimator toCorner = ValueAnimator.ofFloat(0, 1); - toCorner.setDuration(SCREENSHOT_TO_CORNER_Y_DURATION_MS); - float xPositionPct = - SCREENSHOT_TO_CORNER_X_DURATION_MS / (float) SCREENSHOT_TO_CORNER_Y_DURATION_MS; - float dismissPct = - SCREENSHOT_TO_CORNER_DISMISS_DELAY_MS / (float) SCREENSHOT_TO_CORNER_Y_DURATION_MS; - float scalePct = - SCREENSHOT_TO_CORNER_SCALE_DURATION_MS / (float) SCREENSHOT_TO_CORNER_Y_DURATION_MS; - toCorner.addUpdateListener(animation -> { - float t = animation.getAnimatedFraction(); - if (t < scalePct) { - float scale = MathUtils.lerp( - currentScale, cornerScale, mFastOutSlowIn.getInterpolation(t / scalePct)); - mScreenshotAnimatedView.setScaleX(scale); - mScreenshotAnimatedView.setScaleY(scale); - } else { - mScreenshotAnimatedView.setScaleX(cornerScale); - mScreenshotAnimatedView.setScaleY(cornerScale); - } - - float currentScaleX = mScreenshotAnimatedView.getScaleX(); - float currentScaleY = mScreenshotAnimatedView.getScaleY(); - - if (t < xPositionPct) { - float xCenter = MathUtils.lerp(startPos.x, finalPos.x, - mFastOutSlowIn.getInterpolation(t / xPositionPct)); - mScreenshotAnimatedView.setX(xCenter - bounds.width() * currentScaleX / 2f); - } else { - mScreenshotAnimatedView.setX(finalPos.x - bounds.width() * currentScaleX / 2f); - } - float yCenter = MathUtils.lerp( - startPos.y, finalPos.y, mFastOutSlowIn.getInterpolation(t)); - mScreenshotAnimatedView.setY(yCenter - bounds.height() * currentScaleY / 2f); - - if (t >= dismissPct) { - mDismissButton.setAlpha((t - dismissPct) / (1 - dismissPct)); - float currentX = mScreenshotAnimatedView.getX(); - float currentY = mScreenshotAnimatedView.getY(); - mDismissButton.setY(currentY - mDismissButton.getHeight() / 2f); - if (mDirectionLTR) { - mDismissButton.setX(currentX - + bounds.width() * currentScaleX - mDismissButton.getWidth() / 2f); - } else { - mDismissButton.setX(currentX - mDismissButton.getWidth() / 2f); - } - } - }); - - toCorner.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - super.onAnimationStart(animation); - mScreenshotAnimatedView.setVisibility(View.VISIBLE); - } - }); - - mScreenshotFlash.setAlpha(0f); - mScreenshotFlash.setVisibility(View.VISIBLE); - - if (showFlash) { - dropInAnimation.play(flashOutAnimator).after(flashInAnimator); - dropInAnimation.play(flashOutAnimator).with(toCorner); - } else { - dropInAnimation.play(toCorner); - } - - dropInAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - mDismissButton.setAlpha(1); - float dismissOffset = mDismissButton.getWidth() / 2f; - float finalDismissX = mDirectionLTR - ? finalPos.x - dismissOffset + bounds.width() * cornerScale / 2f - : finalPos.x - dismissOffset - bounds.width() * cornerScale / 2f; - mDismissButton.setX(finalDismissX); - mDismissButton.setY( - finalPos.y - dismissOffset - bounds.height() * cornerScale / 2f); - mScreenshotAnimatedView.setScaleX(1); - mScreenshotAnimatedView.setScaleY(1); - mScreenshotAnimatedView.setX(finalPos.x - bounds.width() * cornerScale / 2f); - mScreenshotAnimatedView.setY(finalPos.y - bounds.height() * cornerScale / 2f); - mScreenshotAnimatedView.setVisibility(View.GONE); - mScreenshotPreview.setVisibility(View.VISIBLE); - mScreenshotLayout.forceLayout(); - } - }); - - return dropInAnimation; - } - - private ValueAnimator createScreenshotActionsShadeAnimation(SavedImageData imageData) { - LayoutInflater inflater = LayoutInflater.from(mContext); - mActionsView.removeAllViews(); - mScreenshotLayout.invalidate(); - mScreenshotLayout.requestLayout(); - mScreenshotLayout.getViewTreeObserver().dispatchOnGlobalLayout(); - - // By default the activities won't be able to start immediately; override this to keep - // the same behavior as if started from a notification - try { - ActivityManager.getService().resumeAppSwitches(); - } catch (RemoteException e) { - } - - ArrayList<ScreenshotActionChip> chips = new ArrayList<>(); - - for (Notification.Action smartAction : imageData.smartActions) { - ScreenshotActionChip actionChip = (ScreenshotActionChip) inflater.inflate( - R.layout.global_screenshot_action_chip, mActionsView, false); - actionChip.setText(smartAction.title); - actionChip.setIcon(smartAction.getIcon(), false); - actionChip.setPendingIntent(smartAction.actionIntent, - () -> { - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SMART_ACTION_TAPPED); - dismissScreenshot("chip tapped", false); - mOnCompleteRunnable.run(); - }); - mActionsView.addView(actionChip); - chips.add(actionChip); - } - - ScreenshotActionChip shareChip = (ScreenshotActionChip) inflater.inflate( - R.layout.global_screenshot_action_chip, mActionsView, false); - shareChip.setText(imageData.shareAction.title); - shareChip.setIcon(imageData.shareAction.getIcon(), true); - shareChip.setPendingIntent(imageData.shareAction.actionIntent, () -> { - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED); - dismissScreenshot("chip tapped", false); - mOnCompleteRunnable.run(); - }); - mActionsView.addView(shareChip); - chips.add(shareChip); - - ScreenshotActionChip editChip = (ScreenshotActionChip) inflater.inflate( - R.layout.global_screenshot_action_chip, mActionsView, false); - editChip.setText(imageData.editAction.title); - editChip.setIcon(imageData.editAction.getIcon(), true); - editChip.setPendingIntent(imageData.editAction.actionIntent, () -> { - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED); - dismissScreenshot("chip tapped", false); - mOnCompleteRunnable.run(); - }); - mActionsView.addView(editChip); - chips.add(editChip); - - ScreenshotActionChip deleteChip = (ScreenshotActionChip) inflater.inflate( - R.layout.global_screenshot_action_chip, mActionsView, false); - deleteChip.setText(imageData.deleteAction.title); - deleteChip.setIcon(imageData.deleteAction.getIcon(), true); - deleteChip.setPendingIntent(imageData.deleteAction.actionIntent, () -> { - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_DELETE_TAPPED); - dismissScreenshot("chip tapped", false); - mOnCompleteRunnable.run(); - }); - mActionsView.addView(deleteChip); - chips.add(deleteChip); - - mScreenshotPreview.setOnClickListener(v -> { - try { - imageData.editAction.actionIntent.send(); - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED); - dismissScreenshot("screenshot preview tapped", false); - mOnCompleteRunnable.run(); - } catch (PendingIntent.CanceledException e) { - Log.e(TAG, "Intent cancelled", e); - } - }); - mScreenshotPreview.setContentDescription(imageData.editAction.title); - - // remove the margin from the last chip so that it's correctly aligned with the end - LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) - mActionsView.getChildAt(mActionsView.getChildCount() - 1).getLayoutParams(); - params.setMarginEnd(0); - - ValueAnimator animator = ValueAnimator.ofFloat(0, 1); - animator.setDuration(SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS); - float alphaFraction = (float) SCREENSHOT_ACTIONS_ALPHA_DURATION_MS - / SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS; - mActionsContainer.setAlpha(0f); - mActionsContainerBackground.setAlpha(0f); - mActionsContainer.setVisibility(View.VISIBLE); - mActionsContainerBackground.setVisibility(View.VISIBLE); - - animator.addUpdateListener(animation -> { - float t = animation.getAnimatedFraction(); - mBackgroundProtection.setAlpha(t); - float containerAlpha = t < alphaFraction ? t / alphaFraction : 1; - mActionsContainer.setAlpha(containerAlpha); - mActionsContainerBackground.setAlpha(containerAlpha); - float containerScale = SCREENSHOT_ACTIONS_START_SCALE_X - + (t * (1 - SCREENSHOT_ACTIONS_START_SCALE_X)); - mActionsContainer.setScaleX(containerScale); - mActionsContainerBackground.setScaleX(containerScale); - for (ScreenshotActionChip chip : chips) { - chip.setAlpha(t); - chip.setScaleX(1 / containerScale); // invert to keep size of children constant - } - mActionsContainer.setScrollX(mDirectionLTR ? 0 : mActionsContainer.getWidth()); - mActionsContainer.setPivotX(mDirectionLTR ? 0 : mActionsContainer.getWidth()); - mActionsContainerBackground.setPivotX( - mDirectionLTR ? 0 : mActionsContainerBackground.getWidth()); - }); - return animator; - } - private AnimatorSet createScreenshotDismissAnimation() { ValueAnimator alphaAnim = ValueAnimator.ofFloat(0, 1); alphaAnim.setStartDelay(SCREENSHOT_DISMISS_ALPHA_OFFSET_MS); @@ -1218,13 +878,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset hideScreenshotSelector(); } - private void setAnimatedViewSize(int width, int height) { - ViewGroup.LayoutParams layoutParams = mScreenshotAnimatedView.getLayoutParams(); - layoutParams.width = width; - layoutParams.height = height; - mScreenshotAnimatedView.setLayoutParams(layoutParams); - } - /** * Updates the window focusability. If the window is already showing, then it updates the * window immediately, otherwise the layout params will be applied when the window is next @@ -1241,11 +894,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } } - private boolean isUserSetupComplete() { - return Settings.Secure.getInt(mContext.getContentResolver(), - SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1; - } - /** Does the aspect ratio of the bitmap with insets removed match the bounds. */ private boolean aspectRatiosMatch(Bitmap bitmap, Insets bitmapInsets, Rect screenBounds) { int insettedWidth = bitmap.getWidth() - bitmapInsets.left - bitmapInsets.right; @@ -1271,39 +919,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset return matchWithinTolerance; } - /** - * Create a drawable using the size of the bitmap and insets as the fractional inset parameters. - */ - private Drawable createScreenDrawable(Bitmap bitmap, Insets insets) { - int insettedWidth = bitmap.getWidth() - insets.left - insets.right; - int insettedHeight = bitmap.getHeight() - insets.top - insets.bottom; - - BitmapDrawable bitmapDrawable = new BitmapDrawable(mContext.getResources(), bitmap); - if (insettedHeight == 0 || insettedWidth == 0 || bitmap.getWidth() == 0 - || bitmap.getHeight() == 0) { - Log.e(TAG, String.format( - "Can't create insetted drawable, using 0 insets " - + "bitmap and insets create degenerate region: %dx%d %s", - bitmap.getWidth(), bitmap.getHeight(), insets)); - return bitmapDrawable; - } - - InsetDrawable insetDrawable = new InsetDrawable(bitmapDrawable, - -1f * insets.left / insettedWidth, - -1f * insets.top / insettedHeight, - -1f * insets.right / insettedWidth, - -1f * insets.bottom / insettedHeight); - - if (insets.left < 0 || insets.top < 0 || insets.right < 0 || insets.bottom < 0) { - // Are any of the insets negative, meaning the bitmap is smaller than the bounds so need - // to fill in the background of the drawable. - return new LayerDrawable(new Drawable[]{ - new ColorDrawable(Color.BLACK), insetDrawable}); - } else { - return insetDrawable; - } - } - private void playShutterSound() { boolean playSound = readCameraSoundForced() && mCamsInUse > 0; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java index c74543af1831..4fd7a80d30a5 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java @@ -236,6 +236,7 @@ public class ScreenshotNotificationsController { GlobalScreenshot.SavedImageData actionData) { mNotificationBuilder.addAction(actionData.shareAction); mNotificationBuilder.addAction(actionData.editAction); + mNotificationBuilder.addAction(actionData.deleteAction); for (Notification.Action smartAction : actionData.smartActions) { mNotificationBuilder.addAction(smartAction); } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java index 633cdd6ca5ca..3de5d540ea81 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java @@ -48,6 +48,7 @@ import javax.inject.Singleton; @Singleton public class ScreenshotSmartActions { private static final String TAG = "ScreenshotSmartActions"; + private static ScreenshotNotificationsController mNotificationsController; @Inject public ScreenshotSmartActions() {} @@ -141,6 +142,7 @@ public class ScreenshotSmartActions { SystemUIFactory.getInstance().createScreenshotNotificationSmartActionsProvider( context, THREAD_POOL_EXECUTOR, new Handler()); provider.notifyAction(screenshotId, action, isSmartAction); + mNotificationsController.cancelScreenshotNotification(context); } catch (Throwable e) { Slog.e(TAG, "Error in notifyScreenshotAction: ", e); } |