Skip to content

Commit

Permalink
feat(core): support Fragment.startActivityForResult
Browse files Browse the repository at this point in the history
close #569
  • Loading branch information
shifujun committed Jul 29, 2021
1 parent 89a753c commit 0227691
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,21 @@ public static void fragmentStartActivity(Fragment fragment, Intent intent, Bundl
}
}

public static void fragmentStartActivityForResult(Fragment fragment, Intent intent, int requestCode) {
fragmentStartActivityForResult(fragment, intent, requestCode, null);
}

public static void fragmentStartActivityForResult(Fragment fragment, Intent intent, int requestCode, Bundle options) {
ShadowContext shadowContext = fragmentGetActivity(fragment);
Intent containerActivityIntent
= shadowContext.mPluginComponentLauncher.convertPluginActivityIntent(intent);
if (options == null) {
fragment.startActivityForResult(containerActivityIntent, requestCode);
} else {
fragment.startActivityForResult(containerActivityIntent, requestCode, options);
}
}

public static Context toPluginContext(Context pluginContainerActivity) {
return PluginActivity.get((PluginContainerActivity) pluginContainerActivity);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,19 @@ class FragmentSupportTransform : SpecificTransform() {
Descriptor.ofMethod(CtClass.voidType,
arrayOf(androidFragment, androidIntent, androidBundle)))

val startActivityForResultMethod1 = androidFragment.getMethod("startActivityForResult",
Descriptor.ofMethod(CtClass.voidType,
arrayOf(androidIntent, CtClass.intType)))
val fragmentStartActivityForResultMethod1 = shadowFragmentSupport.getMethod("fragmentStartActivityForResult",
Descriptor.ofMethod(CtClass.voidType,
arrayOf(androidFragment, androidIntent, CtClass.intType)))
val startActivityForResultMethod2 = androidFragment.getMethod("startActivityForResult",
Descriptor.ofMethod(CtClass.voidType,
arrayOf(androidIntent, CtClass.intType, androidBundle)))
val fragmentStartActivityForResultMethod2 = shadowFragmentSupport.getMethod("fragmentStartActivityForResult",
Descriptor.ofMethod(CtClass.voidType,
arrayOf(androidFragment, androidIntent, CtClass.intType, androidBundle)))

/**
* 调用插件Fragment的Activity相关方法时将ContainerActivity转换成ShadowActivity
*/
Expand All @@ -106,6 +119,14 @@ class FragmentSupportTransform : SpecificTransform() {
startActivityMethod2,
fragmentStartActivityMethod2
)
codeConverter.redirectMethodCallToStatic(
startActivityForResultMethod1,
fragmentStartActivityForResultMethod1
)
codeConverter.redirectMethodCallToStatic(
startActivityForResultMethod2,
fragmentStartActivityForResultMethod2
)
try {
ctClass.instrument(codeConverter)
} catch (e: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ public void startActivity(Intent intent, Bundle options) {

}

public void startActivityForResult(Intent intent, int requestCode) {

}

public void startActivityForResult(Intent intent, int requestCode, Bundle options) {

}

public void onAttach(Context context) {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ public void fragmentStartActivity(Fragment fragment, Intent intent) {
public void fragmentStartActivity(Fragment fragment, Intent intent, Bundle options) {
}

public static void fragmentStartActivityForResult(Fragment fragment, Intent intent, int requestCode) {
}

public static void fragmentStartActivityForResult(Fragment fragment, Intent intent, int requestCode, Bundle options) {
}

public static Context toPluginContext(Context pluginContainerActivity) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package test.fragment;

import android.content.Intent;
import android.os.Bundle;

import com.tencent.shadow.core.runtime.ShadowActivity;

public class UseStartActivityForResultFragment {

ShadowActivity test(TestFragment fragment) {
fragment.startActivityForResult(new Intent(), 1);
fragment.startActivityForResult(new Intent(), 1, new Bundle());
return fragment.getActivity();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class FragmentSupportTransformTest : AbstractTransformTest() {
val fragmentGetActivity = shadowFragmentSupportClazz.getMethod("fragmentGetActivity", "($FragmentSig)$ShadowActivitySig")
val fragmentStartActivity1 = shadowFragmentSupportClazz.getMethod("fragmentStartActivity", "($FragmentSig$IntentSig)V")
val fragmentStartActivity2 = shadowFragmentSupportClazz.getMethod("fragmentStartActivity", "($FragmentSig$IntentSig$BundleSig)V")
val fragmentStartActivityForResult1 = shadowFragmentSupportClazz.getMethod("fragmentStartActivityForResult", "($FragmentSig${IntentSig}I)V")
val fragmentStartActivityForResult2 = shadowFragmentSupportClazz.getMethod("fragmentStartActivityForResult", "($FragmentSig${IntentSig}I$BundleSig)V")

private fun transform(clazz: CtClass) {
val transform = FragmentSupportTransform()
Expand Down Expand Up @@ -98,6 +100,26 @@ class FragmentSupportTransformTest : AbstractTransformTest() {
)
}

@Test
fun fragmentStartActivityForResult() {
val name = "test.fragment.UseStartActivityForResultFragment"
transform(sLoader[name])

val transformedClass = dLoader.get(name)
try {
transformedClass.getMethod("test", "($TestFragmentSig)$ShadowActivitySig")
} catch (e: Exception) {
Assert.fail("找不到正确的test方法")
}

Assert.assertTrue("${fragmentStartActivityForResult1}调用应该可以找到",
matchMethodCallInClass(fragmentStartActivityForResult1, transformedClass)
)
Assert.assertTrue("${fragmentStartActivityForResult2}调用应该可以找到",
matchMethodCallInClass(fragmentStartActivityForResult2, transformedClass)
)
}

@Test
fun attachContext() {
val name = "test.fragment.TestFragment"
Expand Down

0 comments on commit 0227691

Please sign in to comment.