Commit 5682062d authored by Administrator's avatar Administrator

fix: 远程重播命令

parent c99362bb
...@@ -56,7 +56,7 @@ dependencies { ...@@ -56,7 +56,7 @@ dependencies {
implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support.constraint:constraint-layout:1.1.3'
// implementation 'org.apache.commons:commons-lang3:3.6' // implementation 'org.apache.commons:commons-lang3:3.6'
// implementation 'commons-io:commons-io:2.6' // implementation 'commons-io:commons-io:2.6'
implementation "com.virjar.majora:majora-sdk:1.1" implementation "com.virjar.majora:majora-sdk:1.2"
implementation 'eu.chainfire:libsuperuser:1.0.0.201608240809' implementation 'eu.chainfire:libsuperuser:1.0.0.201608240809'
......
...@@ -8,14 +8,42 @@ import com.virjar.majora.adr.utils.ClientIdentifier; ...@@ -8,14 +8,42 @@ import com.virjar.majora.adr.utils.ClientIdentifier;
import com.virjar.majora.adr.utils.CommonUtils; import com.virjar.majora.adr.utils.CommonUtils;
import com.virjar.majora.adr.utils.PermissionUtils; import com.virjar.majora.adr.utils.PermissionUtils;
import com.virjar.majora.client.sdk.client.MajoraClient; import com.virjar.majora.client.sdk.client.MajoraClient;
import com.virjar.majora.client.sdk.cmd.handlers.RedialHandler;
import com.virjar.majora.client.sdk.log.MajoraLogger; import com.virjar.majora.client.sdk.log.MajoraLogger;
import java.util.Map;
import eu.chainfire.libsuperuser.Shell; import eu.chainfire.libsuperuser.Shell;
public class MajoraClientService { public class MajoraClientService {
private static boolean started = false; private static boolean started = false;
private static MajoraClient majoraClient; private static MajoraClient majoraClient;
private static class RemoteRedialOperator implements RedialHandler.RedialOperator {
@Override
public String envOk() {
if (!Shell.SU.available()) {
// 没有root权限,那就无法进行飞行模式切换
return "redial need rot permission";
}
return null;
}
@Override
public void doRedial(Map<String, String> param) {
String offlineWaitMilisStr = param.get("offlineWaitMilis");
int offlineWaitMilis = 0;
if (offlineWaitMilisStr != null) {
try {
offlineWaitMilis = Integer.parseInt(offlineWaitMilisStr);
} catch (NumberFormatException ignore) {
}
}
reDial(offlineWaitMilis);
}
}
// 重播任务定时器 // 重播任务定时器
private static class RedialThread extends Thread { private static class RedialThread extends Thread {
private static final RedialThread mInstance = new RedialThread(); private static final RedialThread mInstance = new RedialThread();
...@@ -42,7 +70,7 @@ public class MajoraClientService { ...@@ -42,7 +70,7 @@ public class MajoraClientService {
return; return;
} }
if (autoRedial) { if (autoRedial) {
reDial(); reDial(2000);
} }
} }
} }
...@@ -67,25 +95,41 @@ public class MajoraClientService { ...@@ -67,25 +95,41 @@ public class MajoraClientService {
} }
public static void reDial() { public static void reDial(int offlineWaitMilis) {
if (!Shell.SU.available()) { if (!Shell.SU.available()) {
// 没有root权限,那就无法进行飞行模式切换 // 没有root权限,那就无法进行飞行模式切换
return; return;
} }
if (offlineWaitMilis > 20_000) {
offlineWaitMilis = 20_000;
}
if (majoraClient == null) { if (majoraClient == null) {
reDialInternal(); reDialImpl();
} else { } else {
majoraClient.prepareReDial(MajoraClientService::reDialInternal); int finalOfflineWaitMilis = offlineWaitMilis;
majoraClient.prepareReDial(() -> new Thread("redial-thread") {
@Override
public void run() {
if (finalOfflineWaitMilis > 0) {
try {
// 重播的时候,先摘除流量,等待一秒的时间
Thread.sleep(finalOfflineWaitMilis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
reDialImpl();
}
}.start());
} }
} }
private static void reDialInternal() { private static void reDialImpl() {
try { try {
Shell.SU.run("settings put global airplane_mode_on 1 && am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true"); Shell.SU.run("settings put global airplane_mode_on 1 && am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true");
Thread.sleep(5000); Thread.sleep(5000);
Shell.SU.run("settings put global airplane_mode_on 0 && am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false"); Shell.SU.run("settings put global airplane_mode_on 0 && am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false");
} catch (Exception e) { } catch (Exception e) {
MajoraLogger.getLogger().info("reDial error", e); MajoraLogger.getLogger().info("reDial error", e);
} }
...@@ -97,6 +141,9 @@ public class MajoraClientService { ...@@ -97,6 +141,9 @@ public class MajoraClientService {
int serverPort = CommonUtils.toInt(spf.getString("server_port", "5879"), 5879); int serverPort = CommonUtils.toInt(spf.getString("server_port", "5879"), 5879);
majoraClient = new MajoraClient(serverHost, serverPort, ClientIdentifier.id()); majoraClient = new MajoraClient(serverHost, serverPort, ClientIdentifier.id());
majoraClient.setDeviceAccount(spf.getString("account_identifier", "")); majoraClient.setDeviceAccount(spf.getString("account_identifier", ""));
RedialHandler.setRedialOperator(new RemoteRedialOperator());
UILoggerHelper.setupLogger(); UILoggerHelper.setupLogger();
} }
} }
...@@ -62,7 +62,7 @@ public class MainPanelFragment extends Fragment { ...@@ -62,7 +62,7 @@ public class MainPanelFragment extends Fragment {
Button btnReDial = view.findViewById(R.id.btn_redial); Button btnReDial = view.findViewById(R.id.btn_redial);
btnReDial.setOnClickListener(view1 -> { btnReDial.setOnClickListener(view1 -> {
if (Shell.SU.available()) { if (Shell.SU.available()) {
MajoraClientService.reDial(); MajoraClientService.reDial(1000);
} else { } else {
Toast.makeText(getActivity(), "重播需要root权限", Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), "重播需要root权限", Toast.LENGTH_SHORT).show();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment