From 5f1710cb18041db305faedf05fb4b156ae0ee0df Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 16 May 2023 12:04:59 +0800 Subject: [PATCH] [mobile] support sync history - part 2 --- .../android/tv/ui/activity/HomeActivity.java | 4 +- .../com/fongmi/android/tv/bean/History.java | 19 ++++++- .../fongmi/android/tv/event/CastEvent.java | 29 +++------- .../fongmi/android/tv/event/SyncEvent.java | 31 ++++++++++ .../com/fongmi/android/tv/net/OkHttp.java | 8 +-- .../com/fongmi/android/tv/server/Nano.java | 56 +++++++++++++++---- .../com/fongmi/android/tv/server/Server.java | 6 -- .../server/process/InputRequestProcess.java | 6 +- .../tv/server/process/RawRequestProcess.java | 4 +- .../tv/ui/activity/DetailActivity.java | 3 +- .../tv/ui/activity/HistoryActivity.java | 30 ++++++++++ .../tv/ui/custom/dialog/ReceiveDialog.java | 4 +- 12 files changed, 142 insertions(+), 58 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/event/SyncEvent.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index b13f6386c..31ec0848c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -313,10 +313,10 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Subscribe(threadMode = ThreadMode.MAIN) public void onCastEvent(CastEvent event) { - if (ApiConfig.getUrl().equals(event.getConfig())) { + if (ApiConfig.get().getConfig().equals(event.getConfig())) { DetailActivity.cast(this, event.getHistory().update(ApiConfig.getCid())); } else { - ApiConfig.get().clear().config(Config.find(event.getConfig(), 0)).load(getCallback(event)); + ApiConfig.get().clear().config(event.getConfig()).load(getCallback(event)); } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/History.java b/app/src/main/java/com/fongmi/android/tv/bean/History.java index b061c5122..bfc8a251e 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/History.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/History.java @@ -12,7 +12,10 @@ import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.db.AppDatabase; import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; +import java.util.Collections; import java.util.List; @Entity @@ -59,6 +62,12 @@ public class History { return new Gson().fromJson(str, History.class); } + public static List arrayFrom(String str) { + Type listType = new TypeToken>() {}.getType(); + List items = new Gson().fromJson(str, listType); + return items == null ? Collections.emptyList() : items; + } + public History() { this.speed = 1; this.scale = -1; @@ -235,7 +244,11 @@ public class History { } public static List get() { - return AppDatabase.get().getHistoryDao().find(ApiConfig.getCid()); + return get(ApiConfig.getCid()); + } + + public static List get(int cid) { + return AppDatabase.get().getHistoryDao().find(cid); } public static History find(String key) { @@ -299,6 +312,10 @@ public class History { } } + public static void sync(List items) { + + } + @NonNull @Override public String toString() { diff --git a/app/src/main/java/com/fongmi/android/tv/event/CastEvent.java b/app/src/main/java/com/fongmi/android/tv/event/CastEvent.java index 29a629243..da386dde9 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/CastEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/CastEvent.java @@ -1,26 +1,25 @@ package com.fongmi.android.tv.event; +import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Device; import com.fongmi.android.tv.bean.History; -import com.fongmi.android.tv.utils.FileUtil; import org.greenrobot.eventbus.EventBus; public class CastEvent { - private final History history; + private final Config config; private final Device device; - private String config; + private final History history; - public static void post(String device, String config, String history) { - EventBus.getDefault().post(new CastEvent(device, config, history)); + public static void post(Config config, Device device, History history) { + EventBus.getDefault().post(new CastEvent(config, device, history)); } - public CastEvent(String device, String config, String history) { - this.history = History.objectFrom(history); - this.device = Device.objectFrom(device); + public CastEvent(Config config, Device device, History history) { this.config = config; - checkConfig(); + this.device = device; + this.history = history; } public History getHistory() { @@ -31,17 +30,7 @@ public class CastEvent { return device; } - public String getConfig() { + public Config getConfig() { return config; } - - public void setConfig(String config) { - this.config = config; - } - - private void checkConfig() { - if (!config.startsWith("file")) return; - if (FileUtil.getLocal(config).exists()) return; - setConfig(device.getIp() + "/" + config); - } } diff --git a/app/src/main/java/com/fongmi/android/tv/event/SyncEvent.java b/app/src/main/java/com/fongmi/android/tv/event/SyncEvent.java new file mode 100644 index 000000000..d7d5aabbe --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/event/SyncEvent.java @@ -0,0 +1,31 @@ +package com.fongmi.android.tv.event; + +import com.fongmi.android.tv.bean.Config; +import com.fongmi.android.tv.bean.History; + +import org.greenrobot.eventbus.EventBus; + +import java.util.List; + +public class SyncEvent { + + private final Config config; + private final List history; + + public static void post(Config config, List history) { + EventBus.getDefault().post(new SyncEvent(config, history)); + } + + public SyncEvent(Config config, List history) { + this.config = config; + this.history = history; + } + + public Config getConfig() { + return config; + } + + public List getHistory() { + return history; + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/net/OkHttp.java b/app/src/main/java/com/fongmi/android/tv/net/OkHttp.java index dd5da3c3b..7d6effec7 100644 --- a/app/src/main/java/com/fongmi/android/tv/net/OkHttp.java +++ b/app/src/main/java/com/fongmi/android/tv/net/OkHttp.java @@ -52,12 +52,8 @@ public class OkHttp { return client().newCall(new Request.Builder().url(buildUrl(url, params)).build()); } - public static Call newCall(OkHttpClient client, String url, ArrayMap params) { - return client.newCall(new Request.Builder().url(buildUrl(url, params)).build()); - } - - public static Call newCall(OkHttpClient client, String url, RequestBody body) { - return client.newCall(new Request.Builder().url(url).post(body).build()); + public static Call newCall(String url, RequestBody body) { + return client().newCall(new Request.Builder().url(url).post(body).build()); } private static HttpUrl buildUrl(String url, ArrayMap params) { diff --git a/app/src/main/java/com/fongmi/android/tv/server/Nano.java b/app/src/main/java/com/fongmi/android/tv/server/Nano.java index f4367e49c..0b41c3616 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Nano.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Nano.java @@ -2,11 +2,16 @@ package com.fongmi.android.tv.server; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; +import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Device; +import com.fongmi.android.tv.bean.History; +import com.fongmi.android.tv.event.CastEvent; +import com.fongmi.android.tv.event.SyncEvent; import com.fongmi.android.tv.server.process.InputRequestProcess; import com.fongmi.android.tv.server.process.RawRequestProcess; import com.fongmi.android.tv.server.process.RequestProcess; import com.fongmi.android.tv.utils.FileUtil; +import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -72,15 +77,17 @@ public class Nano extends NanoHTTPD { case GET: if (url.startsWith("/file")) return doFile(url); else if (url.startsWith("/proxy")) return doProxy(session.getParms()); - else if (url.startsWith("/device")) return createPlainTextResponse(NanoHTTPD.Response.Status.OK, Device.get().toString()); + else if (url.startsWith("/device")) return createSuccessResponse(Device.get().toString()); break; case POST: - if (url.startsWith("/upload")) return doUpload(session.getParms(), files); + if (url.startsWith("/cast")) return doCast(session.getParms()); + else if (url.startsWith("/sync")) return doSync(session.getParms()); + else if (url.startsWith("/upload")) return doUpload(session.getParms(), files); else if (url.startsWith("/newFolder")) return doNewFolder(session.getParms()); else if (url.startsWith("/delFolder") || url.startsWith("/delFile")) return doDelFolder(session.getParms()); break; } - return processes.get(0).doResponse(session, ""); + return createErrorResponse(NanoHTTPD.Response.Status.NOT_FOUND, "Not Found"); } private void parseBody(IHTTPSession session, Map files) { @@ -101,9 +108,9 @@ public class Nano extends NanoHTTPD { String path = url.substring(6); File file = FileUtil.getRootFile(path); if (file.isFile()) return newChunkedResponse(Response.Status.OK, "application/octet-stream", new FileInputStream(file)); - else return createPlainTextResponse(Response.Status.OK, listFiles(file)); + else return createSuccessResponse(listFiles(file)); } catch (Exception e) { - return createPlainTextResponse(Response.Status.INTERNAL_ERROR, e.getMessage()); + return createErrorResponse(e.getMessage()); } } @@ -112,10 +119,25 @@ public class Nano extends NanoHTTPD { Object[] rs = ApiConfig.get().proxyLocal(params); return newChunkedResponse(Response.Status.lookup((Integer) rs[0]), (String) rs[1], (InputStream) rs[2]); } catch (Exception e) { - return createPlainTextResponse(Response.Status.INTERNAL_ERROR, "500"); + return createErrorResponse(e.getMessage()); } } + private Response doCast(Map params) { + Config config = Config.find(params.get("config").trim(), 0); + Device device = Device.objectFrom(params.get("device").trim()); + History history = History.objectFrom(params.get("history").trim()); + CastEvent.post(config, device, history); + return createSuccessResponse(); + } + + private Response doSync(Map params) { + Config config = Config.find(params.get("config").trim(), 0); + List history = History.arrayFrom(params.get("history").trim()); + SyncEvent.post(config, history); + return createSuccessResponse(new Gson().toJson(History.get(config.getId()))); + } + private Response doUpload(Map params, Map files) { String path = params.get("path"); for (String k : files.keySet()) { @@ -124,20 +146,20 @@ public class Nano extends NanoHTTPD { if (fn.toLowerCase().endsWith(".zip")) FileUtil.unzip(temp, FileUtil.getRootPath() + File.separator + path); else FileUtil.copy(temp, FileUtil.getRootFile(path + File.separator + fn)); } - return createPlainTextResponse(Response.Status.OK, "OK"); + return createSuccessResponse(); } private Response doNewFolder(Map params) { String path = params.get("path"); String name = params.get("name"); FileUtil.getRootFile(path + File.separator + name).mkdirs(); - return createPlainTextResponse(Response.Status.OK, "OK"); + return createSuccessResponse(); } private Response doDelFolder(Map params) { String path = params.get("path"); FileUtil.clearDir(FileUtil.getRootFile(path)); - return createPlainTextResponse(Response.Status.OK, "OK"); + return createSuccessResponse(); } private String getParent(File root) { @@ -171,7 +193,19 @@ public class Nano extends NanoHTTPD { return info.toString(); } - public static Response createPlainTextResponse(Response.IStatus status, String text) { + public static Response createSuccessResponse() { + return createSuccessResponse("OK"); + } + + public static Response createSuccessResponse(String text) { + return newFixedLengthResponse(Response.Status.OK, MIME_PLAINTEXT, text); + } + + public static Response createErrorResponse(String text) { + return createErrorResponse(Response.Status.INTERNAL_ERROR, text); + } + + public static Response createErrorResponse(Response.IStatus status, String text) { return newFixedLengthResponse(status, MIME_PLAINTEXT, text); } @@ -182,7 +216,5 @@ public class Nano extends NanoHTTPD { void onPush(String url); void onApi(String url); - - void onCast(String device, String config, String history); } } diff --git a/app/src/main/java/com/fongmi/android/tv/server/Server.java b/app/src/main/java/com/fongmi/android/tv/server/Server.java index 4a43c3f73..f31e819c8 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Server.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Server.java @@ -5,7 +5,6 @@ import android.net.wifi.WifiManager; import android.text.format.Formatter; import com.fongmi.android.tv.App; -import com.fongmi.android.tv.event.CastEvent; import com.fongmi.android.tv.event.ServerEvent; import java.net.Inet4Address; @@ -104,9 +103,4 @@ public class Server implements Nano.Listener { public void onApi(String url) { if (url.length() > 0) ServerEvent.api(url); } - - @Override - public void onCast(String device, String config, String history) { - CastEvent.post(device, config, history); - } } diff --git a/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java b/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java index 6b0305999..7aba2c13a 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java +++ b/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java @@ -21,7 +21,6 @@ public class InputRequestProcess implements RequestProcess { @Override public NanoHTTPD.Response doResponse(NanoHTTPD.IHTTPSession session, String path) { - if (!path.equals("/action")) return Nano.createPlainTextResponse(NanoHTTPD.Response.Status.NOT_FOUND, "Error 404, file not found."); Map params = session.getParms(); switch (params.get("do")) { case "search": @@ -33,10 +32,7 @@ public class InputRequestProcess implements RequestProcess { case "api": nano.getListener().onApi(params.get("url").trim()); break; - case "cast": - nano.getListener().onCast(params.get("device").trim(), params.get("config").trim(), params.get("history").trim()); - break; } - return Nano.createPlainTextResponse(NanoHTTPD.Response.Status.OK, "ok"); + return Nano.createSuccessResponse(); } } diff --git a/app/src/main/java/com/fongmi/android/tv/server/process/RawRequestProcess.java b/app/src/main/java/com/fongmi/android/tv/server/process/RawRequestProcess.java index 629afc09e..2bd97e661 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/process/RawRequestProcess.java +++ b/app/src/main/java/com/fongmi/android/tv/server/process/RawRequestProcess.java @@ -30,8 +30,8 @@ public class RawRequestProcess implements RequestProcess { try { InputStream is = App.get().getResources().openRawResource(resId); return Nano.newFixedLengthResponse(NanoHTTPD.Response.Status.OK, mimeType + ";charset=utf-8", is, is.available()); - } catch (IOException IOExc) { - return Nano.createPlainTextResponse(NanoHTTPD.Response.Status.INTERNAL_ERROR, "SERVER INTERNAL ERROR: IOException: " + IOExc.getMessage()); + } catch (IOException e) { + return Nano.createErrorResponse(e.getMessage()); } } } \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 19142c896..9fa073d5e 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -1077,8 +1077,7 @@ public class DetailActivity extends BaseActivity implements Clock.Callback, Cust } @Override - public void onCastTo(boolean mobile) { - if (mobile) return; + public void onCastTo() { checkPlayImg(false); mPlayers.pause(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java index 3bac96983..bf2ad06be 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java @@ -10,12 +10,16 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.R; +import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.History; import com.fongmi.android.tv.databinding.ActivityHistoryBinding; import com.fongmi.android.tv.event.RefreshEvent; +import com.fongmi.android.tv.event.SyncEvent; +import com.fongmi.android.tv.net.Callback; import com.fongmi.android.tv.ui.adapter.HistoryAdapter; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.dialog.SyncDialog; +import com.fongmi.android.tv.utils.Notify; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.greenrobot.eventbus.Subscribe; @@ -79,6 +83,32 @@ public class HistoryActivity extends BaseActivity implements HistoryAdapter.OnCl if (event.getType().equals(RefreshEvent.Type.HISTORY)) getHistory(); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onSyncEvent(SyncEvent event) { + if (ApiConfig.get().getConfig().equals(event.getConfig())) { + History.sync(event.getHistory()); + getHistory(); + } else { + ApiConfig.get().clear().config(event.getConfig()).load(getCallback(event)); + } + } + + private Callback getCallback(SyncEvent event) { + return new Callback() { + @Override + public void success() { + RefreshEvent.config(); + RefreshEvent.video(); + onSyncEvent(event); + } + + @Override + public void error(int resId) { + Notify.show(resId); + } + }; + } + @Override public void onItemClick(History item) { DetailActivity.start(this, item.getSiteKey(), item.getVodId(), item.getVodName()); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ReceiveDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ReceiveDialog.java index 7e3d7962d..249a56dbc 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ReceiveDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ReceiveDialog.java @@ -71,12 +71,12 @@ public class ReceiveDialog extends BaseDialog { } private void onReceiveCast() { - if (ApiConfig.getUrl().equals(event.getConfig())) { + if (ApiConfig.get().getConfig().equals(event.getConfig())) { DetailActivity.cast(getActivity(), event.getHistory().update(ApiConfig.getCid())); dismiss(); } else { showProgress(); - ApiConfig.get().clear().config(Config.find(event.getConfig(), 0)).load(getCallback()); + ApiConfig.get().clear().config(event.getConfig()).load(getCallback()); } }