From a228957b6eaa753472635b524d09b2a136a4683a Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 22 Jul 2022 17:39:04 +0800 Subject: [PATCH] Support local config --- app/src/main/AndroidManifest.xml | 1 + .../main/java/com/fongmi/bear/ApiConfig.java | 77 ++++++++++++------- .../java/com/fongmi/bear/net/Callback.java | 2 +- .../fongmi/bear/ui/activity/HomeActivity.java | 7 -- .../bear/ui/activity/SettingActivity.java | 28 ++++++- .../java/com/fongmi/bear/utils/FileUtil.java | 18 ++++- .../com/github/catvod/crawler/JarLoader.java | 18 +---- 7 files changed, 97 insertions(+), 54 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e94c9a94d..5ad59f29d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + callback.error(0)); - return; - } - OKHttp.get().client().newCall(new Request.Builder().url(Prefers.getUrl()).build()).enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - try { - JsonObject object = new Gson().fromJson(response.body().string(), JsonObject.class); - String spider = Json.safeString(object, "spider", ""); - parseJson(object); - loadJar(spider); - handler.post(callback::success); - } catch (Exception e) { - handler.post(() -> callback.error(R.string.error_config_parse)); - } + String url = Prefers.getUrl(); + new Thread(() -> { + if (url.startsWith("file://")) { + getFileConfig(url, callback); + } else if (Patterns.WEB_URL.matcher(url).matches()) { + getWebConfig(url, callback); + } else { + handler.post(() -> callback.error(0)); } + }).start(); + } - @Override - public void onFailure(@NonNull Call call, @NonNull IOException e) { - handler.post(() -> callback.error(R.string.error_config_get)); - } - }); + private void getFileConfig(String url, Callback callback) { + try { + JsonReader reader = new JsonReader(new FileReader(FileUtil.getLocal(url))); + parseConfig(new Gson().fromJson(reader, JsonObject.class), callback); + } catch (Exception e) { + handler.post(() -> callback.error(R.string.error_config_get)); + } + } + + private void getWebConfig(String url, Callback callback) { + try { + Response response = OKHttp.get().client().newCall(new Request.Builder().url(url).build()).execute(); + parseConfig(new Gson().fromJson(response.body().string(), JsonObject.class), callback); + } catch (IOException e) { + handler.post(() -> callback.error(R.string.error_config_get)); + } + } + + private void parseConfig(JsonObject object, Callback callback) { + try { + String spider = Json.safeString(object, "spider", ""); + parseJson(object); + parseJar(spider); + handler.post(callback::success); + } catch (Exception e) { + e.printStackTrace(); + handler.post(() -> callback.error(R.string.error_config_parse)); + } } private void parseJson(JsonObject object) { @@ -117,10 +134,14 @@ public class ApiConfig { ads.addAll(Json.safeList(object, "ads")); } - private void loadJar(String spider) throws Exception { - Request request = new Request.Builder().url(spider).build(); - Response response = OKHttp.get().client().newCall(request).execute(); - loader.load(response.body().bytes()); + private void parseJar(String spider) throws Exception { + if (spider.startsWith("file://")) { + loader.load(FileUtil.getLocal(spider)); + } else if (Patterns.WEB_URL.matcher(spider).matches()) { + Response response = OKHttp.get().client().newCall(new Request.Builder().url(spider).build()).execute(); + FileUtil.write(FileUtil.getJar(), response.body().bytes()); + loader.load(FileUtil.getJar()); + } } public Spider getCSP(Site site) { diff --git a/app/src/main/java/com/fongmi/bear/net/Callback.java b/app/src/main/java/com/fongmi/bear/net/Callback.java index 113a5fbf3..5dd4de214 100644 --- a/app/src/main/java/com/fongmi/bear/net/Callback.java +++ b/app/src/main/java/com/fongmi/bear/net/Callback.java @@ -21,6 +21,6 @@ public abstract class Callback implements okhttp3.Callback { } @Override - public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + public void onResponse(@NonNull Call call, @NonNull Response response) { } } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java index f19d582fd..05bbfcc26 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java @@ -17,7 +17,6 @@ import com.fongmi.bear.bean.Result; import com.fongmi.bear.bean.Vod; import com.fongmi.bear.databinding.ActivityHomeBinding; import com.fongmi.bear.model.SiteViewModel; -import com.fongmi.bear.player.Players; import com.fongmi.bear.ui.custom.CustomRowPresenter; import com.fongmi.bear.ui.custom.CustomSelector; import com.fongmi.bear.ui.presenter.FuncPresenter; @@ -129,10 +128,4 @@ public class HomeActivity extends BaseActivity implements VodPresenter.OnClickLi if (resultCode != RESULT_OK) return; getVideo(); } - - @Override - protected void onDestroy() { - Players.get().release(); - super.onDestroy(); - } } \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java index 64152b065..aa1a9bc19 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java @@ -1,18 +1,25 @@ package com.fongmi.bear.ui.activity; +import android.Manifest; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; +import android.util.Patterns; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; import androidx.leanback.widget.ArrayObjectAdapter; import androidx.leanback.widget.ItemBridgeAdapter; import androidx.viewbinding.ViewBinding; import com.fongmi.bear.ApiConfig; +import com.fongmi.bear.R; import com.fongmi.bear.bean.Site; import com.fongmi.bear.databinding.ActivitySettingBinding; import com.fongmi.bear.databinding.DialogConfigBinding; @@ -31,6 +38,11 @@ public class SettingActivity extends BaseActivity { activity.startActivityForResult(new Intent(activity, SettingActivity.class), 1000); } + private final ActivityResultLauncher permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { + if (!isGranted) Notify.show(R.string.error_config_get); + else loadConfig(); + }); + @Override protected ViewBinding getBinding() { return mBinding = ActivitySettingBinding.inflate(getLayoutInflater()); @@ -57,7 +69,7 @@ public class SettingActivity extends BaseActivity { mBinding.url.setText(Prefers.getUrl()); Notify.progress(this); ApiConfig.get().clear(); - loadConfig(); + checkUrl(); }); bindingDialog.url.setOnEditorActionListener((textView, actionId, event) -> { if (actionId == EditorInfo.IME_ACTION_DONE) dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick(); @@ -65,6 +77,20 @@ public class SettingActivity extends BaseActivity { }); } + private void checkUrl() { + if (Patterns.WEB_URL.matcher(Prefers.getUrl()).matches()) { + loadConfig(); + return; + } + if (Prefers.getUrl().startsWith("file://")) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + loadConfig(); + } else { + permissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + } + private void loadConfig() { ApiConfig.get().loadConfig(new Callback() { @Override diff --git a/app/src/main/java/com/fongmi/bear/utils/FileUtil.java b/app/src/main/java/com/fongmi/bear/utils/FileUtil.java index 78932b2c1..fc736f2af 100644 --- a/app/src/main/java/com/fongmi/bear/utils/FileUtil.java +++ b/app/src/main/java/com/fongmi/bear/utils/FileUtil.java @@ -1,11 +1,18 @@ package com.fongmi.bear.utils; +import android.os.Environment; + import com.fongmi.bear.App; import java.io.File; +import java.io.FileOutputStream; public class FileUtil { + public static String getRootPath() { + return Environment.getExternalStorageDirectory().getAbsolutePath(); + } + public static File getCacheDir() { return App.get().getExternalCacheDir(); } @@ -22,7 +29,14 @@ public class FileUtil { return getCacheFile("spider.jar"); } - public static String getJarPath() { - return getJar().getAbsolutePath(); + public static File getLocal(String path) { + return new File(path.replace("file:/", getRootPath())); + } + + public static void write(File file, byte[] data) throws Exception { + FileOutputStream fos = new FileOutputStream(file); + fos.write(data); + fos.flush(); + fos.close(); } } diff --git a/app/src/main/java/com/github/catvod/crawler/JarLoader.java b/app/src/main/java/com/github/catvod/crawler/JarLoader.java index 0cc5795fe..087ea23ba 100644 --- a/app/src/main/java/com/github/catvod/crawler/JarLoader.java +++ b/app/src/main/java/com/github/catvod/crawler/JarLoader.java @@ -7,7 +7,7 @@ import com.fongmi.bear.utils.FileUtil; import org.json.JSONObject; -import java.io.FileOutputStream; +import java.io.File; import java.lang.reflect.Method; import java.util.HashMap; import java.util.LinkedHashMap; @@ -26,22 +26,10 @@ public class JarLoader { this.spiders = new ConcurrentHashMap<>(); } - public void writeJar(byte[] jarData) { - try { - FileOutputStream fos = new FileOutputStream(FileUtil.getJar()); - fos.write(jarData); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void load(byte[] jarData) throws Exception { + public void load(File file) throws Exception { spiders.clear(); proxyFun = null; - writeJar(jarData); - classLoader = new DexClassLoader(FileUtil.getJarPath(), FileUtil.getCachePath(), null, App.get().getClassLoader()); + classLoader = new DexClassLoader(file.getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader()); Class classInit = classLoader.loadClass("com.github.catvod.spider.Init"); Class classProxy = classLoader.loadClass("com.github.catvod.spider.Proxy"); if (classInit != null) {