[mobile] support sync history - part 2

pull/123/head
FongMi 3 years ago
parent ab2325bda2
commit 5f1710cb18
  1. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  2. 19
      app/src/main/java/com/fongmi/android/tv/bean/History.java
  3. 29
      app/src/main/java/com/fongmi/android/tv/event/CastEvent.java
  4. 31
      app/src/main/java/com/fongmi/android/tv/event/SyncEvent.java
  5. 8
      app/src/main/java/com/fongmi/android/tv/net/OkHttp.java
  6. 56
      app/src/main/java/com/fongmi/android/tv/server/Nano.java
  7. 6
      app/src/main/java/com/fongmi/android/tv/server/Server.java
  8. 6
      app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java
  9. 4
      app/src/main/java/com/fongmi/android/tv/server/process/RawRequestProcess.java
  10. 3
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  11. 30
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java
  12. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ReceiveDialog.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));
}
}

@ -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<History> arrayFrom(String str) {
Type listType = new TypeToken<List<History>>() {}.getType();
List<History> 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<History> get() {
return AppDatabase.get().getHistoryDao().find(ApiConfig.getCid());
return get(ApiConfig.getCid());
}
public static List<History> 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<History> items) {
}
@NonNull
@Override
public String toString() {

@ -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);
}
}

@ -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> history;
public static void post(Config config, List<History> history) {
EventBus.getDefault().post(new SyncEvent(config, history));
}
public SyncEvent(Config config, List<History> history) {
this.config = config;
this.history = history;
}
public Config getConfig() {
return config;
}
public List<History> getHistory() {
return history;
}
}

@ -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<String, String> 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<String, String> params) {

@ -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<String, String> 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<String, String> 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<String, String> params) {
Config config = Config.find(params.get("config").trim(), 0);
List<History> history = History.arrayFrom(params.get("history").trim());
SyncEvent.post(config, history);
return createSuccessResponse(new Gson().toJson(History.get(config.getId())));
}
private Response doUpload(Map<String, String> params, Map<String, String> 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<String, String> 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<String, String> 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);
}
}

@ -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);
}
}

@ -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<String, String> 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();
}
}

@ -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());
}
}
}

@ -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();
}

@ -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());

@ -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());
}
}

Loading…
Cancel
Save