From 2617e7829d74c1d1c792bc24330e6a993d3d8d1c Mon Sep 17 00:00:00 2001 From: qii Date: Tue, 21 Jan 2020 11:53:35 +0800 Subject: [PATCH] feature: add Scene.startActivityForResult(Intent, Int, Bundle?) --- .../scene/ActivityCompatibilityUtility.java | 29 ++++++++++++++++ ...eneActivityCompatibilityLayerFragment.java | 33 +++++++++++++++++-- .../bytedance/scene/ktx/SceneExtensions.kt | 11 +++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/library/scene/src/main/java/com/bytedance/scene/ActivityCompatibilityUtility.java b/library/scene/src/main/java/com/bytedance/scene/ActivityCompatibilityUtility.java index 018913ea..7274801c 100644 --- a/library/scene/src/main/java/com/bytedance/scene/ActivityCompatibilityUtility.java +++ b/library/scene/src/main/java/com/bytedance/scene/ActivityCompatibilityUtility.java @@ -20,8 +20,10 @@ import android.arch.lifecycle.LifecycleOwner; import android.content.Intent; import android.os.Build; +import android.os.Bundle; import android.support.annotation.MainThread; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import com.bytedance.scene.interfaces.ActivityResultCallback; import com.bytedance.scene.interfaces.PermissionResultCallback; @@ -70,6 +72,33 @@ public void onActivityCreated() { } } + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + @MainThread + public static void startActivityForResult(@NonNull final Activity activity, @NonNull final LifecycleOwner lifecycleOwner, + @NonNull final Intent intent, final int requestCode, + @Nullable final Bundle options, + @NonNull final ActivityResultCallback resultCallback) { + ThreadUtility.checkUIThread(); + if (isDestroyed(activity, lifecycleOwner)) { + return; + } + final SceneActivityCompatibilityLayerFragment fragment = install(activity); + if (fragment.isAdded()) { + fragment.startActivityForResultByScene(lifecycleOwner, intent, requestCode, options, resultCallback); + } else { + fragment.addOnActivityCreatedCallback(new SceneActivityCompatibilityLayerFragment.OnActivityCreatedCallback() { + @Override + public void onActivityCreated() { + fragment.removeOnActivityCreatedCallback(this); + if (isDestroyed(activity, lifecycleOwner)) { + return; + } + fragment.startActivityForResultByScene(lifecycleOwner, intent, requestCode, options, resultCallback); + } + }); + } + } + @MainThread @RequiresApi(Build.VERSION_CODES.M) public static void requestPermissions(@NonNull final Activity activity, @NonNull final LifecycleOwner lifecycleOwner, diff --git a/library/scene/src/main/java/com/bytedance/scene/SceneActivityCompatibilityLayerFragment.java b/library/scene/src/main/java/com/bytedance/scene/SceneActivityCompatibilityLayerFragment.java index f267ea0e..62a2db89 100644 --- a/library/scene/src/main/java/com/bytedance/scene/SceneActivityCompatibilityLayerFragment.java +++ b/library/scene/src/main/java/com/bytedance/scene/SceneActivityCompatibilityLayerFragment.java @@ -77,7 +77,8 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { } @MainThread - void startActivityForResultByScene(@NonNull final LifecycleOwner lifecycleOwner, @NonNull Intent intent, final int requestCode, @NonNull ActivityResultCallback resultCallback) { + void startActivityForResultByScene(@NonNull final LifecycleOwner lifecycleOwner, @NonNull Intent intent, + final int requestCode, @NonNull ActivityResultCallback resultCallback) { if (!isCurrentStatusValid(lifecycleOwner)) { return; } @@ -97,9 +98,34 @@ void onDestroy() { }); } + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + @MainThread + void startActivityForResultByScene(@NonNull final LifecycleOwner lifecycleOwner, @NonNull Intent intent, + final int requestCode, @Nullable Bundle options, + @NonNull ActivityResultCallback resultCallback) { + if (!isCurrentStatusValid(lifecycleOwner)) { + return; + } + + if (requestCode < 0) { + startActivity(intent); + return; + } + mResultCallbackMap.put(requestCode, resultCallback); + startActivityForResult(intent, requestCode, options); + lifecycleOwner.getLifecycle().addObserver(new LifecycleObserver() { + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + void onDestroy() { + lifecycleOwner.getLifecycle().removeObserver(this); + mResultCallbackMap.remove(requestCode); + } + }); + } + @MainThread @RequiresApi(Build.VERSION_CODES.M) - void requestPermissionsByScene(@NonNull final LifecycleOwner lifecycleOwner, @NonNull String[] permissions, final int requestCode, @NonNull final PermissionResultCallback resultCallback) { + void requestPermissionsByScene(@NonNull final LifecycleOwner lifecycleOwner, @NonNull String[] permissions, + final int requestCode, @NonNull final PermissionResultCallback resultCallback) { if (!isCurrentStatusValid(lifecycleOwner)) { return; } @@ -149,7 +175,8 @@ private boolean isCurrentStatusValid(@NonNull final LifecycleOwner lifecycleOwne } @MainThread - void addConfigurationChangedListener(@NonNull final LifecycleOwner lifecycleOwner, @NonNull final ConfigurationChangedListener configurationChangedListener) { + void addConfigurationChangedListener(@NonNull final LifecycleOwner lifecycleOwner, + @NonNull final ConfigurationChangedListener configurationChangedListener) { if (!isCurrentStatusValid(lifecycleOwner)) { return; } diff --git a/library/scene_ktx/src/main/java/com/bytedance/scene/ktx/SceneExtensions.kt b/library/scene_ktx/src/main/java/com/bytedance/scene/ktx/SceneExtensions.kt index 86bceca3..beebe036 100644 --- a/library/scene_ktx/src/main/java/com/bytedance/scene/ktx/SceneExtensions.kt +++ b/library/scene_ktx/src/main/java/com/bytedance/scene/ktx/SceneExtensions.kt @@ -21,6 +21,7 @@ import android.arch.lifecycle.OnLifecycleEvent import android.content.Intent import android.content.res.Configuration import android.os.Build +import android.os.Bundle import android.os.Handler import android.os.Looper import android.support.annotation.RequiresApi @@ -103,6 +104,16 @@ fun Scene.startActivityForResult(intent: Intent, requestCode: Int, resultCallbac } } +@RequiresApi(Build.VERSION_CODES.JELLY_BEAN) +fun Scene.startActivityForResult(intent: Intent, requestCode: Int, options: Bundle?, resultCallback: (Int, Intent?) -> Unit) { + activity?.let { + ActivityCompatibilityUtility.startActivityForResult(it, this, intent, requestCode, options, + ActivityResultCallback { resultCode: Int, result: Intent? -> + resultCallback(resultCode, result) + }) + } +} + @RequiresApi(Build.VERSION_CODES.M) fun Scene.requestPermissions(permissions: Array, requestCode: Int, resultCallback: (IntArray?) -> Unit) { activity?.let {