diff --git a/app/src/main/java/org/lsposed/manager/ConfigManager.java b/app/src/main/java/org/lsposed/manager/ConfigManager.java index f8479767..3e68f629 100644 --- a/app/src/main/java/org/lsposed/manager/ConfigManager.java +++ b/app/src/main/java/org/lsposed/manager/ConfigManager.java @@ -263,7 +263,9 @@ public class ConfigManager { } public static boolean isMagiskInstalled() { - return Arrays.stream(System.getenv("PATH").split(File.pathSeparator)) + var path = System.getenv("PATH"); + if (path == null) return false; + else return Arrays.stream(path.split(File.pathSeparator)) .anyMatch(str -> new File(str, "magisk").exists()); } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java index 99e01ae5..ac802638 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java @@ -180,13 +180,19 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.Listene .build()); try { Response reply = call.execute(); - var contentTypes = reply.header("content-type", "image/*;charset=utf-8").split(";\\s*"); + var header = reply.header("content-type", "image/*;charset=utf-8"); + String[] contentTypes = new String[0]; + if (header != null) { + contentTypes = header.split(";\\s*"); + } var mimeType = contentTypes.length > 0 ? contentTypes[0] : "image/*"; var charset = contentTypes.length > 1 ? contentTypes[1].split("=\\s*")[1] : "utf-8"; + var body = reply.body(); + if (body == null) return null; return new WebResourceResponse( mimeType, charset, - reply.body().byteStream() + body.byteStream() ); } catch (Throwable e) { return new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(Log.getStackTraceString(e).getBytes(StandardCharsets.UTF_8))); diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java index d1f6b4d7..d1866b76 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java @@ -255,7 +255,7 @@ public class SettingsFragment extends BaseFragment { var userLocale = App.getLocale(); var entries = new ArrayList(); entries.add(language.getEntries()[0]); - var lstLang = getAppLanguages(getContext(), R.string.Settings); + var lstLang = getAppLanguages(requireContext(), R.string.Settings); for (var lang : lstLang) { var locale = Locale.forLanguageTag(lang); entries.add(HtmlCompat.fromHtml(String.format("%s - %s", diff --git a/app/src/main/java/org/lsposed/manager/ui/widget/LinkifyTextView.java b/app/src/main/java/org/lsposed/manager/ui/widget/LinkifyTextView.java index 8cb31936..445413ec 100644 --- a/app/src/main/java/org/lsposed/manager/ui/widget/LinkifyTextView.java +++ b/app/src/main/java/org/lsposed/manager/ui/widget/LinkifyTextView.java @@ -57,7 +57,7 @@ public class LinkifyTextView extends androidx.appcompat.widget.AppCompatTextView @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(@NonNull MotionEvent event) { - // Let the parent or grandparent of TextView to handles click aciton. + // Let the parent or grandparent of TextView to handles click action. // Otherwise click effect like ripple will not work, and if touch area // do not contain a url, the TextView will still get MotionEvent. // onTouchEven must be called with MotionEvent.ACTION_DOWN for each touch diff --git a/app/src/main/java/org/lsposed/manager/util/theme/ThemeColorPreference.java b/app/src/main/java/org/lsposed/manager/util/theme/ThemeColorPreference.java index 75292496..ba6fe8d4 100644 --- a/app/src/main/java/org/lsposed/manager/util/theme/ThemeColorPreference.java +++ b/app/src/main/java/org/lsposed/manager/util/theme/ThemeColorPreference.java @@ -168,7 +168,7 @@ public class ThemeColorPreference extends DialogPreference { } public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { + new Parcelable.Creator<>() { @Override public SavedState createFromParcel(Parcel in) { return new SavedState(in); diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java index 3f6e8b0d..104a4f4d 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java @@ -166,7 +166,7 @@ public class LSPManagerService extends ILSPManagerService.Stub { var intent = PackageService.getLaunchIntentForPackage(BuildConfig.MANAGER_INJECTED_PKG_NAME); if (intent == null) { var pkgInfo = PackageService.getPackageInfo(BuildConfig.MANAGER_INJECTED_PKG_NAME, PackageManager.GET_ACTIVITIES, 0); - if (pkgInfo.activities != null && pkgInfo.activities.length > 0) { + if (pkgInfo != null && pkgInfo.activities != null && pkgInfo.activities.length > 0) { for (var activityInfo : pkgInfo.activities) { if (activityInfo.processName.equals(activityInfo.packageName)) { intent = new Intent(); @@ -177,10 +177,12 @@ public class LSPManagerService extends ILSPManagerService.Stub { } } } - if (intent.getCategories() != null) intent.getCategories().clear(); - intent.addCategory("org.lsposed.manager.LAUNCH_MANAGER"); - intent.setPackage(BuildConfig.MANAGER_INJECTED_PKG_NAME); - managerIntent = (Intent) intent.clone(); + if (intent != null && intent.getCategories() != null) { + intent.getCategories().clear(); + intent.addCategory("org.lsposed.manager.LAUNCH_MANAGER"); + intent.setPackage(BuildConfig.MANAGER_INJECTED_PKG_NAME); + managerIntent = (Intent) intent.clone(); + } } } catch (Throwable e) { Log.e(TAG, "get Intent", e); @@ -322,7 +324,10 @@ public class LSPManagerService extends ILSPManagerService.Stub { private void ensureWebViewPermission() { try { var pkgInfo = PackageService.getPackageInfo(BuildConfig.MANAGER_INJECTED_PKG_NAME, 0, 0); - var cacheDir = new File(HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(pkgInfo.applicationInfo) + "/cache"); + File cacheDir = null; + if (pkgInfo != null) { + cacheDir = new File(HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(pkgInfo.applicationInfo) + "/cache"); + } var webviewDir = new File(cacheDir, "WebView"); var httpCacheDir = new File(cacheDir, "http_cache"); ensureWebViewPermission(webviewDir); @@ -630,8 +635,10 @@ public class LSPManagerService extends ILSPManagerService.Stub { args.putString("value", hide ? "0" : "1"); args.putString("_user", "0"); try { - ActivityManagerService.getContentProvider("settings", 0) - .call("android", null, "settings", "PUT_global", "show_hidden_icon_apps_enabled", args); + var contentProvider = ActivityManagerService.getContentProvider("settings", 0); + if (contentProvider != null) { + contentProvider.call("android", null, "settings", "PUT_global", "show_hidden_icon_apps_enabled", args); + } } catch (RemoteException | NullPointerException e) { Log.w(TAG, "setHiddenIcon: ", e); } diff --git a/core/src/main/java/org/lsposed/lspd/util/MetaDataReader.java b/core/src/main/java/org/lsposed/lspd/util/MetaDataReader.java index f6daf360..e882843f 100644 --- a/core/src/main/java/org/lsposed/lspd/util/MetaDataReader.java +++ b/core/src/main/java/org/lsposed/lspd/util/MetaDataReader.java @@ -40,17 +40,22 @@ public class MetaDataReader { } private MetaDataReader(File apk) throws IOException { - try(JarFile zip = new JarFile(apk)) { + try (JarFile zip = new JarFile(apk)) { InputStream is = zip.getInputStream(zip.getEntry("AndroidManifest.xml")); - byte[] bytes = getBytesFromInputStream(is); - AxmlReader reader = new AxmlReader(bytes); - reader.accept(new AxmlVisitor() { - @Override - public NodeVisitor child(String ns, String name) { - NodeVisitor child = super.child(ns, name); - return new ManifestTagVisitor(child); - } - }); + byte[] bytes = getBytesFromInputStream(is); + AxmlReader reader = null; + if (bytes != null) { + reader = new AxmlReader(bytes); + } + if (reader != null) { + reader.accept(new AxmlVisitor() { + @Override + public NodeVisitor child(String ns, String name) { + NodeVisitor child = super.child(ns, name); + return new ManifestTagVisitor(child); + } + }); + } } } @@ -61,8 +66,7 @@ public class MetaDataReader { while ((n = inputStream.read(b)) != -1) { bos.write(b, 0, n); } - byte[] data = bos.toByteArray(); - return data; + return bos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } @@ -91,7 +95,7 @@ public class MetaDataReader { @Override public NodeVisitor child(String ns, String name) { NodeVisitor child = super.child(ns, name); - if("meta-data".equals(name)) { + if ("meta-data".equals(name)) { return new MetaDataVisitor(child); } return child; @@ -102,6 +106,7 @@ public class MetaDataReader { private class MetaDataVisitor extends NodeVisitor { public String name = null; public Object value = null; + public MetaDataVisitor(NodeVisitor child) { super(child); } @@ -109,9 +114,9 @@ public class MetaDataReader { @Override public void attr(String ns, String name, int resourceId, int type, Object obj) { if (type == 3 && "name".equals(name)) { - this.name = (String)obj; + this.name = (String) obj; } - if ("value".equals(name) ) { + if ("value".equals(name)) { value = obj; } super.attr(ns, name, resourceId, type, obj); @@ -119,7 +124,7 @@ public class MetaDataReader { @Override public void end() { - if(name != null && value != null) { + if (name != null && value != null) { metaData.put(name, value); } super.end(); diff --git a/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java b/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java index 8aebe882..d1f6dd08 100644 --- a/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java +++ b/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java @@ -203,7 +203,9 @@ public class ParasiticManagerHooker { try { var webViewDelegateConstructor = WebViewDelegate.class.getDeclaredConstructor(); webViewDelegateConstructor.setAccessible(true); - sProviderInstance = staticFactory.invoke(null, webViewDelegateConstructor.newInstance()); + if (staticFactory != null) { + sProviderInstance = staticFactory.invoke(null, webViewDelegateConstructor.newInstance()); + } XposedHelpers.setStaticObjectField(WebViewFactory.class, "sProviderInstance", sProviderInstance); Hookers.logD("Loaded provider: " + sProviderInstance); return sProviderInstance;