Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1847ff8e authored by Matt Casey's avatar Matt Casey
Browse files

Switch clipboard image edit intent to a callback.

In preparation for flagged behavior change.

Bug: 391401141
Flag: com.android.systemui.shared.use_preferred_image_editor
Test: atest ActionIntentCreatorTest
Change-Id: I6273d3081ad932cd782609e1f3570b3a1ba9f68e
parent 7f8d6527
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -25,6 +25,10 @@ import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
import androidx.test.runner.AndroidJUnit4
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.res.R
import com.android.systemui.res.R
import kotlinx.coroutines.test.TestCoroutineScheduler
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.Test
@@ -33,7 +37,11 @@ import org.junit.runner.RunWith
@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
class ActionIntentCreatorTest : SysuiTestCase() {
class ActionIntentCreatorTest : SysuiTestCase() {
    val creator = ActionIntentCreator()
    private val scheduler = TestCoroutineScheduler()
    private val mainDispatcher = UnconfinedTestDispatcher(scheduler)
    private val testScope = TestScope(mainDispatcher)

    val creator = ActionIntentCreator(testScope.backgroundScope)


    @Test
    @Test
    fun test_getTextEditorIntent() {
    fun test_getTextEditorIntent() {
@@ -65,7 +73,7 @@ class ActionIntentCreatorTest : SysuiTestCase() {
    }
    }


    @Test
    @Test
    fun test_getImageEditIntent() {
    fun test_getImageEditIntent() = runTest {
        context.getOrCreateTestableResources().addOverride(R.string.config_screenshotEditor, "")
        context.getOrCreateTestableResources().addOverride(R.string.config_screenshotEditor, "")
        val fakeUri = Uri.parse("content://foo")
        val fakeUri = Uri.parse("content://foo")
        var intent = creator.getImageEditIntent(fakeUri, context)
        var intent = creator.getImageEditIntent(fakeUri, context)
+12 −4
Original line number Original line Diff line number Diff line
@@ -34,6 +34,8 @@ import com.android.systemui.res.R;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;


import java.util.concurrent.atomic.AtomicReference;

@SmallTest
@SmallTest
@RunWith(AndroidJUnit4.class)
@RunWith(AndroidJUnit4.class)
public class DefaultIntentCreatorTest extends SysuiTestCase {
public class DefaultIntentCreatorTest extends SysuiTestCase {
@@ -73,12 +75,16 @@ public class DefaultIntentCreatorTest extends SysuiTestCase {
    }
    }


    @Test
    @Test
    public void test_getImageEditIntent() {
    public void test_getImageEditIntentAsync() {
        getContext().getOrCreateTestableResources().addOverride(R.string.config_screenshotEditor,
        getContext().getOrCreateTestableResources().addOverride(R.string.config_screenshotEditor,
                "");
                "");
        Uri fakeUri = Uri.parse("content://foo");
        Uri fakeUri = Uri.parse("content://foo");
        Intent intent = mIntentCreator.getImageEditIntent(fakeUri, getContext());
        final AtomicReference<Intent> intentHolder = new AtomicReference<>(null);
        mIntentCreator.getImageEditIntentAsync(fakeUri, getContext(), output -> {
            intentHolder.set(output);
        });


        Intent intent = intentHolder.get();
        assertEquals(Intent.ACTION_EDIT, intent.getAction());
        assertEquals(Intent.ACTION_EDIT, intent.getAction());
        assertEquals("image/*", intent.getType());
        assertEquals("image/*", intent.getType());
        assertEquals(null, intent.getComponent());
        assertEquals(null, intent.getComponent());
@@ -90,8 +96,10 @@ public class DefaultIntentCreatorTest extends SysuiTestCase {
                "com.android.remotecopy.RemoteCopyActivity");
                "com.android.remotecopy.RemoteCopyActivity");
        getContext().getOrCreateTestableResources().addOverride(R.string.config_screenshotEditor,
        getContext().getOrCreateTestableResources().addOverride(R.string.config_screenshotEditor,
                fakeComponent.flattenToString());
                fakeComponent.flattenToString());
        intent = mIntentCreator.getImageEditIntent(fakeUri, getContext());
        mIntentCreator.getImageEditIntentAsync(fakeUri, getContext(), output -> {
        assertEquals(fakeComponent, intent.getComponent());
            intentHolder.set(output);
        });
        assertEquals(fakeComponent, intentHolder.get().getComponent());
    }
    }


    @Test
    @Test
+16 −2
Original line number Original line Diff line number Diff line
@@ -24,11 +24,17 @@ import android.content.Intent
import android.net.Uri
import android.net.Uri
import android.text.TextUtils
import android.text.TextUtils
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.res.R
import com.android.systemui.res.R
import java.util.function.Consumer
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch


@SysUISingleton
@SysUISingleton
class ActionIntentCreator @Inject constructor() : IntentCreator {
class ActionIntentCreator
@Inject
constructor(@Application private val applicationScope: CoroutineScope) : IntentCreator {
    override fun getTextEditorIntent(context: Context?) =
    override fun getTextEditorIntent(context: Context?) =
        Intent(context, EditTextActivity::class.java).apply {
        Intent(context, EditTextActivity::class.java).apply {
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
@@ -65,7 +71,7 @@ class ActionIntentCreator @Inject constructor() : IntentCreator {
            .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    }
    }


    override fun getImageEditIntent(uri: Uri?, context: Context): Intent {
    suspend fun getImageEditIntent(uri: Uri?, context: Context): Intent {
        val editorPackage = context.getString(R.string.config_screenshotEditor)
        val editorPackage = context.getString(R.string.config_screenshotEditor)
        return Intent(Intent.ACTION_EDIT).apply {
        return Intent(Intent.ACTION_EDIT).apply {
            if (!TextUtils.isEmpty(editorPackage)) {
            if (!TextUtils.isEmpty(editorPackage)) {
@@ -78,6 +84,14 @@ class ActionIntentCreator @Inject constructor() : IntentCreator {
        }
        }
    }
    }


    override fun getImageEditIntentAsync(
        uri: Uri?,
        context: Context,
        outputConsumer: Consumer<Intent>,
    ) {
        applicationScope.launch { outputConsumer.accept(getImageEditIntent(uri, context)) }
    }

    override fun getRemoteCopyIntent(clipData: ClipData?, context: Context): Intent {
    override fun getRemoteCopyIntent(clipData: ClipData?, context: Context): Intent {
        val remoteCopyPackage = context.getString(R.string.config_remoteCopyPackage)
        val remoteCopyPackage = context.getString(R.string.config_remoteCopyPackage)
        return Intent(REMOTE_COPY_ACTION).apply {
        return Intent(REMOTE_COPY_ACTION).apply {
+8 −4
Original line number Original line Diff line number Diff line
@@ -558,8 +558,10 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv


    private void editImage(Uri uri) {
    private void editImage(Uri uri) {
        mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_EDIT_TAPPED);
        mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_EDIT_TAPPED);
        mContext.startActivity(mIntentCreator.getImageEditIntent(uri, mContext));
        mIntentCreator.getImageEditIntentAsync(uri, mContext, intent -> {
            mContext.startActivity(intent);
            animateOut();
            animateOut();
        });
    }
    }


    private void editText() {
    private void editText() {
@@ -747,8 +749,10 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
                            mIntentCreator.getTextEditorIntent(mContext));
                            mIntentCreator.getTextEditorIntent(mContext));
                    break;
                    break;
                case IMAGE:
                case IMAGE:
                    finishWithSharedTransition(CLIPBOARD_OVERLAY_EDIT_TAPPED,
                    mIntentCreator.getImageEditIntentAsync(mClipboardModel.getUri(), mContext,
                            mIntentCreator.getImageEditIntent(mClipboardModel.getUri(), mContext));
                            intent -> {
                                finishWithSharedTransition(CLIPBOARD_OVERLAY_EDIT_TAPPED, intent);
                            });
                    break;
                    break;
                default:
                default:
                    Log.w(TAG, "Got preview tapped callback for non-editable type "
                    Log.w(TAG, "Got preview tapped callback for non-editable type "
+4 −2
Original line number Original line Diff line number Diff line
@@ -27,6 +27,8 @@ import android.text.TextUtils;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.res.R;
import com.android.systemui.res.R;


import java.util.function.Consumer;

import javax.inject.Inject;
import javax.inject.Inject;


@SysUISingleton
@SysUISingleton
@@ -73,7 +75,7 @@ public class DefaultIntentCreator implements IntentCreator {
        return chooserIntent;
        return chooserIntent;
    }
    }


    public Intent getImageEditIntent(Uri uri, Context context) {
    public void getImageEditIntentAsync(Uri uri, Context context, Consumer<Intent> outputConsumer) {
        String editorPackage = context.getString(R.string.config_screenshotEditor);
        String editorPackage = context.getString(R.string.config_screenshotEditor);
        Intent editIntent = new Intent(Intent.ACTION_EDIT);
        Intent editIntent = new Intent(Intent.ACTION_EDIT);
        if (!TextUtils.isEmpty(editorPackage)) {
        if (!TextUtils.isEmpty(editorPackage)) {
@@ -83,7 +85,7 @@ public class DefaultIntentCreator implements IntentCreator {
        editIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        editIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        editIntent.putExtra(EXTRA_EDIT_SOURCE, EDIT_SOURCE_CLIPBOARD);
        editIntent.putExtra(EXTRA_EDIT_SOURCE, EDIT_SOURCE_CLIPBOARD);
        return editIntent;
        outputConsumer.accept(editIntent);
    }
    }


    public Intent getRemoteCopyIntent(ClipData clipData, Context context) {
    public Intent getRemoteCopyIntent(ClipData clipData, Context context) {
Loading