From eb12c2c4c5bc6ed05bdc6fa6fb5324b6cdf62462 Mon Sep 17 00:00:00 2001 From: "pengfei.zhou" Date: Mon, 9 Dec 2019 18:01:40 +0800 Subject: [PATCH] feat:use Navigation to manage DoricPanelFragment --- doric/build.gradle | 7 ++- .../main/java/pub/doric/DoricActivity.java | 13 +---- .../main/java/pub/doric/DoricFragment.java | 52 ++++++++----------- .../java/pub/doric/DoricPanelFragment.java | 44 ++++++++++------ .../java/pub/doric/plugin/NavBarPlugin.java | 7 --- .../pub/doric/plugin/NavigatorPlugin.java | 14 ++++- .../shader/flowlayout/FlowLayoutNode.java | 2 - doric/src/main/res/layout/doric_fragment.xml | 22 ++++++-- .../main/res/layout/doric_framgent_panel.xml | 17 ++---- .../main/res/navigation/doric_navigation.xml | 14 +++++ 10 files changed, 103 insertions(+), 89 deletions(-) create mode 100644 doric/src/main/res/navigation/doric_navigation.xml diff --git a/doric/build.gradle b/doric/build.gradle index fa8f9b0c..33327fad 100644 --- a/doric/build.gradle +++ b/doric/build.gradle @@ -40,8 +40,13 @@ dependencies { implementation 'com.github.penfeizhou.android.animation:glide-plugin:1.3.1' implementation 'com.google.code.gson:gson:2.8.6' implementation "com.google.android.material:material:1.0.0" - testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + + + def nav_version = "2.1.0" + + implementation "androidx.navigation:navigation-fragment:$nav_version" + implementation "androidx.navigation:navigation-ui:$nav_version" } diff --git a/doric/src/main/java/pub/doric/DoricActivity.java b/doric/src/main/java/pub/doric/DoricActivity.java index ad225b6d..266d04e6 100644 --- a/doric/src/main/java/pub/doric/DoricActivity.java +++ b/doric/src/main/java/pub/doric/DoricActivity.java @@ -26,8 +26,6 @@ import androidx.appcompat.app.AppCompatActivity; * @CreateDate: 2019-11-19 */ public class DoricActivity extends AppCompatActivity { - private DoricFragment doricFragment; - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -35,19 +33,10 @@ public class DoricActivity extends AppCompatActivity { if (savedInstanceState == null) { String scheme = getIntent().getStringExtra("scheme"); String alias = getIntent().getStringExtra("alias"); - doricFragment = DoricFragment.newInstance(scheme, alias); + DoricFragment doricFragment = DoricFragment.newInstance(scheme, alias); getSupportFragmentManager().beginTransaction() .add(R.id.container, doricFragment) .commit(); } } - - @Override - public void onBackPressed() { - if (doricFragment.canPop()) { - doricFragment.pop(); - } else { - super.onBackPressed(); - } - } } diff --git a/doric/src/main/java/pub/doric/DoricFragment.java b/doric/src/main/java/pub/doric/DoricFragment.java index e64117b3..3d7f5661 100644 --- a/doric/src/main/java/pub/doric/DoricFragment.java +++ b/doric/src/main/java/pub/doric/DoricFragment.java @@ -20,18 +20,19 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; - -import pub.doric.navigator.IDoricNavigator; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; /** * @Description: pub.doric * @Author: pengfei.zhou * @CreateDate: 2019-11-23 */ -public class DoricFragment extends Fragment implements IDoricNavigator { +public class DoricFragment extends Fragment { public static DoricFragment newInstance(String scheme, String alias) { Bundle args = new Bundle(); @@ -42,6 +43,23 @@ public class DoricFragment extends Fragment implements IDoricNavigator { return fragment; } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host); + if (!navController.popBackStack()) { + if (getActivity() != null) { + getActivity().finish(); + } + } + } + }; + requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); + } + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -51,34 +69,6 @@ public class DoricFragment extends Fragment implements IDoricNavigator { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - Bundle argument = getArguments(); - if (argument != null) { - String alias = argument.getString("alias"); - String scheme = argument.getString("scheme"); - push(scheme, alias); - } } - @Override - public void push(String scheme, String alias) { - getChildFragmentManager().beginTransaction() - .add(R.id.root, DoricPanelFragment.newInstance(scheme, alias)) - .addToBackStack(scheme) - .commit(); - } - - @Override - public void pop() { - if (canPop()) { - getChildFragmentManager().popBackStack(); - } else { - if (getActivity() != null) { - getActivity().finish(); - } - } - } - - public boolean canPop() { - return getChildFragmentManager().getBackStackEntryCount() > 1; - } } diff --git a/doric/src/main/java/pub/doric/DoricPanelFragment.java b/doric/src/main/java/pub/doric/DoricPanelFragment.java index 12653e8d..c6b7c7a8 100644 --- a/doric/src/main/java/pub/doric/DoricPanelFragment.java +++ b/doric/src/main/java/pub/doric/DoricPanelFragment.java @@ -23,6 +23,8 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; import pub.doric.async.AsyncResult; import pub.doric.loader.DoricJSLoaderManager; @@ -35,18 +37,8 @@ import pub.doric.utils.DoricLog; * @Author: pengfei.zhou * @CreateDate: 2019-11-23 */ -public class DoricPanelFragment extends Fragment { +public class DoricPanelFragment extends Fragment implements IDoricNavigator { private DoricPanel doricPanel; - private BaseDoricNavBar navBar; - - public static DoricPanelFragment newInstance(String scheme, String alias) { - Bundle args = new Bundle(); - args.putString("scheme", scheme); - args.putString("alias", alias); - DoricPanelFragment fragment = new DoricPanelFragment(); - fragment.setArguments(args); - return fragment; - } @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -58,8 +50,12 @@ public class DoricPanelFragment extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); doricPanel = view.findViewById(R.id.doric_panel); - navBar = view.findViewById(R.id.doric_nav_bar); Bundle argument = getArguments(); + if (argument == null) { + if (getActivity() != null && getActivity().getIntent() != null) { + argument = getActivity().getIntent().getExtras(); + } + } if (argument == null) { DoricLog.e("DoricPanelFragment argument is null"); return; @@ -71,10 +67,8 @@ public class DoricPanelFragment extends Fragment { public void onResult(String result) { doricPanel.config(result, alias); DoricContext context = doricPanel.getDoricContext(); - Fragment fragment = getParentFragment(); - if (fragment instanceof IDoricNavigator) { - context.setDoricNavigator((IDoricNavigator) fragment); - } + context.setDoricNavigator(DoricPanelFragment.this); + BaseDoricNavBar navBar = requireActivity().getWindow().getDecorView().findViewById(R.id.doric_nav_bar); context.setDoricNavBar(navBar); } @@ -89,4 +83,22 @@ public class DoricPanelFragment extends Fragment { } }); } + + @Override + public void push(String scheme, String alias) { + Bundle argument = new Bundle(); + argument.putString("scheme", scheme); + argument.putString("alias", alias); + getNavController() + .navigate(R.id.action_doricPanelFragment_to_doricPanelFragment, argument); + } + + @Override + public void pop() { + getNavController().popBackStack(); + } + + private NavController getNavController() { + return Navigation.findNavController(getView()); + } } diff --git a/doric/src/main/java/pub/doric/plugin/NavBarPlugin.java b/doric/src/main/java/pub/doric/plugin/NavBarPlugin.java index f1b9a7b8..ff21d8d0 100644 --- a/doric/src/main/java/pub/doric/plugin/NavBarPlugin.java +++ b/doric/src/main/java/pub/doric/plugin/NavBarPlugin.java @@ -61,13 +61,6 @@ public class NavBarPlugin extends DoricJavaPlugin { JSObject jsObject = jsDecoder.decode().asObject(); boolean hidden = jsObject.getProperty("hidden").asBoolean().value(); navBar.setHidden(hidden); - View v = getDoricContext().getRootNode().getNodeView(); - ViewGroup.LayoutParams params = v.getLayoutParams(); - if (params instanceof ViewGroup.MarginLayoutParams) { - ((ViewGroup.MarginLayoutParams) params).topMargin = - hidden ? 0 - : ((View) navBar).getMeasuredHeight(); - } promise.resolve(); } catch (ArchiveException e) { e.printStackTrace(); diff --git a/doric/src/main/java/pub/doric/plugin/NavigatorPlugin.java b/doric/src/main/java/pub/doric/plugin/NavigatorPlugin.java index 372529ec..b28f9251 100644 --- a/doric/src/main/java/pub/doric/plugin/NavigatorPlugin.java +++ b/doric/src/main/java/pub/doric/plugin/NavigatorPlugin.java @@ -18,10 +18,13 @@ package pub.doric.plugin; import com.github.pengfeizhou.jscore.ArchiveException; import com.github.pengfeizhou.jscore.JSDecoder; import com.github.pengfeizhou.jscore.JSObject; +import com.github.pengfeizhou.jscore.JavaValue; +import pub.doric.Doric; import pub.doric.DoricContext; import pub.doric.extension.bridge.DoricMethod; import pub.doric.extension.bridge.DoricPlugin; +import pub.doric.extension.bridge.DoricPromise; import pub.doric.navigator.IDoricNavigator; import pub.doric.utils.ThreadMode; @@ -37,7 +40,7 @@ public class NavigatorPlugin extends DoricJavaPlugin { } @DoricMethod(thread = ThreadMode.UI) - public void push(JSDecoder jsDecoder) { + public void push(JSDecoder jsDecoder, DoricPromise promise) { IDoricNavigator navigator = getDoricContext().getDoricNavigator(); if (navigator != null) { try { @@ -45,17 +48,24 @@ public class NavigatorPlugin extends DoricJavaPlugin { navigator.push(jsObject.getProperty("scheme").asString().value(), jsObject.getProperty("alias").asString().value() ); + promise.resolve(); } catch (ArchiveException e) { e.printStackTrace(); + promise.reject(new JavaValue(e.getLocalizedMessage())); } + } else { + promise.reject(new JavaValue("Navigator not implemented")); } } @DoricMethod(thread = ThreadMode.UI) - public void pop() { + public void pop(DoricPromise promise) { IDoricNavigator navigator = getDoricContext().getDoricNavigator(); if (navigator != null) { navigator.pop(); + promise.resolve(); + } else { + promise.reject(new JavaValue("Navigator not implemented")); } } } diff --git a/doric/src/main/java/pub/doric/shader/flowlayout/FlowLayoutNode.java b/doric/src/main/java/pub/doric/shader/flowlayout/FlowLayoutNode.java index e7d44a06..14e7b94c 100644 --- a/doric/src/main/java/pub/doric/shader/flowlayout/FlowLayoutNode.java +++ b/doric/src/main/java/pub/doric/shader/flowlayout/FlowLayoutNode.java @@ -16,8 +16,6 @@ package pub.doric.shader.flowlayout; import android.graphics.Rect; -import android.os.SystemClock; -import android.view.MotionEvent; import android.view.View; import androidx.annotation.NonNull; diff --git a/doric/src/main/res/layout/doric_fragment.xml b/doric/src/main/res/layout/doric_fragment.xml index 7af124c8..539a884b 100644 --- a/doric/src/main/res/layout/doric_fragment.xml +++ b/doric/src/main/res/layout/doric_fragment.xml @@ -1,7 +1,21 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/doric/src/main/res/layout/doric_framgent_panel.xml b/doric/src/main/res/layout/doric_framgent_panel.xml index 237f04c3..dba2e8e6 100644 --- a/doric/src/main/res/layout/doric_framgent_panel.xml +++ b/doric/src/main/res/layout/doric_framgent_panel.xml @@ -1,18 +1,7 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/doric/src/main/res/navigation/doric_navigation.xml b/doric/src/main/res/navigation/doric_navigation.xml new file mode 100644 index 00000000..61bff7b0 --- /dev/null +++ b/doric/src/main/res/navigation/doric_navigation.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file