新增:一键克隆增加离线模式(导出备份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"?>
|
||||
<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"
|
||||
android:layout_width="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">
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_weight="0.3"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<Button
|
||||
android:id="@+id/sendBtn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:background="@drawable/send_btn"
|
||||
android:text="@string/send"
|
||||
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" />
|
||||
<RadioGroup
|
||||
android:id="@+id/radioGroupTypeCheck"
|
||||
style="@style/rg_style"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginTop="5dip"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal">
|
||||
|
||||
</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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0.1"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
android:padding="15dp">
|
||||
<RadioButton
|
||||
android:id="@+id/btnTypeOffline"
|
||||
style="@style/select_style"
|
||||
android:minWidth="0dp"
|
||||
android:minHeight="0dp"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:tag="offline"
|
||||
android:text="@string/offline_mode" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/server_ip"
|
||||
android:textStyle="bold" />
|
||||
</RadioGroup>
|
||||
|
||||
<com.idormy.sms.forwarder.view.IPEditText
|
||||
android:id="@+id/textServerIp"
|
||||
<View
|
||||
android:id="@+id/radioGroupLine"
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0.3"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
<Button
|
||||
android:id="@+id/sendBtn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:background="@drawable/send_btn"
|
||||
android:text="@string/send"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="30sp" />
|
||||
|
||||
<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" />
|
||||
<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>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0.2"
|
||||
android:gravity="start"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
android:padding="15dp">
|
||||
|
||||
<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:text="@string/server_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
|
||||
android:layout_width="wrap_content"
|
||||
<LinearLayout
|
||||
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_marginTop="10dp"
|
||||
android:text="@string/operating_instruction"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
|
||||
<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>
|
||||
</ScrollView>
|
@ -1,3 +1,3 @@
|
||||
#Fri Jul 16 10:33:23 CST 2021
|
||||
versionName=2.4.3
|
||||
versionCode=36
|
||||
versionName=2.4.4
|
||||
versionCode=37
|
||||
|
Loading…
Reference in New Issue