You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SmsForwarder/app/src/main/java/com/idormy/sms/forwarder/CloneActivity.java

301 lines
12 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.idormy.sms.forwarder;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.hjq.toast.ToastUtils;
import com.idormy.sms.forwarder.model.vo.CloneInfoVo;
import com.idormy.sms.forwarder.receiver.BaseServlet;
import com.idormy.sms.forwarder.receiver.RebootBroadcastReceiver;
import com.idormy.sms.forwarder.sender.HttpServer;
import com.idormy.sms.forwarder.utils.CloneUtils;
import com.idormy.sms.forwarder.utils.Define;
import com.idormy.sms.forwarder.utils.FileUtils;
import com.idormy.sms.forwarder.utils.HttpUtils;
import com.idormy.sms.forwarder.utils.NetUtils;
import com.idormy.sms.forwarder.utils.SettingUtils;
import com.idormy.sms.forwarder.view.IPEditText;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class CloneActivity extends BaseActivity {
private final String TAG = "CloneActivity";
private Context context;
private String serverIp;
private String backupPath;
private final String backupFile = "SmsForwarder.json";
private IPEditText textServerIp;
private TextView sendTxt;
private TextView receiveTxt;
private TextView backupPathTxt;
private Button sendBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clone);
Log.d(TAG, "onCreate: " + RebootBroadcastReceiver.class.getName());
HttpUtils.init(this);
HttpServer.init(this);
}
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
@SuppressLint("SetTextI18n")
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
backupPathTxt = findViewById(R.id.backupPathTxt);
// 申请储存权限
XXPermissions.with(this).permission(Permission.Group.STORAGE).request(new OnPermissionCallback() {
@Override
public void onGranted(List<String> permissions, boolean all) {
backupPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
backupPathTxt.setText(backupPath + File.separator + backupFile);
}
@Override
public void onDenied(List<String> permissions, boolean never) {
if (never) {
ToastUtils.show(R.string.toast_denied_never);
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(CloneActivity.this, permissions);
} else {
ToastUtils.show(R.string.toast_denied);
}
backupPathTxt.setText("未授权储存权限,该功能无法使用!");
}
});
LinearLayout layoutNetwork = findViewById(R.id.layoutNetwork);
LinearLayout layoutOffline = findViewById(R.id.layoutOffline);
final RadioGroup radioGroupTypeCheck = findViewById(R.id.radioGroupTypeCheck);
radioGroupTypeCheck.setOnCheckedChangeListener((group, checkedId) -> {
if (checkedId == R.id.btnTypeOffline) {
layoutNetwork.setVisibility(View.GONE);
layoutOffline.setVisibility(View.VISIBLE);
} else {
layoutNetwork.setVisibility(View.VISIBLE);
layoutOffline.setVisibility(View.GONE);
}
});
sendBtn = findViewById(R.id.sendBtn);
sendTxt = findViewById(R.id.sendTxt);
TextView ipText = findViewById(R.id.ipText);
textServerIp = findViewById(R.id.textServerIp);
receiveTxt = findViewById(R.id.receiveTxt);
Button receiveBtn = findViewById(R.id.receiveBtn);
serverIp = NetUtils.getLocalIp(CloneActivity.this);
ipText.setText(serverIp);
if (HttpServer.asRunning()) {
sendBtn.setText(R.string.stop);
sendTxt.setText(R.string.server_has_started);
textServerIp.setIP(serverIp);
} else {
sendBtn.setText(R.string.send);
sendTxt.setText(R.string.server_has_stopped);
}
//发送
sendBtn.setOnClickListener(v -> {
if (!HttpServer.asRunning() && NetUtils.NETWORK_WIFI != NetUtils.getNetWorkStatus()) {
ToastUtils.show(getString(R.string.no_wifi_network));
return;
}
SettingUtils.switchEnableHttpServer(!SettingUtils.getSwitchEnableHttpServer());
if (!HttpServer.update()) {
SettingUtils.switchEnableHttpServer(!SettingUtils.getSwitchEnableHttpServer());
return;
}
if (!HttpServer.asRunning()) {
sendTxt.setText(R.string.server_has_stopped);
textServerIp.setIP("");
sendBtn.setText(R.string.send);
} else {
sendTxt.setText(R.string.server_has_started);
textServerIp.setIP(serverIp);
sendBtn.setText(R.string.stop);
}
});
//接收
receiveBtn.setOnClickListener(v -> {
if (HttpServer.asRunning()) {
receiveTxt.setText(R.string.sender_cannot_receive);
ToastUtils.show(getString(R.string.sender_cannot_receive));
return;
}
if (NetUtils.NETWORK_WIFI != NetUtils.getNetWorkStatus()) {
receiveTxt.setText(R.string.no_wifi_network);
ToastUtils.show(getString(R.string.no_wifi_network));
return;
}
serverIp = textServerIp.getIP();
if (serverIp == null || serverIp.isEmpty()) {
receiveTxt.setText(R.string.invalid_server_ip);
ToastUtils.show(getString(R.string.invalid_server_ip));
return;
}
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//设置读取超时时间
OkHttpClient client = builder
.readTimeout(Define.REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS)
.writeTimeout(Define.REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS)
.connectTimeout(Define.REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS)
.build();
Map msgMap = new HashMap();
msgMap.put("versionCode", SettingUtils.getVersionCode());
msgMap.put("versionName", SettingUtils.getVersionName());
String requestMsg = JSON.toJSONString(msgMap);
Log.i(TAG, "requestMsg:" + requestMsg);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
//请求链接post 获取版本信息get 下载备份文件
final String requestUrl = "http://" + serverIp + ":" + Define.HTTP_SERVER_PORT + BaseServlet.CLONE_PATH + "?" + System.currentTimeMillis();
Log.i(TAG, "requestUrl:" + requestUrl);
//获取版本信息
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
ToastUtils.show(getString(R.string.tips_get_info_failed));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
if (TextUtils.isEmpty(responseStr)) {
ToastUtils.show(getString(R.string.tips_get_info_failed));
return;
}
try {
CloneInfoVo cloneInfoVo = JSON.parseObject(responseStr, CloneInfoVo.class);
Log.d(TAG, cloneInfoVo.toString());
if (!SettingUtils.getVersionName().equals(cloneInfoVo.getVersionName())) {
ToastUtils.show(getString(R.string.tips_versions_inconsistent));
return;
}
if (CloneUtils.restoreSettings(cloneInfoVo)) {
ToastUtils.show(getString(R.string.tips_clone_done));
} else {
ToastUtils.show(getString(R.string.tips_clone_failed));
}
} catch (Exception e) {
ToastUtils.show(getString(R.string.tips_clone_failed) + e.getMessage());
}
}
});
});
Button exportBtn = findViewById(R.id.exportBtn);
TextView exportTxt = findViewById(R.id.exportTxt);
Button importBtn = findViewById(R.id.importBtn);
TextView importTxt = findViewById(R.id.importTxt);
//导出
exportBtn.setOnClickListener(v -> {
if (FileUtils.writeFileR(CloneUtils.exportSettings(), backupPath, backupFile, true)) {
ToastUtils.show("导出配置成功!");
} else {
exportTxt.setText("导出失败,请检查写入权限!");
ToastUtils.show("导出失败,请检查写入权限!");
}
});
//导入
importBtn.setOnClickListener(v -> {
try {
String responseStr = FileUtils.readFileI(backupPath, backupFile);
if (TextUtils.isEmpty(responseStr)) {
ToastUtils.show(getString(R.string.tips_get_info_failed));
return;
}
CloneInfoVo cloneInfoVo = JSON.parseObject(responseStr, CloneInfoVo.class);
Log.d(TAG, Objects.requireNonNull(cloneInfoVo).toString());
if (!SettingUtils.getVersionName().equals(cloneInfoVo.getVersionName())) {
ToastUtils.show(getString(R.string.tips_versions_inconsistent));
return;
}
if (CloneUtils.restoreSettings(cloneInfoVo)) {
ToastUtils.show(getString(R.string.tips_clone_done));
} else {
ToastUtils.show(getString(R.string.tips_clone_failed));
}
} catch (Exception e) {
e.printStackTrace();
importTxt.setText("还原失败:" + e.getMessage());
}
});
}
@SuppressLint("SetTextI18n")
@Override
protected void onResume() {
super.onResume();
serverIp = NetUtils.getLocalIp(CloneActivity.this);
TextView ipText = findViewById(R.id.ipText);
ipText.setText(getString(R.string.local_ip) + serverIp);
}
}