Add sync mode

pull/542/head
okjack 2 years ago
parent 0ace92113b
commit 8b87bb5084
  1. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  2. 2
      app/src/main/java/com/fongmi/android/tv/bean/Keep.java
  3. 42
      app/src/main/java/com/fongmi/android/tv/server/process/Action.java
  4. 5
      app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java
  5. 26
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java
  6. 60
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java
  7. 10
      app/src/mobile/res/drawable/ic_sync_download.xml
  8. 10
      app/src/mobile/res/drawable/ic_sync_two.xml
  9. 10
      app/src/mobile/res/drawable/ic_sync_upload.xml
  10. 11
      app/src/mobile/res/layout/dialog_device.xml
  11. 10
      app/src/mobile/res/values/arrays.xml

@ -210,6 +210,14 @@ public class Setting {
Prefers.put("site_mode", mode);
}
public static int getSyncMode() {
return Prefers.getInt("sync_mode");
}
public static void putSyncMode(int mode) {
Prefers.put("sync_mode", mode);
}
public static boolean isBootLive() {
return Prefers.getBoolean("boot_live");
}

@ -156,7 +156,7 @@ public class Keep {
for (Keep target : targets) {
for (Config config : configs) {
if (target.getCid() == config.getId()) {
target.save(Config.find(config, 0).getId());
target.save(Config.find(config).getId());
}
}
}

@ -123,25 +123,25 @@ public class Action implements Process {
}
private void onCast(Map<String, String> params) {
Config config = Config.find(params.get("url"), 0);
Config config = Config.objectFrom(params.get("config"));
Device device = Device.objectFrom(params.get("device"));
History history = History.objectFrom(params.get("history"));
CastEvent.post(config, device, history);
CastEvent.post(Config.find(config), device, history);
}
private void onSync(Map<String, String> params) {
boolean sync = Objects.equals(params.get("mode"), "0");
boolean keep = Objects.equals(params.get("type"), "keep");
boolean force = Objects.equals(params.get("force"), "true");
boolean history = Objects.equals(params.get("type"), "history");
Device device = Device.objectFrom(params.get("device"));
if (params.get("device") != null && sync) {
String mode = Objects.requireNonNullElse(params.get("mode"), "0");
if (params.get("device") != null && (mode.equals("0") || mode.equals("2"))) {
Device device = Device.objectFrom(params.get("device"));
if (history) sendHistory(device, params);
else if (keep) sendKeep(device);
}
if (history) {
syncHistory(params);
} else if (keep) {
syncKeep(params);
if (mode.equals("0") || mode.equals("1")) {
if (history) syncHistory(params, force);
else if (keep) syncKeep(params, force);
}
}
@ -170,10 +170,10 @@ public class Action implements Process {
private void sendHistory(Device device, Map<String, String> params) {
try {
String url = Objects.requireNonNullElse(params.get("url"), VodConfig.getUrl());
Config config = Config.find(Config.objectFrom(params.get("config")));
FormBody.Builder body = new FormBody.Builder();
body.add("url", url);
body.add("targets", App.gson().toJson(History.get(Config.find(url, 0).getId())));
body.add("config", config.toString());
body.add("targets", App.gson().toJson(History.get(config.getId())));
OkHttp.newCall(OkHttp.client(Constant.TIMEOUT_SYNC), device.getIp().concat("/action?do=sync&mode=0&type=history"), body.build()).execute();
} catch (Exception e) {
App.post(() -> Notify.show(e.getMessage()));
@ -191,14 +191,11 @@ public class Action implements Process {
}
}
public void syncHistory(Map<String, String> params) {
String url = params.get("url");
if (TextUtils.isEmpty(url)) return;
Config config = Config.find(url, 0);
boolean replace = Objects.equals(params.get("mode"), "1");
public void syncHistory(Map<String, String> params, boolean force) {
Config config = Config.find(Config.objectFrom(params.get("config")));
List<History> targets = History.arrayFrom(params.get("targets"));
if (VodConfig.get().getConfig().equals(config)) {
if (replace) History.delete(config.getId());
if (force) History.delete(config.getId());
History.sync(targets);
} else {
VodConfig.load(config, getCallback(targets));
@ -221,14 +218,13 @@ public class Action implements Process {
};
}
private void syncKeep(Map<String, String> params) {
List<Config> configs = Config.arrayFrom(params.get("configs"));
private void syncKeep(Map<String, String> params, boolean force) {
List<Keep> targets = Keep.arrayFrom(params.get("targets"));
boolean replace = Objects.equals(params.get("mode"), "1");
List<Config> configs = Config.arrayFrom(params.get("configs"));
if (TextUtils.isEmpty(VodConfig.getUrl()) && configs.size() > 0) {
VodConfig.load(Config.find(configs.get(0), 0), getCallback(configs, targets));
VodConfig.load(Config.find(configs.get(0)), getCallback(configs, targets));
} else {
if (replace) Keep.deleteAll();
if (force) Keep.deleteAll();
Keep.sync(configs, targets);
}
}

@ -4,6 +4,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
@ -119,6 +120,10 @@ public class ResUtil {
return App.get().getResources().getStringArray(resId);
}
public static TypedArray getTypedArray(@ArrayRes int resId) {
return App.get().getResources().obtainTypedArray(resId);
}
public static Drawable getDrawable(@DrawableRes int resId) {
return ContextCompat.getDrawable(App.get(), resId);
}

@ -1,6 +1,5 @@
package com.fongmi.android.tv.ui.dialog;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -19,18 +18,18 @@ import com.android.cast.dlna.dmc.control.ServiceActionCallback;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.api.config.VodConfig;
import com.fongmi.android.tv.bean.CastVideo;
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.DLNADevice;
import com.fongmi.android.tv.bean.CastVideo;
import com.fongmi.android.tv.event.ScanEvent;
import com.fongmi.android.tv.utils.ScanTask;
import com.fongmi.android.tv.databinding.DialogDeviceBinding;
import com.fongmi.android.tv.event.ScanEvent;
import com.fongmi.android.tv.server.Server;
import com.fongmi.android.tv.ui.activity.ScanActivity;
import com.fongmi.android.tv.ui.adapter.DeviceAdapter;
import com.fongmi.android.tv.utils.DLNADevice;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ScanTask;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
@ -68,18 +67,17 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe
}
public CastDialog() {
client = OkHttp.client(Constant.TIMEOUT_SYNC);
body = new FormBody.Builder();
body.add("device", Device.get().toString());
if (VodConfig.getUrl() != null) body.add("url", VodConfig.getUrl());
body.add("config", Config.vod().toString());
client = OkHttp.client(Constant.TIMEOUT_SYNC);
}
public CastDialog history(History history) {
String id = history.getVodId();
String fd = history.getVodId();
if (fd.startsWith("/")) fd = Server.get().getAddress() + "/file" + fd.replace(Path.rootPath(), "");
if (fd.startsWith("file")) fd = Server.get().getAddress() + "/" + fd.replace(Path.rootPath(), "").replace("://", "");
if (fd.startsWith("http://127.0.0.1:7777")) fd = Uri.parse(fd).getQueryParameter("url");
if (fd.startsWith("file")) fd = Server.get().getAddress() + "/" + fd.replace(Path.rootPath(), "");
if (fd.contains("127.0.0.1")) fd = fd.replace("127.0.0.1", Util.getIp());
body.add("history", history.toString().replace(id, fd));
return this;
@ -136,16 +134,16 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe
DLNACastManager.INSTANCE.registerDeviceListener(this);
}
private void onScan() {
ScanActivity.start(getActivity());
}
private void onRefresh() {
if (fm) ScanTask.create(this).start(adapter.getIps());
DLNACastManager.INSTANCE.search(null);
adapter.clear();
}
private void onScan() {
ScanActivity.start(getActivity());
}
private void onCasted() {
listener.onCasted();
dismiss();

@ -1,6 +1,8 @@
package com.fongmi.android.tv.ui.dialog;
import android.content.res.TypedArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
@ -12,18 +14,20 @@ import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.api.config.VodConfig;
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.bean.Keep;
import com.fongmi.android.tv.event.ScanEvent;
import com.fongmi.android.tv.utils.ScanTask;
import com.fongmi.android.tv.databinding.DialogDeviceBinding;
import com.fongmi.android.tv.event.ScanEvent;
import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.ui.activity.ScanActivity;
import com.fongmi.android.tv.ui.adapter.DeviceAdapter;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.ScanTask;
import com.github.catvod.net.OkHttp;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
@ -33,6 +37,7 @@ import org.greenrobot.eventbus.ThreadMode;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import okhttp3.Call;
import okhttp3.FormBody;
@ -43,6 +48,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe
private final FormBody.Builder body;
private final OkHttpClient client;
private final TypedArray mode;
private DialogDeviceBinding binding;
private DeviceAdapter adapter;
private String type;
@ -53,23 +59,22 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe
public SyncDialog() {
client = OkHttp.client(Constant.TIMEOUT_SYNC);
mode = ResUtil.getTypedArray(R.array.cast_mode);
body = new FormBody.Builder();
}
public SyncDialog history() {
type = "history";
body.add("device", Device.get().toString());
body.add("config", Config.vod().toString());
body.add("targets", App.gson().toJson(History.get()));
if (VodConfig.getUrl() != null) body.add("url", VodConfig.getUrl());
return this;
return type("history");
}
public SyncDialog keep() {
type = "keep";
body.add("device", Device.get().toString());
body.add("targets", App.gson().toJson(Keep.getVod()));
body.add("configs", App.gson().toJson(Config.findUrls()));
return this;
return type("keep");
}
public void show(FragmentActivity activity) {
@ -77,6 +82,11 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe
show(activity.getSupportFragmentManager(), null);
}
private SyncDialog type(String type) {
this.type = type;
return this;
}
@Override
protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
return binding = DialogDeviceBinding.inflate(inflater, container, false);
@ -84,13 +94,16 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe
@Override
protected void initView() {
binding.mode.setVisibility(View.VISIBLE);
EventBus.getDefault().register(this);
setRecyclerView();
getDevice();
setMode();
}
@Override
protected void initEvent() {
binding.mode.setOnClickListener(v -> onMode());
binding.scan.setOnClickListener(v -> onScan());
binding.refresh.setOnClickListener(v -> onRefresh());
}
@ -105,21 +118,30 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe
if (adapter.getItemCount() == 0) App.post(this::onRefresh, 1000);
}
private void onRefresh() {
ScanTask.create(this).start(adapter.getIps());
adapter.clear();
private void setMode() {
int index = Setting.getSyncMode();
binding.mode.setImageResource(mode.getResourceId(index, 0));
binding.mode.setTag(String.valueOf(index));
}
private void onMode() {
int index = Setting.getSyncMode();
Setting.putSyncMode(index = index == mode.length() - 1 ? 0 : ++index);
binding.mode.setImageResource(mode.getResourceId(index, 0));
binding.mode.setTag(String.valueOf(index));
}
private void onScan() {
ScanActivity.start(getActivity());
}
private void onSuccess() {
dismiss();
private void onRefresh() {
ScanTask.create(this).start(adapter.getIps());
adapter.clear();
}
private void onError() {
Notify.show(R.string.device_offline);
private void onSuccess() {
dismiss();
}
@Subscribe(threadMode = ThreadMode.MAIN)
@ -134,12 +156,16 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe
@Override
public void onItemClick(Device item) {
OkHttp.newCall(client, item.getIp().concat("/action?do=sync&mode=0&type=").concat(type), body.build()).enqueue(getCallback());
OkHttp.newCall(client, String.format(Locale.getDefault(), "%s/action?do=sync&mode=%s&type=%s", item.getIp(), binding.mode.getTag().toString(), type), body.build()).enqueue(getCallback());
}
@Override
public boolean onLongClick(Device item) {
OkHttp.newCall(client, item.getIp().concat("/action?do=sync&mode=1&type=").concat(type), body.build()).enqueue(getCallback());
String mode = binding.mode.getTag().toString();
if (mode.equals("0")) return false;
if (mode.equals("2") && type.equals("keep")) Keep.deleteAll();
if (mode.equals("2") && type.equals("history")) History.delete(VodConfig.getCid());
OkHttp.newCall(client, String.format(Locale.getDefault(), "%s/action?do=sync&mode=%s&type=%s&force=true", item.getIp(), binding.mode.getTag().toString(), type), body.build()).enqueue(getCallback());
return true;
}
@ -152,7 +178,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
App.post(() -> onError());
App.post(() -> Notify.show(e.getMessage()));
}
};
}

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="@android:color/white"
android:pathData="M440,160L440,647L216,423L160,480L480,800L800,480L744,423L520,647L520,160L440,160Z" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="@android:color/white"
android:pathData="M320,520L320,233L217,336L160,280L360,80L560,280L503,336L400,233L400,520L320,520ZM600,880L400,680L457,624L560,727L560,440L640,440L640,727L743,624L800,680L600,880Z" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="@android:color/white"
android:pathData="M440,800L440,313L216,537L160,480L480,160L800,480L744,537L520,313L520,800L440,800Z" />
</vector>

@ -23,6 +23,17 @@
android:textColor="?android:attr/textColorPrimary"
android:textSize="16sp" />
<ImageView
android:id="@+id/mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_sync_two"
android:tag="0"
android:visibility="gone"
tools:visibility="visible" />
<ImageView
android:id="@+id/scan"
android:layout_width="wrap_content"

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer-array name="cast_mode">
<item>@drawable/ic_sync_two</item>
<item>@drawable/ic_sync_upload</item>
<item>@drawable/ic_sync_download</item>
</integer-array>
</resources>
Loading…
Cancel
Save