Merge "Add transition between LongScreenshotActivity and editor" into sc-dev
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:background="?android:colorBackgroundFloating"
|
android:background="?android:colorBackgroundFloating"
|
||||||
|
android:id="@+id/root"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
@@ -119,4 +120,14 @@
|
|||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/transition"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/save"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
android:scaleType="matrix"
|
||||||
|
android:visibility="gone"
|
||||||
|
/>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -17,10 +17,12 @@
|
|||||||
package com.android.systemui.screenshot;
|
package com.android.systemui.screenshot;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.ActivityOptions;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.HardwareRenderer;
|
import android.graphics.HardwareRenderer;
|
||||||
|
import android.graphics.Matrix;
|
||||||
import android.graphics.RecordingCanvas;
|
import android.graphics.RecordingCanvas;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RenderNode;
|
import android.graphics.RenderNode;
|
||||||
@@ -33,8 +35,12 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.ScrollCaptureResponse;
|
import android.view.ScrollCaptureResponse;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.Window;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||||
|
|
||||||
|
import com.android.internal.app.ChooserActivity;
|
||||||
import com.android.internal.logging.UiEventLogger;
|
import com.android.internal.logging.UiEventLogger;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.dagger.qualifiers.Background;
|
import com.android.systemui.dagger.qualifiers.Background;
|
||||||
@@ -62,6 +68,8 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
public static final String EXTRA_CAPTURE_RESPONSE = "capture-response";
|
public static final String EXTRA_CAPTURE_RESPONSE = "capture-response";
|
||||||
private static final String KEY_SAVED_IMAGE_PATH = "saved-image-path";
|
private static final String KEY_SAVED_IMAGE_PATH = "saved-image-path";
|
||||||
|
|
||||||
|
private static final boolean USE_SHARED_ELEMENT = false;
|
||||||
|
|
||||||
private final UiEventLogger mUiEventLogger;
|
private final UiEventLogger mUiEventLogger;
|
||||||
private final Executor mUiExecutor;
|
private final Executor mUiExecutor;
|
||||||
private final Executor mBackgroundExecutor;
|
private final Executor mBackgroundExecutor;
|
||||||
@@ -69,6 +77,7 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
private final LongScreenshotHolder mLongScreenshotHolder;
|
private final LongScreenshotHolder mLongScreenshotHolder;
|
||||||
|
|
||||||
private ImageView mPreview;
|
private ImageView mPreview;
|
||||||
|
private ImageView mTransitionView;
|
||||||
private View mSave;
|
private View mSave;
|
||||||
private View mEdit;
|
private View mEdit;
|
||||||
private View mShare;
|
private View mShare;
|
||||||
@@ -81,6 +90,7 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
private ListenableFuture<ImageLoader.Result> mCacheLoadFuture;
|
private ListenableFuture<ImageLoader.Result> mCacheLoadFuture;
|
||||||
|
|
||||||
private LongScreenshot mLongScreenshot;
|
private LongScreenshot mLongScreenshot;
|
||||||
|
private boolean mTransitionStarted;
|
||||||
|
|
||||||
private enum PendingAction {
|
private enum PendingAction {
|
||||||
SHARE,
|
SHARE,
|
||||||
@@ -103,8 +113,8 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")");
|
Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")");
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
|
||||||
setContentView(R.layout.long_screenshot);
|
setContentView(R.layout.long_screenshot);
|
||||||
|
|
||||||
mPreview = requireViewById(R.id.preview);
|
mPreview = requireViewById(R.id.preview);
|
||||||
@@ -114,6 +124,7 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
mCropView = requireViewById(R.id.crop_view);
|
mCropView = requireViewById(R.id.crop_view);
|
||||||
mMagnifierView = requireViewById(R.id.magnifier);
|
mMagnifierView = requireViewById(R.id.magnifier);
|
||||||
mCropView.setCropInteractionListener(mMagnifierView);
|
mCropView.setCropInteractionListener(mMagnifierView);
|
||||||
|
mTransitionView = requireViewById(R.id.transition);
|
||||||
|
|
||||||
mSave.setOnClickListener(this::onClicked);
|
mSave.setOnClickListener(this::onClicked);
|
||||||
mEdit.setOnClickListener(this::onClicked);
|
mEdit.setOnClickListener(this::onClicked);
|
||||||
@@ -178,6 +189,7 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
Log.d(TAG, "onLongScreenshotReceived(longScreenshot=" + longScreenshot + ")");
|
Log.d(TAG, "onLongScreenshotReceived(longScreenshot=" + longScreenshot + ")");
|
||||||
mLongScreenshot = longScreenshot;
|
mLongScreenshot = longScreenshot;
|
||||||
mPreview.setImageDrawable(mLongScreenshot.getDrawable());
|
mPreview.setImageDrawable(mLongScreenshot.getDrawable());
|
||||||
|
mTransitionView.setImageDrawable(mLongScreenshot.getDrawable());
|
||||||
updateImageDimensions();
|
updateImageDimensions();
|
||||||
mCropView.setVisibility(View.VISIBLE);
|
mCropView.setVisibility(View.VISIBLE);
|
||||||
mMagnifierView.setDrawable(mLongScreenshot.getDrawable(),
|
mMagnifierView.setDrawable(mLongScreenshot.getDrawable(),
|
||||||
@@ -249,6 +261,9 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
protected void onStop() {
|
protected void onStop() {
|
||||||
Log.d(TAG, "onStop finishing=" + isFinishing());
|
Log.d(TAG, "onStop finishing=" + isFinishing());
|
||||||
super.onStop();
|
super.onStop();
|
||||||
|
if (mTransitionStarted) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
if (isFinishing()) {
|
if (isFinishing()) {
|
||||||
if (mScrollCaptureResponse != null) {
|
if (mScrollCaptureResponse != null) {
|
||||||
mScrollCaptureResponse.close();
|
mScrollCaptureResponse.close();
|
||||||
@@ -292,11 +307,22 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
intent.setComponent(ComponentName.unflattenFromString(editorPackage));
|
intent.setComponent(ComponentName.unflattenFromString(editorPackage));
|
||||||
}
|
}
|
||||||
intent.setDataAndType(uri, "image/png");
|
intent.setDataAndType(uri, "image/png");
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
|
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||||
| Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||||
|
|
||||||
startActivityAsUser(intent, UserHandle.CURRENT);
|
if (USE_SHARED_ELEMENT) {
|
||||||
finishAndRemoveTask();
|
updateImageDimensions();
|
||||||
|
mTransitionView.setVisibility(View.VISIBLE);
|
||||||
|
// TODO: listen for transition completing instead of finishing onStop
|
||||||
|
mTransitionStarted = true;
|
||||||
|
startActivity(intent,
|
||||||
|
ActivityOptions.makeSceneTransitionAnimation(this, mTransitionView,
|
||||||
|
ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME).toBundle());
|
||||||
|
} else {
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||||
|
startActivityAsUser(intent, UserHandle.CURRENT);
|
||||||
|
finishAndRemoveTask();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doShare(Uri uri) {
|
private void doShare(Uri uri) {
|
||||||
@@ -386,19 +412,47 @@ public class LongScreenshotActivity extends Activity {
|
|||||||
- mPreview.getPaddingBottom();
|
- mPreview.getPaddingBottom();
|
||||||
float viewRatio = previewWidth / (float) previewHeight;
|
float viewRatio = previewWidth / (float) previewHeight;
|
||||||
|
|
||||||
|
// Top and left offsets of the image relative to mPreview.
|
||||||
|
int imageLeft = mPreview.getPaddingLeft();
|
||||||
|
int imageTop = mPreview.getPaddingTop();
|
||||||
|
|
||||||
|
// The image width and height on screen
|
||||||
|
int imageHeight = previewHeight;
|
||||||
|
int imageWidth = previewWidth;
|
||||||
|
float scale;
|
||||||
if (imageRatio > viewRatio) {
|
if (imageRatio > viewRatio) {
|
||||||
// Image is full width and height is constrained, compute extra padding to inform
|
// Image is full width and height is constrained, compute extra padding to inform
|
||||||
// CropView
|
// CropView
|
||||||
float imageHeight = previewHeight * viewRatio / imageRatio;
|
imageHeight = (int) (previewHeight * viewRatio / imageRatio);
|
||||||
int extraPadding = (int) (previewHeight - imageHeight) / 2;
|
int extraPadding = (previewHeight - imageHeight) / 2;
|
||||||
mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(),
|
mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(),
|
||||||
extraPadding + mPreview.getPaddingBottom());
|
extraPadding + mPreview.getPaddingBottom());
|
||||||
|
imageTop += (previewHeight - imageHeight) / 2;
|
||||||
|
scale = imageHeight / bounds.height();
|
||||||
|
mCropView.setExtraPadding(extraPadding, extraPadding);
|
||||||
mCropView.setImageWidth(previewWidth);
|
mCropView.setImageWidth(previewWidth);
|
||||||
} else {
|
} else {
|
||||||
|
imageWidth = (int) (previewWidth * imageRatio / viewRatio);
|
||||||
|
imageLeft += (previewWidth - imageWidth) / 2;
|
||||||
|
scale = imageWidth / (float) bounds.width();
|
||||||
// Image is full height
|
// Image is full height
|
||||||
mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom());
|
mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom());
|
||||||
mCropView.setImageWidth((int) (previewHeight * imageRatio));
|
mCropView.setImageWidth((int) (previewHeight * imageRatio));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update transition view's position and scale.
|
||||||
|
Rect boundaries = mCropView.getCropBoundaries(imageWidth, imageHeight);
|
||||||
|
mTransitionView.setTranslationX(imageLeft + boundaries.left);
|
||||||
|
mTransitionView.setTranslationY(imageTop + boundaries.top);
|
||||||
|
ConstraintLayout.LayoutParams params =
|
||||||
|
(ConstraintLayout.LayoutParams) mTransitionView.getLayoutParams();
|
||||||
|
params.width = boundaries.width();
|
||||||
|
params.height = boundaries.height();
|
||||||
|
mTransitionView.setLayoutParams(params);
|
||||||
|
|
||||||
|
Matrix matrix = new Matrix();
|
||||||
|
matrix.postScale(scale, scale, 0, 0);
|
||||||
|
matrix.postTranslate(-boundaries.left, -boundaries.top);
|
||||||
|
mTransitionView.setImageMatrix(matrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user