[app] Fix crash of RepoItemFrag when module not found (#806)

* [app] Fix crash of RepoItemFrag when module not found

* Fix popup

* Fix tablet
This commit is contained in:
LoveSy 2021-07-07 11:49:02 +08:00 committed by GitHub
parent 4b769db0d5
commit 14e084e1c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 101 additions and 191 deletions

View File

@ -194,16 +194,17 @@ dependencies {
implementation("androidx.activity:activity:1.2.3") implementation("androidx.activity:activity:1.2.3")
implementation("androidx.browser:browser:1.3.0") implementation("androidx.browser:browser:1.3.0")
implementation("androidx.constraintlayout:constraintlayout:2.0.4") implementation("androidx.constraintlayout:constraintlayout:2.0.4")
implementation("androidx.core:core:1.5.0") implementation("androidx.core:core:1.6.0")
implementation("androidx.fragment:fragment:1.3.5") implementation("androidx.fragment:fragment:1.3.5")
implementation("androidx.navigation:navigation-fragment:$navVersion") implementation("androidx.navigation:navigation-fragment:$navVersion")
implementation("androidx.navigation:navigation-ui:$navVersion") implementation("androidx.navigation:navigation-ui:$navVersion")
implementation("androidx.recyclerview:recyclerview:1.2.1") implementation("androidx.recyclerview:recyclerview:1.2.1")
implementation("androidx.slidingpanelayout:slidingpanelayout:1.2.0-alpha03")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("com.caverock:androidsvg-aar:1.4") implementation("com.caverock:androidsvg-aar:1.4")
implementation("com.github.bumptech.glide:glide:$glideVersion") implementation("com.github.bumptech.glide:glide:$glideVersion")
implementation("com.github.bumptech.glide:okhttp3-integration:$glideVersion") implementation("com.github.bumptech.glide:okhttp3-integration:$glideVersion")
implementation("com.google.android.material:material:1.3.0") implementation("com.google.android.material:material:1.4.0")
implementation("com.google.code.gson:gson:2.8.7") implementation("com.google.code.gson:gson:2.8.7")
implementation("com.takisoft.preferencex:preferencex:1.1.0") implementation("com.takisoft.preferencex:preferencex:1.1.0")
implementation("com.takisoft.preferencex:preferencex-colorpicker:1.1.0") implementation("com.takisoft.preferencex:preferencex-colorpicker:1.1.0")

View File

@ -182,7 +182,7 @@ public class RepoLoader {
} }
public OnlineModule getOnlineModule(String packageName) { public OnlineModule getOnlineModule(String packageName) {
return onlineModules.get(packageName); return packageName == null ? null : onlineModules.get(packageName);
} }
public Collection<OnlineModule> getOnlineModules() { public Collection<OnlineModule> getOnlineModules() {

View File

@ -26,6 +26,7 @@ import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.navigation.NavController; import androidx.navigation.NavController;
@ -84,6 +85,15 @@ public class MainActivity extends BaseActivity {
return; return;
} }
NavController navController = navHostFragment.getNavController(); NavController navController = navHostFragment.getNavController();
if (binding.homeFragment != null) {
navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
if (destination.getId() == R.id.main_fragment) {
binding.navHostFragment.setVisibility(View.GONE);
} else {
binding.navHostFragment.setVisibility(View.VISIBLE);
}
});
}
if (intent.getAction() != null && intent.getAction().equals("android.intent.action.APPLICATION_PREFERENCES")) { if (intent.getAction() != null && intent.getAction().equals("android.intent.action.APPLICATION_PREFERENCES")) {
navController.navigate(R.id.action_settings_fragment); navController.navigate(R.id.action_settings_fragment);
} else if (intent.hasExtra("modulePackageName")) { } else if (intent.hasExtra("modulePackageName")) {

View File

@ -35,16 +35,7 @@ public class BaseFragment extends Fragment {
} }
public NavController getNavController() { public NavController getNavController() {
View view = getView(); return NavHostFragment.findNavController(this);
if (view == null) {
return NavHostFragment.findNavController(this);
}
View tabletFragmentContainer = view.findViewById(R.id.tablet_nav_container);
if (tabletFragmentContainer != null) {
return Navigation.findNavController(tabletFragmentContainer);
} else {
return Navigation.findNavController(view);
}
} }
public void setupToolbar(Toolbar toolbar, int title) { public void setupToolbar(Toolbar toolbar, int title) {

View File

@ -106,8 +106,9 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.Listene
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = FragmentPagerBinding.inflate(getLayoutInflater(), container, false); binding = FragmentPagerBinding.inflate(getLayoutInflater(), container, false);
String modulePackageName = getArguments().getString("modulePackageName"); if (module == null) return binding.getRoot();
String moduleName = getArguments().getString("moduleName"); String modulePackageName = module.getName();
String moduleName = module.getDescription();
binding.getRoot().bringChildToFront(binding.appBar); binding.getRoot().bringChildToFront(binding.appBar);
setupToolbar(binding.toolbar, moduleName, R.menu.menu_repo_item); setupToolbar(binding.toolbar, moduleName, R.menu.menu_repo_item);
binding.toolbar.setSubtitle(modulePackageName); binding.toolbar.setSubtitle(modulePackageName);
@ -137,9 +138,10 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.Listene
RepoLoader.getInstance().addListener(this); RepoLoader.getInstance().addListener(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String modulePackageName = getArguments().getString("modulePackageName"); String modulePackageName = getArguments() == null ? null : getArguments().getString("modulePackageName");
module = RepoLoader.getInstance().getOnlineModule(modulePackageName); module = RepoLoader.getInstance().getOnlineModule(modulePackageName);
if (module == null)
getNavController().navigate(R.id.action_repo_item_fragment_to_repo_fragment);
} }
private void renderGithubMarkdown(WebView view, String text) { private void renderGithubMarkdown(WebView view, String text) {

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ This file is part of LSPosed.
~
~ LSPosed is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ LSPosed is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with LSPosed. If not, see <https://www.gnu.org/licenses/>.
~
~ Copyright (C) 2021 LSPosed Contributors
-->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.slidingpanelayout.widget.SlidingPaneLayout
android:id="@+id/snackbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true" >
<androidx.fragment.app.FragmentContainerView
android:id="@+id/home_fragment"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_weight="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:name="org.lsposed.manager.ui.fragment.HomeFragment"/>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_weight="3"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
</androidx.slidingpanelayout.widget.SlidingPaneLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,53 +0,0 @@
<!--
~ This file is part of LSPosed.
~
~ LSPosed is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ LSPosed is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with LSPosed. If not, see <https://www.gnu.org/licenses/>.
~
~ Copyright (C) 2021 LSPosed Contributors
-->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:consumeSystemWindowsInsets="start|end"
app:edgeToEdge="true"
app:fitsSystemWindowsInsets="start|end">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/snackbar"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_weight="1">
<include layout="@layout/fragment_home" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/tablet_nav_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
app:defaultNavHost="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toEndOf="@+id/snackbar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:navGraph="@navigation/sub_nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -125,6 +125,16 @@
<argument <argument
android:name="moduleName" android:name="moduleName"
app:argType="string" /> app:argType="string" />
<action
android:id="@+id/action_repo_item_fragment_to_repo_fragment"
app:destination="@id/repo_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop"
app:popUpTo="@id/main_fragment"
app:popUpToInclusive="true" />
</fragment> </fragment>
<action <action
android:id="@+id/action_settings_fragment" android:id="@+id/action_settings_fragment"
@ -132,28 +142,36 @@
app:enterAnim="@anim/fragment_enter" app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit" app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop" app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" /> app:popExitAnim="@anim/fragment_exit_pop"
app:popUpTo="@id/settings_fragment"
app:popUpToInclusive="true" />
<action <action
android:id="@+id/action_logs_fragment" android:id="@+id/action_logs_fragment"
app:destination="@id/logs_fragment" app:destination="@id/logs_fragment"
app:enterAnim="@anim/fragment_enter" app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit" app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop" app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" /> app:popExitAnim="@anim/fragment_exit_pop"
app:popUpTo="@id/logs_fragment"
app:popUpToInclusive="true" />
<action <action
android:id="@+id/action_repo_fragment" android:id="@+id/action_repo_fragment"
app:destination="@id/repo_fragment" app:destination="@id/repo_fragment"
app:enterAnim="@anim/fragment_enter" app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit" app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop" app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" /> app:popExitAnim="@anim/fragment_exit_pop"
app:popUpTo="@id/repo_fragment"
app:popUpToInclusive="true" />
<action <action
android:id="@+id/action_modules_fragment" android:id="@+id/action_modules_fragment"
app:destination="@id/modules_fragment" app:destination="@id/modules_fragment"
app:enterAnim="@anim/fragment_enter" app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit" app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop" app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" /> app:popExitAnim="@anim/fragment_exit_pop"
app:popUpTo="@id/modules_fragment"
app:popUpToInclusive="true" />
<action <action
android:id="@+id/action_app_list_fragment" android:id="@+id/action_app_list_fragment"
app:destination="@id/app_list_fragment" app:destination="@id/app_list_fragment"

View File

@ -1,115 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ This file is part of LSPosed.
~
~ LSPosed is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ LSPosed is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with LSPosed. If not, see <https://www.gnu.org/licenses/>.
~
~ Copyright (C) 2021 LSPosed Contributors
-->
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph_details"
app:startDestination="@id/modules_fragment">
<fragment
android:id="@+id/logs_fragment"
android:name="org.lsposed.manager.ui.fragment.LogsFragment"
android:label="logs" />
<fragment
android:id="@+id/modules_fragment"
android:name="org.lsposed.manager.ui.fragment.ModulesFragment"
android:label="modules">
<action
android:id="@+id/action_modules_fragment_to_app_list_fragment"
app:destination="@id/app_list_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" />
<action
android:id="@+id/action_modules_fragment_to_repo_item_fragment"
app:destination="@id/repo_item_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" />
</fragment>
<fragment
android:id="@+id/settings_fragment"
android:name="org.lsposed.manager.ui.fragment.SettingsFragment"
android:label="settings" />
<fragment
android:id="@+id/app_list_fragment"
android:name="org.lsposed.manager.ui.fragment.AppListFragment"
android:label="app_list">
<argument
android:name="modulePackageName"
app:argType="string" />
<argument
android:name="moduleUserId"
app:argType="integer" />
</fragment>
<fragment
android:id="@+id/repo_fragment"
android:name="org.lsposed.manager.ui.fragment.RepoFragment"
android:label="repo">
<action
android:id="@+id/action_repo_fragment_to_repo_item_fragment"
app:destination="@id/repo_item_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" />
</fragment>
<fragment
android:id="@+id/repo_item_fragment"
android:name="org.lsposed.manager.ui.fragment.RepoItemFragment"
android:label="repo_item">
<argument
android:name="modulePackageName"
app:argType="string" />
<argument
android:name="moduleName"
app:argType="string" />
</fragment>
<action
android:id="@+id/action_settings_fragment"
app:destination="@id/settings_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" />
<action
android:id="@+id/action_logs_fragment"
app:destination="@id/logs_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" />
<action
android:id="@+id/action_repo_fragment"
app:destination="@id/repo_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" />
<action
android:id="@+id/action_modules_fragment"
app:destination="@id/modules_fragment"
app:enterAnim="@anim/fragment_enter"
app:exitAnim="@anim/fragment_exit"
app:popEnterAnim="@anim/fragment_enter_pop"
app:popExitAnim="@anim/fragment_exit_pop" />
</navigation>

View File

@ -25,7 +25,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath("com.android.tools.build:gradle:7.0.0-beta04") classpath("com.android.tools.build:gradle:7.0.0-beta05")
classpath("org.eclipse.jgit:org.eclipse.jgit:5.10.0.202012080955-r") classpath("org.eclipse.jgit:org.eclipse.jgit:5.10.0.202012080955-r")
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5") classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5")
} }

View File

@ -60,7 +60,7 @@ dependencies {
implementation("dev.rikka.ndk:riru:${moduleMinRiruVersionName}") implementation("dev.rikka.ndk:riru:${moduleMinRiruVersionName}")
implementation("dev.rikka.ndk.thirdparty:cxx:1.1.0") implementation("dev.rikka.ndk.thirdparty:cxx:1.1.0")
implementation("io.github.vvb2060.ndk:dobby:1.2") implementation("io.github.vvb2060.ndk:dobby:1.2")
implementation("com.android.tools.build:apksig:7.0.0-beta03") implementation("com.android.tools.build:apksig:7.0.0-beta05")
implementation("org.apache.commons:commons-lang3:3.12.0") implementation("org.apache.commons:commons-lang3:3.12.0")
implementation("de.upb.cs.swt:axml:2.1.1") implementation("de.upb.cs.swt:axml:2.1.1")
compileOnly(project(":hiddenapi-stubs")) compileOnly(project(":hiddenapi-stubs"))