新增:一键克隆增加离线模式(导出备份json文件到Download目录,其他机器读取文件导入)
优化:一键克隆机制优化(替换db文件→操作现有db)pull/153/head v2.4.4
parent
60dde070b5
commit
31017609f9
@ -0,0 +1,88 @@
|
|||||||
|
package com.idormy.sms.forwarder.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.idormy.sms.forwarder.model.RuleModel;
|
||||||
|
import com.idormy.sms.forwarder.model.SenderModel;
|
||||||
|
import com.idormy.sms.forwarder.model.vo.CloneInfoVo;
|
||||||
|
import com.idormy.sms.forwarder.sender.SenderUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 一键克隆工具类
|
||||||
|
*/
|
||||||
|
public class CloneUtils {
|
||||||
|
|
||||||
|
//导出设置
|
||||||
|
public static String exportSettings() {
|
||||||
|
CloneInfoVo cloneInfo = new CloneInfoVo();
|
||||||
|
try {
|
||||||
|
cloneInfo.setVersionCode(SettingUtil.getVersionCode());
|
||||||
|
cloneInfo.setVersionName(SettingUtil.getVersionName());
|
||||||
|
cloneInfo.setEnableSms(SettingUtil.getSwitchEnableSms());
|
||||||
|
cloneInfo.setEnablePhone(SettingUtil.getSwitchEnablePhone());
|
||||||
|
cloneInfo.setCallType1(SettingUtil.getSwitchCallType1());
|
||||||
|
cloneInfo.setCallType2(SettingUtil.getSwitchCallType2());
|
||||||
|
cloneInfo.setCallType3(SettingUtil.getSwitchCallType3());
|
||||||
|
cloneInfo.setEnableAppNotify(SettingUtil.getSwitchEnableAppNotify());
|
||||||
|
cloneInfo.setCancelAppNotify(SettingUtil.getSwitchCancelAppNotify());
|
||||||
|
cloneInfo.setSmsHubApiUrl(SettingUtil.getSmsHubApiUrl());
|
||||||
|
cloneInfo.setBatteryLevelAlarmMin(SettingUtil.getBatteryLevelAlarmMin());
|
||||||
|
cloneInfo.setBatteryLevelAlarmMax(SettingUtil.getBatteryLevelAlarmMax());
|
||||||
|
cloneInfo.setBatteryLevelAlarmOnce(SettingUtil.getBatteryLevelAlarmOnce());
|
||||||
|
cloneInfo.setRetryTimes(SettingUtil.getRetryTimes());
|
||||||
|
cloneInfo.setDelayTime(SettingUtil.getDelayTime());
|
||||||
|
cloneInfo.setEnableSmsTemplate(SettingUtil.getSwitchSmsTemplate());
|
||||||
|
cloneInfo.setSmsTemplate(SettingUtil.getSmsTemplate());
|
||||||
|
cloneInfo.setSenderList(SenderUtil.getSender(null, null));
|
||||||
|
cloneInfo.setRuleList(RuleUtil.getRule(null, null));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.toJSONString(cloneInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
//还原设置
|
||||||
|
public static boolean restoreSettings(CloneInfoVo cloneInfoVo) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
//应用配置
|
||||||
|
//SettingUtil.init(context);
|
||||||
|
SettingUtil.switchEnableSms(cloneInfoVo.isEnableSms());
|
||||||
|
SettingUtil.switchEnablePhone(cloneInfoVo.isEnablePhone());
|
||||||
|
SettingUtil.switchCallType1(cloneInfoVo.isCallType1());
|
||||||
|
SettingUtil.switchCallType2(cloneInfoVo.isCallType2());
|
||||||
|
SettingUtil.switchCallType3(cloneInfoVo.isCallType3());
|
||||||
|
SettingUtil.switchEnableAppNotify(cloneInfoVo.isEnableAppNotify());
|
||||||
|
SettingUtil.switchCancelAppNotify(cloneInfoVo.isCancelAppNotify());
|
||||||
|
SettingUtil.smsHubApiUrl(cloneInfoVo.getSmsHubApiUrl());
|
||||||
|
SettingUtil.setBatteryLevelAlarmMin(cloneInfoVo.getBatteryLevelAlarmMin());
|
||||||
|
SettingUtil.setBatteryLevelAlarmMax(cloneInfoVo.getBatteryLevelAlarmMax());
|
||||||
|
SettingUtil.switchBatteryLevelAlarmOnce(cloneInfoVo.isBatteryLevelAlarmOnce());
|
||||||
|
SettingUtil.setRetryTimes(cloneInfoVo.getRetryTimes());
|
||||||
|
SettingUtil.setDelayTime(cloneInfoVo.getDelayTime());
|
||||||
|
SettingUtil.switchSmsTemplate(cloneInfoVo.isEnableSmsTemplate());
|
||||||
|
SettingUtil.setSmsTemplate(cloneInfoVo.getSmsTemplate());
|
||||||
|
|
||||||
|
SenderUtil.delSender(null);
|
||||||
|
List<SenderModel> senderList = cloneInfoVo.getSenderList();
|
||||||
|
for (SenderModel senderModel : senderList) {
|
||||||
|
SenderUtil.addSender(senderModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
RuleUtil.delRule(null);
|
||||||
|
List<RuleModel> ruleList = cloneInfoVo.getRuleList();
|
||||||
|
for (RuleModel ruleModel : ruleList) {
|
||||||
|
RuleUtil.addRule(ruleModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogUtil.delLog(null, null);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,108 +0,0 @@
|
|||||||
package com.idormy.sms.forwarder.utils;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import okhttp3.Call;
|
|
||||||
import okhttp3.Callback;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import okhttp3.Request;
|
|
||||||
import okhttp3.Response;
|
|
||||||
|
|
||||||
public class DownloadUtil {
|
|
||||||
private static DownloadUtil downloadUtil;
|
|
||||||
private final OkHttpClient okHttpClient;
|
|
||||||
|
|
||||||
public static DownloadUtil get() {
|
|
||||||
if (downloadUtil == null) {
|
|
||||||
downloadUtil = new DownloadUtil();
|
|
||||||
}
|
|
||||||
return downloadUtil;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DownloadUtil() {
|
|
||||||
okHttpClient = new OkHttpClient();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param url 下载连接
|
|
||||||
* @param destFileDir 下载的文件储存目录
|
|
||||||
* @param destFileName 下载文件名称
|
|
||||||
* @param listener 下载监听
|
|
||||||
*/
|
|
||||||
public void download(final String url, final String destFileDir, final String destFileName, final OnDownloadListener listener) {
|
|
||||||
|
|
||||||
Request request = new Request.Builder().url(url).addHeader("Connection", "close").build();
|
|
||||||
okHttpClient.newCall(request).enqueue(new Callback() {
|
|
||||||
@Override
|
|
||||||
public void onFailure(@NonNull Call call, @NonNull IOException e) {
|
|
||||||
// 下载失败监听回调
|
|
||||||
listener.onDownloadFailed(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
|
||||||
@Override
|
|
||||||
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
|
|
||||||
InputStream is = null;
|
|
||||||
byte[] buf = new byte[2048];
|
|
||||||
int len;
|
|
||||||
FileOutputStream fos = null;
|
|
||||||
|
|
||||||
// 储存下载文件的目录
|
|
||||||
File dir = new File(destFileDir);
|
|
||||||
if (!dir.exists()) dir.mkdirs();
|
|
||||||
|
|
||||||
File file = new File(dir, destFileName);
|
|
||||||
if (file.exists()) file.delete();
|
|
||||||
|
|
||||||
try {
|
|
||||||
is = Objects.requireNonNull(response.body()).byteStream();
|
|
||||||
long total = Objects.requireNonNull(response.body()).contentLength();
|
|
||||||
fos = new FileOutputStream(file);
|
|
||||||
long sum = 0;
|
|
||||||
while ((len = is.read(buf)) != -1) {
|
|
||||||
fos.write(buf, 0, len);
|
|
||||||
sum += len;
|
|
||||||
int progress = (int) (sum * 1.0f / total * 100);
|
|
||||||
// 下载中更新进度条
|
|
||||||
listener.onDownloading(progress);
|
|
||||||
}
|
|
||||||
fos.flush();
|
|
||||||
// 下载完成
|
|
||||||
listener.onDownloadSuccess(file);
|
|
||||||
} catch (Exception e) {
|
|
||||||
listener.onDownloadFailed(e);
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (is != null) is.close();
|
|
||||||
if (fos != null) fos.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface OnDownloadListener {
|
|
||||||
/**
|
|
||||||
* @param file 下载成功后的文件
|
|
||||||
*/
|
|
||||||
void onDownloadSuccess(File file);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param progress 下载进度
|
|
||||||
*/
|
|
||||||
void onDownloading(int progress);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param e 下载异常信息
|
|
||||||
*/
|
|
||||||
void onDownloadFailed(Exception e);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,253 @@
|
|||||||
|
package com.idormy.sms.forwarder.utils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.RandomAccessFile;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 文件读写工具类
|
||||||
|
* external storage
|
||||||
|
外部存储 Environment.getExternalStorageDirectory() SD根目录:/mnt/sdcard/ (6.0后写入需要用户授权)
|
||||||
|
context.getExternalFilesDir(dir) 路径为:/mnt/sdcard/Android/data/< package name >/files/…
|
||||||
|
context.getExternalCacheDir() 路径为:/mnt/sdcard//Android/data/< package name >/cach/…
|
||||||
|
*
|
||||||
|
internal storage
|
||||||
|
内部存储
|
||||||
|
context.getFilesDir() 路径是:/data/data/< package name >/files/…
|
||||||
|
context.getCacheDir() 路径是:/data/data/< package name >/cach/…
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({"UnusedReturnValue", "ResultOfMethodCallIgnored"})
|
||||||
|
public class FileUtils {
|
||||||
|
private static final String TAG = FileUtils.class.getSimpleName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return .外部储存sd卡 根路径
|
||||||
|
*/
|
||||||
|
public static String getRootPath() {
|
||||||
|
// /storage/emulated/0
|
||||||
|
return Environment.getExternalStorageDirectory().getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param context .
|
||||||
|
* @return . 外部储存sd卡 :/mnt/sdcard/Android/data/< package name >/files/…
|
||||||
|
*/
|
||||||
|
public static String getAppRootPth(Context context) {
|
||||||
|
// /storage/emulated/0/Android/data/pack_name/files
|
||||||
|
return context.getExternalFilesDir("").getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return .内部存储
|
||||||
|
*/
|
||||||
|
public static String getInternalPath() {
|
||||||
|
// /data
|
||||||
|
return Environment.getDataDirectory().getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param context .
|
||||||
|
* @return .内部储存:/data/data/< package name >/files/
|
||||||
|
*/
|
||||||
|
public static String getInternalAppPath(Context context) {
|
||||||
|
return context.getFilesDir().getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param path 路径
|
||||||
|
* @param fileName 文件名称
|
||||||
|
* @return .
|
||||||
|
*/
|
||||||
|
public static boolean createFile(String path, String fileName) {
|
||||||
|
File file = new File(path + File.separator + fileName);
|
||||||
|
|
||||||
|
//先创建文件夹 保证文件创建成功
|
||||||
|
createDirs(path);
|
||||||
|
|
||||||
|
if (!file.exists()) {
|
||||||
|
try {
|
||||||
|
file.createNewFile();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param folder 创建多级文件夹
|
||||||
|
* @return .
|
||||||
|
*/
|
||||||
|
public static boolean createDirs(String folder) {
|
||||||
|
File file = new File(folder);
|
||||||
|
|
||||||
|
if (!file.exists()) {
|
||||||
|
boolean mkdirs = file.mkdirs();
|
||||||
|
Log.i(TAG, "createDirs: 不存在文件夹 开始创建" + mkdirs + "--" + folder);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
Log.i(TAG, "createDirs: 文件夹已存在");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* =======================================文件读写=============================================
|
||||||
|
*
|
||||||
|
* @param content 写入字符串
|
||||||
|
* @param path . 目录
|
||||||
|
* @param fileName .文件名
|
||||||
|
* @param isRewrite 是否覆盖
|
||||||
|
*/
|
||||||
|
//1.RandomAccessFile 读写
|
||||||
|
public static boolean writeFileR(String content, String path, String fileName, boolean isRewrite) {
|
||||||
|
//路径非斜杆结尾
|
||||||
|
if (!path.endsWith("/")) path += File.separator;
|
||||||
|
|
||||||
|
File file = new File(path + fileName);
|
||||||
|
|
||||||
|
//文件目录不存在,先创建
|
||||||
|
if (!file.exists()) createFile(path, fileName);
|
||||||
|
|
||||||
|
RandomAccessFile randomAccessFile;
|
||||||
|
try {
|
||||||
|
randomAccessFile = new RandomAccessFile(file, "rw");
|
||||||
|
if (isRewrite) {
|
||||||
|
randomAccessFile.setLength(content.length());
|
||||||
|
randomAccessFile.seek(0);
|
||||||
|
} else {
|
||||||
|
randomAccessFile.seek(randomAccessFile.length());
|
||||||
|
}
|
||||||
|
randomAccessFile.write(content.getBytes());
|
||||||
|
randomAccessFile.close();
|
||||||
|
return true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean writeFileR(String content, String path, String fileName) {
|
||||||
|
return writeFileR(content, path, fileName, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读文件
|
||||||
|
*
|
||||||
|
* @param path .
|
||||||
|
* @param fileName .
|
||||||
|
* @return .
|
||||||
|
*/
|
||||||
|
public static String readFileR(String path, String fileName) {
|
||||||
|
//路径非斜杆结尾
|
||||||
|
if (!path.endsWith("/")) path += File.separator;
|
||||||
|
|
||||||
|
File file = new File(path + fileName);
|
||||||
|
if (!file.exists()) {
|
||||||
|
Log.i(TAG, "readFileR: return null");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder buffer = new StringBuilder();
|
||||||
|
try {
|
||||||
|
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
|
||||||
|
randomAccessFile.seek(0);
|
||||||
|
byte[] buf = new byte[(int) randomAccessFile.length()];
|
||||||
|
if (randomAccessFile.read(buf) != -1) {
|
||||||
|
buffer.append(new String(buf));
|
||||||
|
Log.i(TAG, "readFileR: length" + randomAccessFile.length());
|
||||||
|
//buffer.append(new String(buf, StandardCharsets.UTF_8));
|
||||||
|
}
|
||||||
|
randomAccessFile.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.i(TAG, "readFileR: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读文件
|
||||||
|
*
|
||||||
|
* @param path .文件路径
|
||||||
|
* @param name .名称
|
||||||
|
* @return .
|
||||||
|
*/
|
||||||
|
public static String readFileI(String path, String name) {
|
||||||
|
//路径非斜杆结尾
|
||||||
|
if (!path.endsWith("/")) path += File.separator;
|
||||||
|
|
||||||
|
//默认编码格式 StandardCharsets.UTF_8;
|
||||||
|
File file = new File(path, name);
|
||||||
|
if (!file.exists()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
try {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
builder.append(line);
|
||||||
|
builder.append("\n");
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return builder.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入文件
|
||||||
|
*
|
||||||
|
* @param content 内容.
|
||||||
|
* @param path 目录.
|
||||||
|
* @param fileName 文件名 .
|
||||||
|
*/
|
||||||
|
public static void writeFileO(String content, String path, String fileName) {
|
||||||
|
writeFileO(content, path, fileName, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param content .
|
||||||
|
* @param path .
|
||||||
|
* @param fileName .
|
||||||
|
* @param isReWrite .是否追加
|
||||||
|
*/
|
||||||
|
public static void writeFileO(String content, String path, String fileName, boolean isReWrite) {
|
||||||
|
//路径非斜杆结尾
|
||||||
|
if (!path.endsWith("/")) path += File.separator;
|
||||||
|
|
||||||
|
File file = new File(path + fileName);
|
||||||
|
|
||||||
|
//文件目录不存在,先创建
|
||||||
|
if (!file.exists()) createFile(path, fileName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
FileOutputStream ops = new FileOutputStream(file, isReWrite);
|
||||||
|
OutputStreamWriter opsw = new OutputStreamWriter(ops, StandardCharsets.UTF_8);
|
||||||
|
// byte[] bytes = content.getBytes();
|
||||||
|
opsw.write(content);
|
||||||
|
opsw.close();
|
||||||
|
ops.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,112 +1,265 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingLeft="16dp"
|
|
||||||
android:paddingTop="16dp"
|
|
||||||
android:paddingRight="16dp"
|
|
||||||
android:paddingBottom="16dp"
|
|
||||||
android:weightSum="1">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
|
||||||
android:layout_weight="0.3"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<Button
|
<RadioGroup
|
||||||
android:id="@+id/sendBtn"
|
android:id="@+id/radioGroupTypeCheck"
|
||||||
android:layout_width="wrap_content"
|
style="@style/rg_style"
|
||||||
android:layout_height="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_marginTop="5dip"
|
||||||
android:background="@drawable/send_btn"
|
android:gravity="center"
|
||||||
android:text="@string/send"
|
android:orientation="horizontal">
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="30sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/sendTxt"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="10sp"
|
|
||||||
android:text="@string/old_mobile_phone" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
<RadioButton
|
||||||
|
android:id="@+id/btnTypeNetwork"
|
||||||
|
style="@style/select_style"
|
||||||
|
android:checked="true"
|
||||||
|
android:minWidth="0dp"
|
||||||
|
android:minHeight="0dp"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:paddingTop="5dp"
|
||||||
|
android:paddingEnd="10dp"
|
||||||
|
android:paddingBottom="5dp"
|
||||||
|
android:tag="network"
|
||||||
|
android:text="@string/network_model" />
|
||||||
|
|
||||||
<LinearLayout
|
<RadioButton
|
||||||
android:layout_width="match_parent"
|
android:id="@+id/btnTypeOffline"
|
||||||
android:layout_height="wrap_content"
|
style="@style/select_style"
|
||||||
android:layout_weight="0.1"
|
android:minWidth="0dp"
|
||||||
android:gravity="center_vertical"
|
android:minHeight="0dp"
|
||||||
android:orientation="horizontal"
|
android:paddingStart="10dp"
|
||||||
android:padding="15dp">
|
android:paddingTop="5dp"
|
||||||
|
android:paddingEnd="10dp"
|
||||||
|
android:paddingBottom="5dp"
|
||||||
|
android:tag="offline"
|
||||||
|
android:text="@string/offline_mode" />
|
||||||
|
|
||||||
<TextView
|
</RadioGroup>
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/server_ip"
|
|
||||||
android:textStyle="bold" />
|
|
||||||
|
|
||||||
<com.idormy.sms.forwarder.view.IPEditText
|
<View
|
||||||
android:id="@+id/textServerIp"
|
android:id="@+id/radioGroupLine"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="1dp"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginEnd="25dp"
|
||||||
|
android:background="#aadcdcdc" />
|
||||||
|
|
||||||
</LinearLayout>
|
<LinearLayout
|
||||||
|
android:id="@+id/layoutNetwork"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingTop="15dp">
|
||||||
|
|
||||||
<LinearLayout
|
<Button
|
||||||
android:layout_width="match_parent"
|
android:id="@+id/sendBtn"
|
||||||
android:layout_height="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_weight="0.3"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:layout_gravity="center_horizontal"
|
||||||
android:orientation="vertical">
|
android:background="@drawable/send_btn"
|
||||||
|
android:text="@string/send"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="30sp" />
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/receiveBtn"
|
android:id="@+id/sendTxt"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_marginTop="10sp"
|
||||||
android:background="@drawable/receive_btn"
|
android:text="@string/old_mobile_phone" />
|
||||||
android:text="@string/receive"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="30sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/receiveTxt"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="10sp"
|
|
||||||
android:text="@string/new_mobile_phone" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="0.2"
|
android:gravity="center_vertical"
|
||||||
android:gravity="start"
|
android:orientation="horizontal"
|
||||||
android:orientation="vertical">
|
android:padding="15dp">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/ipText"
|
android:layout_width="wrap_content"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:text="@string/server_ip"
|
||||||
android:layout_marginTop="10dp"
|
android:textStyle="bold" />
|
||||||
android:text="@string/local_ip"
|
|
||||||
android:textStyle="bold" />
|
<com.idormy.sms.forwarder.view.IPEditText
|
||||||
|
android:id="@+id/textServerIp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<LinearLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/receiveBtn"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:background="@drawable/receive_btn"
|
||||||
|
android:text="@string/receive"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="30sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/receiveTxt"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10sp"
|
||||||
|
android:text="@string/new_mobile_phone" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="start"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:paddingEnd="10dp"
|
||||||
|
android:paddingBottom="10dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/ipText"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:text="@string/local_ip"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:text="@string/operating_instruction"
|
||||||
|
android:textSize="10sp"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layoutOffline"
|
||||||
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="10dp"
|
android:orientation="vertical"
|
||||||
android:text="@string/operating_instruction"
|
android:visibility="gone">
|
||||||
android:textSize="10sp"
|
|
||||||
tools:ignore="SmallSp" />
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingTop="15dp">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/exportBtn"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:background="@drawable/send_btn"
|
||||||
|
android:text="@string/export"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="30sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/exportTxt"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10sp"
|
||||||
|
android:text="@string/old_mobile_phone" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="15dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/tips_backup_path"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/backupPathTxt"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text=""
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/importBtn"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:background="@drawable/receive_btn"
|
||||||
|
android:text="@string/imports"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="30sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/importTxt"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10sp"
|
||||||
|
android:text="@string/new_mobile_phone" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="start"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:paddingEnd="10dp"
|
||||||
|
android:paddingBottom="10dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:text="@string/operating_instruction_offline"
|
||||||
|
android:textSize="10sp"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</ScrollView>
|
@ -1,3 +1,3 @@
|
|||||||
#Fri Jul 16 10:33:23 CST 2021
|
#Fri Jul 16 10:33:23 CST 2021
|
||||||
versionName=2.4.3
|
versionName=2.4.4
|
||||||
versionCode=36
|
versionCode=37
|
||||||
|
Loading…
Reference in New Issue