/* * Copyright (C) 2020 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.quickstep; import static android.content.Intent.EXTRA_STREAM; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.quickstep.util.ImageActionUtils.persistBitmapAndStartActivity; import android.app.prediction.AppTarget; import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.graphics.Bitmap; import android.graphics.Insets; import android.graphics.Rect; import android.graphics.RectF; import android.util.Log; import androidx.annotation.Nullable; import androidx.annotation.UiThread; import com.android.launcher3.BuildConfig; import com.android.quickstep.util.ImageActionUtils; import com.android.systemui.shared.recents.model.Task; import java.util.function.Supplier; /** * Contains image selection functions necessary to complete overview action button functions. */ public class ImageActionsApi { private static final String TAG = BuildConfig.APPLICATION_ID + "ImageActionsApi"; protected final Context mContext; protected final Supplier mBitmapSupplier; protected final SystemUiProxy mSystemUiProxy; public ImageActionsApi(Context context, Supplier bitmapSupplier) { mContext = context; mBitmapSupplier = bitmapSupplier; mSystemUiProxy = SystemUiProxy.INSTANCE.get(context); } /** * Share the image this api was constructed with using the provided intent. The implementation * should add an {@link Intent#EXTRA_STREAM} with the URI pointing to the image to the intent. */ @UiThread public void shareWithExplicitIntent(@Nullable Rect crop, Intent intent) { addImageAndSendIntent(crop, intent, false, null /* exceptionCallback */); } /** * Share the image this api was constructed with using the provided intent. The implementation * should set the intent's data field to the URI pointing to the image. * @param exceptionCallback An optional callback to be called when the intent can't be resolved */ @UiThread public void shareAsDataWithExplicitIntent(@Nullable Rect crop, Intent intent, @Nullable Runnable exceptionCallback) { addImageAndSendIntent(crop, intent, true, exceptionCallback); } private void addImageAndSendIntent(@Nullable Rect crop, Intent intent, boolean setData, @Nullable Runnable exceptionCallback) { UI_HELPER_EXECUTOR.execute(() -> { Bitmap bitmap = mBitmapSupplier.get(); if (bitmap == null) { Log.e(TAG, "No snapshot available, not starting share."); return; } persistBitmapAndStartActivity(mContext, bitmap, crop, intent, (uri, intentForUri) -> { intentForUri.addFlags(FLAG_GRANT_READ_URI_PERMISSION); if (setData) { intentForUri.setData(uri); } else { intentForUri.putExtra(EXTRA_STREAM, uri); } return new Intent[]{intentForUri}; }, TAG, exceptionCallback); }); } /** * Share the image this api was constructed with. */ @UiThread public void startShareActivity(Rect crop) { ImageActionUtils.startShareActivity(mContext, mBitmapSupplier, crop, null, TAG); } /** * @param screenshot to be saved to the media store. * @param screenshotBounds the location of where the bitmap was laid out on the screen in * screen coordinates. * @param visibleInsets that are used to draw the screenshot within the bounds. * @param task of the task that the screenshot was taken of. */ public void saveScreenshot(Bitmap screenshot, Rect screenshotBounds, Insets visibleInsets, Task.TaskKey task) { ImageActionUtils.saveScreenshot(mSystemUiProxy, screenshot, screenshotBounds, visibleInsets, task); } /** * Share the image when user taps on overview share targets. */ @UiThread public void shareImage(RectF rectF, ShortcutInfo shortcutInfo, AppTarget appTarget) { ImageActionUtils.shareImage(mContext, mBitmapSupplier, rectF, shortcutInfo, appTarget, TAG); } }