Loading packages/SystemUI/res/layout/global_screenshot.xml +5 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,11 @@ android:theme="@style/Screenshot" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/screenshot_scrolling_scrim" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"/> <ImageView android:id="@+id/global_screenshot_actions_background" android:layout_height="@dimen/screenshot_bg_protection_height" Loading packages/SystemUI/res/layout/global_screenshot_static.xml +8 −0 Original line number Diff line number Diff line Loading @@ -122,4 +122,12 @@ android:layout_margin="@dimen/screenshot_dismiss_button_margin" android:src="@drawable/screenshot_cancel"/> </FrameLayout> <ImageView android:id="@+id/screenshot_scrollable_preview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="matrix" app:layout_constraintStart_toStartOf="@id/global_screenshot_preview" app:layout_constraintTop_toTopOf="@id/global_screenshot_preview" android:elevation="@dimen/screenshot_preview_elevation"/> </androidx.constraintlayout.widget.ConstraintLayout> packages/SystemUI/res/layout/long_screenshot.xml +11 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ android:paddingHorizontal="48dp" android:paddingTop="8dp" android:paddingBottom="42dp" android:alpha="0" app:layout_constrainedHeight="true" app:layout_constrainedWidth="true" app:layout_constraintTop_toBottomOf="@id/save" Loading @@ -72,6 +73,16 @@ tools:minHeight="100dp" tools:minWidth="100dp" /> <ImageView android:id="@+id/enter_transition" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="matrix" app:layout_constraintTop_toTopOf="@id/preview" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:transitionName="screenshot_preview_image"/> <com.android.systemui.screenshot.CropView android:id="@+id/crop_view" android:layout_width="0px" Loading packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java +58 −7 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.ComponentName; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.HardwareRenderer; import android.graphics.Matrix; import android.graphics.RecordingCanvas; import android.graphics.Rect; import android.graphics.RenderNode; Loading @@ -31,9 +32,12 @@ import android.net.Uri; import android.os.Bundle; import android.os.UserHandle; import android.text.TextUtils; import android.transition.Transition; import android.transition.TransitionListenerAdapter; import android.util.Log; import android.view.ScrollCaptureResponse; import android.view.View; import android.view.ViewTreeObserver; import android.widget.ImageView; import androidx.constraintlayout.widget.ConstraintLayout; Loading Loading @@ -74,6 +78,7 @@ public class LongScreenshotActivity extends Activity { private ImageView mPreview; private ImageView mTransitionView; private ImageView mEnterTransitionView; private View mSave; private View mEdit; private View mShare; Loading Loading @@ -111,7 +116,7 @@ public class LongScreenshotActivity extends Activity { public void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")"); super.onCreate(savedInstanceState); postponeEnterTransition(); setContentView(R.layout.long_screenshot); mPreview = requireViewById(R.id.preview); Loading @@ -122,6 +127,7 @@ public class LongScreenshotActivity extends Activity { mMagnifierView = requireViewById(R.id.magnifier); mCropView.setCropInteractionListener(mMagnifierView); mTransitionView = requireViewById(R.id.transition); mEnterTransitionView = requireViewById(R.id.enter_transition); mSave.setOnClickListener(this::onClicked); mEdit.setOnClickListener(this::onClicked); Loading Loading @@ -184,8 +190,8 @@ public class LongScreenshotActivity extends Activity { private void onLongScreenshotReceived(LongScreenshot longScreenshot) { Log.d(TAG, "onLongScreenshotReceived(longScreenshot=" + longScreenshot + ")"); mLongScreenshot = longScreenshot; mPreview.setImageDrawable(mLongScreenshot.getDrawable()); updateImageDimensions(); Drawable drawable = mLongScreenshot.getDrawable(); mPreview.setImageDrawable(drawable); mCropView.setVisibility(View.VISIBLE); mMagnifierView.setDrawable(mLongScreenshot.getDrawable(), mLongScreenshot.getWidth(), mLongScreenshot.getHeight()); Loading @@ -196,9 +202,35 @@ public class LongScreenshotActivity extends Activity { float bottomFraction = Math.min(1f, 1 - (mLongScreenshot.getBottom() - mLongScreenshot.getPageHeight()) / (float) mLongScreenshot.getHeight()); mCropView.animateBoundaryTo(CropView.CropBoundary.TOP, topFraction); mCropView.animateBoundaryTo(CropView.CropBoundary.BOTTOM, bottomFraction); mEnterTransitionView.setImageDrawable(drawable); mEnterTransitionView.getViewTreeObserver().addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { mEnterTransitionView.getViewTreeObserver().removeOnPreDrawListener(this); updateImageDimensions(); startPostponedEnterTransition(); if (isActivityTransitionRunning()) { getWindow().getSharedElementEnterTransition().addListener( new TransitionListenerAdapter() { @Override public void onTransitionEnd(Transition transition) { super.onTransitionEnd(transition); mPreview.animate().alpha(1f); mCropView.animateBoundaryTo( CropView.CropBoundary.TOP, topFraction); mCropView.animateBoundaryTo( CropView.CropBoundary.BOTTOM, bottomFraction); setButtonsEnabled(true); mEnterTransitionView.setVisibility(View.GONE); } }); } return true; } }); // Immediately export to temp image file for saved state mCacheSaveFuture = mImageExporter.exportAsTempFile(mBackgroundExecutor, Loading Loading @@ -412,22 +444,26 @@ public class LongScreenshotActivity extends Activity { // The image width and height on screen int imageHeight = previewHeight; int imageWidth = previewWidth; float scale; int extraPadding = 0; if (imageRatio > viewRatio) { // Image is full width and height is constrained, compute extra padding to inform // CropView imageHeight = (int) (previewHeight * viewRatio / imageRatio); int extraPadding = (previewHeight - imageHeight) / 2; extraPadding = (previewHeight - imageHeight) / 2; mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(), extraPadding + mPreview.getPaddingBottom()); imageTop += (previewHeight - imageHeight) / 2; mCropView.setExtraPadding(extraPadding, extraPadding); mCropView.setImageWidth(previewWidth); scale = previewWidth / (float) mPreview.getDrawable().getIntrinsicWidth(); } else { imageWidth = (int) (previewWidth * imageRatio / viewRatio); imageLeft += (previewWidth - imageWidth) / 2; // Image is full height mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom()); mCropView.setImageWidth((int) (previewHeight * imageRatio)); scale = previewHeight / (float) mPreview.getDrawable().getIntrinsicHeight(); } // Update transition view's position and scale. Loading @@ -439,5 +475,20 @@ public class LongScreenshotActivity extends Activity { params.width = boundaries.width(); params.height = boundaries.height(); mTransitionView.setLayoutParams(params); ConstraintLayout.LayoutParams enterTransitionParams = (ConstraintLayout.LayoutParams) mEnterTransitionView.getLayoutParams(); float topFraction = Math.max(0, -mLongScreenshot.getTop() / (float) mLongScreenshot.getHeight()); enterTransitionParams.width = (int) (scale * drawable.getIntrinsicWidth()); enterTransitionParams.height = (int) (scale * mLongScreenshot.getPageHeight()); mEnterTransitionView.setLayoutParams(enterTransitionParams); Matrix matrix = new Matrix(); matrix.setScale(scale, scale); matrix.postTranslate(0, -scale * drawable.getIntrinsicHeight() * topFraction); mEnterTransitionView.setImageMatrix(matrix); mEnterTransitionView.setTranslationY( topFraction * previewHeight + mPreview.getPaddingTop() + extraPadding); } } packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +29 −21 Original line number Diff line number Diff line Loading @@ -606,6 +606,7 @@ public class ScreenshotController { final ScrollCaptureResponse response = mLastScrollCaptureResponse; mScreenshotView.showScrollChip(/* onClick */ () -> { mScreenshotView.prepareScrollingTransition(response, mScreenBitmap); // Clear the reference to prevent close() in dismissScreenshot mLastScrollCaptureResponse = null; final ListenableFuture<ScrollCaptureController.LongScreenshot> future = Loading @@ -623,9 +624,14 @@ public class ScreenshotController { final Intent intent = new Intent(mContext, LongScreenshotActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); mContext.startActivity(intent); dismissScreenshot(false); Pair<ActivityOptions, ExitTransitionCoordinator> transition = ActivityOptions.startSharedElementAnimation( mWindow, new ScreenshotExitTransitionCallbacks(), null, Pair.create(mScreenshotView.getScrollablePreview(), ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME)); transition.second.startExit(); mContext.startActivity(intent, transition.first.toBundle()); }, mMainExecutor); }); } catch (CancellationException e) { Loading @@ -649,7 +655,8 @@ public class ScreenshotController { } @Override public void onWindowDetached() { } public void onWindowDetached() { } }); } Loading Loading @@ -847,24 +854,9 @@ public class ScreenshotController { */ private Supplier<ActionTransition> getActionTransitionSupplier() { return () -> { ExitTransitionCallbacks cb = new ExitTransitionCallbacks() { @Override public boolean isReturnTransitionAllowed() { return false; } @Override public void hideSharedElements() { finishDismiss(); } @Override public void onFinish() { } }; Pair<ActivityOptions, ExitTransitionCoordinator> transition = ActivityOptions.startSharedElementAnimation(mWindow, cb, null, ActivityOptions.startSharedElementAnimation( mWindow, new ScreenshotExitTransitionCallbacks(), null, Pair.create(mScreenshotView.getScreenshotPreview(), ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME)); transition.second.startExit(); Loading Loading @@ -950,4 +942,20 @@ public class ScreenshotController { } return matchWithinTolerance; } private class ScreenshotExitTransitionCallbacks implements ExitTransitionCallbacks { @Override public boolean isReturnTransitionAllowed() { return false; } @Override public void hideSharedElements() { finishDismiss(); } @Override public void onFinish() { } } } Loading
packages/SystemUI/res/layout/global_screenshot.xml +5 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,11 @@ android:theme="@style/Screenshot" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/screenshot_scrolling_scrim" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"/> <ImageView android:id="@+id/global_screenshot_actions_background" android:layout_height="@dimen/screenshot_bg_protection_height" Loading
packages/SystemUI/res/layout/global_screenshot_static.xml +8 −0 Original line number Diff line number Diff line Loading @@ -122,4 +122,12 @@ android:layout_margin="@dimen/screenshot_dismiss_button_margin" android:src="@drawable/screenshot_cancel"/> </FrameLayout> <ImageView android:id="@+id/screenshot_scrollable_preview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="matrix" app:layout_constraintStart_toStartOf="@id/global_screenshot_preview" app:layout_constraintTop_toTopOf="@id/global_screenshot_preview" android:elevation="@dimen/screenshot_preview_elevation"/> </androidx.constraintlayout.widget.ConstraintLayout>
packages/SystemUI/res/layout/long_screenshot.xml +11 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ android:paddingHorizontal="48dp" android:paddingTop="8dp" android:paddingBottom="42dp" android:alpha="0" app:layout_constrainedHeight="true" app:layout_constrainedWidth="true" app:layout_constraintTop_toBottomOf="@id/save" Loading @@ -72,6 +73,16 @@ tools:minHeight="100dp" tools:minWidth="100dp" /> <ImageView android:id="@+id/enter_transition" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="matrix" app:layout_constraintTop_toTopOf="@id/preview" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:transitionName="screenshot_preview_image"/> <com.android.systemui.screenshot.CropView android:id="@+id/crop_view" android:layout_width="0px" Loading
packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java +58 −7 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.ComponentName; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.HardwareRenderer; import android.graphics.Matrix; import android.graphics.RecordingCanvas; import android.graphics.Rect; import android.graphics.RenderNode; Loading @@ -31,9 +32,12 @@ import android.net.Uri; import android.os.Bundle; import android.os.UserHandle; import android.text.TextUtils; import android.transition.Transition; import android.transition.TransitionListenerAdapter; import android.util.Log; import android.view.ScrollCaptureResponse; import android.view.View; import android.view.ViewTreeObserver; import android.widget.ImageView; import androidx.constraintlayout.widget.ConstraintLayout; Loading Loading @@ -74,6 +78,7 @@ public class LongScreenshotActivity extends Activity { private ImageView mPreview; private ImageView mTransitionView; private ImageView mEnterTransitionView; private View mSave; private View mEdit; private View mShare; Loading Loading @@ -111,7 +116,7 @@ public class LongScreenshotActivity extends Activity { public void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")"); super.onCreate(savedInstanceState); postponeEnterTransition(); setContentView(R.layout.long_screenshot); mPreview = requireViewById(R.id.preview); Loading @@ -122,6 +127,7 @@ public class LongScreenshotActivity extends Activity { mMagnifierView = requireViewById(R.id.magnifier); mCropView.setCropInteractionListener(mMagnifierView); mTransitionView = requireViewById(R.id.transition); mEnterTransitionView = requireViewById(R.id.enter_transition); mSave.setOnClickListener(this::onClicked); mEdit.setOnClickListener(this::onClicked); Loading Loading @@ -184,8 +190,8 @@ public class LongScreenshotActivity extends Activity { private void onLongScreenshotReceived(LongScreenshot longScreenshot) { Log.d(TAG, "onLongScreenshotReceived(longScreenshot=" + longScreenshot + ")"); mLongScreenshot = longScreenshot; mPreview.setImageDrawable(mLongScreenshot.getDrawable()); updateImageDimensions(); Drawable drawable = mLongScreenshot.getDrawable(); mPreview.setImageDrawable(drawable); mCropView.setVisibility(View.VISIBLE); mMagnifierView.setDrawable(mLongScreenshot.getDrawable(), mLongScreenshot.getWidth(), mLongScreenshot.getHeight()); Loading @@ -196,9 +202,35 @@ public class LongScreenshotActivity extends Activity { float bottomFraction = Math.min(1f, 1 - (mLongScreenshot.getBottom() - mLongScreenshot.getPageHeight()) / (float) mLongScreenshot.getHeight()); mCropView.animateBoundaryTo(CropView.CropBoundary.TOP, topFraction); mCropView.animateBoundaryTo(CropView.CropBoundary.BOTTOM, bottomFraction); mEnterTransitionView.setImageDrawable(drawable); mEnterTransitionView.getViewTreeObserver().addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { mEnterTransitionView.getViewTreeObserver().removeOnPreDrawListener(this); updateImageDimensions(); startPostponedEnterTransition(); if (isActivityTransitionRunning()) { getWindow().getSharedElementEnterTransition().addListener( new TransitionListenerAdapter() { @Override public void onTransitionEnd(Transition transition) { super.onTransitionEnd(transition); mPreview.animate().alpha(1f); mCropView.animateBoundaryTo( CropView.CropBoundary.TOP, topFraction); mCropView.animateBoundaryTo( CropView.CropBoundary.BOTTOM, bottomFraction); setButtonsEnabled(true); mEnterTransitionView.setVisibility(View.GONE); } }); } return true; } }); // Immediately export to temp image file for saved state mCacheSaveFuture = mImageExporter.exportAsTempFile(mBackgroundExecutor, Loading Loading @@ -412,22 +444,26 @@ public class LongScreenshotActivity extends Activity { // The image width and height on screen int imageHeight = previewHeight; int imageWidth = previewWidth; float scale; int extraPadding = 0; if (imageRatio > viewRatio) { // Image is full width and height is constrained, compute extra padding to inform // CropView imageHeight = (int) (previewHeight * viewRatio / imageRatio); int extraPadding = (previewHeight - imageHeight) / 2; extraPadding = (previewHeight - imageHeight) / 2; mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(), extraPadding + mPreview.getPaddingBottom()); imageTop += (previewHeight - imageHeight) / 2; mCropView.setExtraPadding(extraPadding, extraPadding); mCropView.setImageWidth(previewWidth); scale = previewWidth / (float) mPreview.getDrawable().getIntrinsicWidth(); } else { imageWidth = (int) (previewWidth * imageRatio / viewRatio); imageLeft += (previewWidth - imageWidth) / 2; // Image is full height mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom()); mCropView.setImageWidth((int) (previewHeight * imageRatio)); scale = previewHeight / (float) mPreview.getDrawable().getIntrinsicHeight(); } // Update transition view's position and scale. Loading @@ -439,5 +475,20 @@ public class LongScreenshotActivity extends Activity { params.width = boundaries.width(); params.height = boundaries.height(); mTransitionView.setLayoutParams(params); ConstraintLayout.LayoutParams enterTransitionParams = (ConstraintLayout.LayoutParams) mEnterTransitionView.getLayoutParams(); float topFraction = Math.max(0, -mLongScreenshot.getTop() / (float) mLongScreenshot.getHeight()); enterTransitionParams.width = (int) (scale * drawable.getIntrinsicWidth()); enterTransitionParams.height = (int) (scale * mLongScreenshot.getPageHeight()); mEnterTransitionView.setLayoutParams(enterTransitionParams); Matrix matrix = new Matrix(); matrix.setScale(scale, scale); matrix.postTranslate(0, -scale * drawable.getIntrinsicHeight() * topFraction); mEnterTransitionView.setImageMatrix(matrix); mEnterTransitionView.setTranslationY( topFraction * previewHeight + mPreview.getPaddingTop() + extraPadding); } }
packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +29 −21 Original line number Diff line number Diff line Loading @@ -606,6 +606,7 @@ public class ScreenshotController { final ScrollCaptureResponse response = mLastScrollCaptureResponse; mScreenshotView.showScrollChip(/* onClick */ () -> { mScreenshotView.prepareScrollingTransition(response, mScreenBitmap); // Clear the reference to prevent close() in dismissScreenshot mLastScrollCaptureResponse = null; final ListenableFuture<ScrollCaptureController.LongScreenshot> future = Loading @@ -623,9 +624,14 @@ public class ScreenshotController { final Intent intent = new Intent(mContext, LongScreenshotActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); mContext.startActivity(intent); dismissScreenshot(false); Pair<ActivityOptions, ExitTransitionCoordinator> transition = ActivityOptions.startSharedElementAnimation( mWindow, new ScreenshotExitTransitionCallbacks(), null, Pair.create(mScreenshotView.getScrollablePreview(), ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME)); transition.second.startExit(); mContext.startActivity(intent, transition.first.toBundle()); }, mMainExecutor); }); } catch (CancellationException e) { Loading @@ -649,7 +655,8 @@ public class ScreenshotController { } @Override public void onWindowDetached() { } public void onWindowDetached() { } }); } Loading Loading @@ -847,24 +854,9 @@ public class ScreenshotController { */ private Supplier<ActionTransition> getActionTransitionSupplier() { return () -> { ExitTransitionCallbacks cb = new ExitTransitionCallbacks() { @Override public boolean isReturnTransitionAllowed() { return false; } @Override public void hideSharedElements() { finishDismiss(); } @Override public void onFinish() { } }; Pair<ActivityOptions, ExitTransitionCoordinator> transition = ActivityOptions.startSharedElementAnimation(mWindow, cb, null, ActivityOptions.startSharedElementAnimation( mWindow, new ScreenshotExitTransitionCallbacks(), null, Pair.create(mScreenshotView.getScreenshotPreview(), ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME)); transition.second.startExit(); Loading Loading @@ -950,4 +942,20 @@ public class ScreenshotController { } return matchWithinTolerance; } private class ScreenshotExitTransitionCallbacks implements ExitTransitionCallbacks { @Override public boolean isReturnTransitionAllowed() { return false; } @Override public void hideSharedElements() { finishDismiss(); } @Override public void onFinish() { } } }