新增:获取所有应用列表(方便复制APP包名)

pull/86/head
pppscn 3 years ago
parent 4b856f8d36
commit 2d4352d40f

@ -95,6 +95,9 @@
<activity
android:name=".SenderActivity"
android:label="@string/sender_setting" />
<activity
android:name=".AppListActivity"
android:label="@string/app_list" />
<receiver
android:name=".receiver.RebootBroadcastReceiver"

@ -26,7 +26,7 @@ import com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker;
@SuppressWarnings("SpellCheckingInspection")
public class AboutActivity extends AppCompatActivity {
private final String TAG = "com.idormy.sms.forwarder.AboutActivity";
private final String TAG = "AboutActivity";
private Context context;
@Override

@ -0,0 +1,157 @@
package com.idormy.sms.forwarder;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY;
import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.idormy.sms.forwarder.adapter.AppAdapter;
import com.idormy.sms.forwarder.model.AppInfo;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("deprecation")
public class AppListActivity extends AppCompatActivity {
public static final int APP_LIST = 0x9731991;
private final String TAG = "AppListActivity";
private List<AppInfo> appInfoList = new ArrayList<>();
private ListView listView;
private String currentType = "user";
//消息处理者,创建一个Handler的子类对象,目的是重写Handler的处理消息的方法(handleMessage())
@SuppressLint("HandlerLeak")
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == NOTIFY) {
Toast.makeText(AppListActivity.this, msg.getData().getString("DATA"), Toast.LENGTH_LONG).show();
} else if (msg.what == APP_LIST) {
AppAdapter adapter = new AppAdapter(AppListActivity.this, R.layout.item_app, appInfoList);
listView.setAdapter(adapter);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_applist);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
Toast.makeText(AppListActivity.this, "加载应用列表中,请稍候...", Toast.LENGTH_LONG).show();
//是否关闭页面提示
TextView help_tip = findViewById(R.id.help_tip);
help_tip.setVisibility(MyApplication.showHelpTip ? View.VISIBLE : View.GONE);
//获取应用列表
getAppList();
//切换日志类别
int typeCheckId = "user".equals(currentType) ? R.id.btnTypeUser : R.id.btnTypeSys;
final RadioGroup radioGroupTypeCheck = findViewById(R.id.radioGroupTypeCheck);
radioGroupTypeCheck.check(typeCheckId);
radioGroupTypeCheck.setOnCheckedChangeListener((group, checkedId) -> {
RadioButton rb = findViewById(checkedId);
currentType = (String) rb.getTag();
getAppList();
});
listView = findViewById(R.id.list_view_app);
listView.setOnItemClickListener((parent, view, position, id) -> {
AppInfo appInfo = appInfoList.get(position);
Log.d(TAG, "onItemClick: " + appInfo.toString());
//复制到剪贴板
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData mClipData = ClipData.newPlainText("pkgName", appInfo.getPkgName());
cm.setPrimaryClip(mClipData);
Toast.makeText(AppListActivity.this, "已复制包名:" + appInfo.getPkgName(), Toast.LENGTH_LONG).show();
});
listView.setOnItemLongClickListener((parent, view, position, id) -> {
AppInfo appInfo = appInfoList.get(position);
Log.d(TAG, "onItemClick: " + appInfo.toString());
//启动应用
Intent intent;
intent = getPackageManager().getLaunchIntentForPackage(appInfo.getPkgName());
startActivity(intent);
return true;
});
}
//获取应用列表
private void getAppList() {
new Thread(() -> {
appInfoList = new ArrayList<>();
PackageManager pm = getApplication().getPackageManager();
@SuppressLint("QueryPermissionsNeeded") List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo packageInfo : packages) {
if ("user".equals(currentType) && (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { //用户应用
continue;
}
if ("sys".equals(currentType) && (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { //系统应用
continue;
}
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
String packageName = packageInfo.packageName;
Drawable drawable = packageInfo.applicationInfo.loadIcon(pm);
String verName = packageInfo.versionName;
int verCode = packageInfo.versionCode;
AppInfo appInfo = new AppInfo(appName, packageName, drawable, verName, verCode);
appInfoList.add(appInfo);
Log.d(TAG, appInfo.toString());
}
Message message = new Message();
message.what = APP_LIST;
message.obj = appInfoList;
handler.sendMessage(message);
}).start();
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
}

@ -36,7 +36,7 @@ import okhttp3.Request;
import okhttp3.Response;
public class CloneActivity extends AppCompatActivity {
private final String TAG = "com.idormy.sms.forwarder.CloneActivity";
private final String TAG = "CloneActivity";
private Context context;
private boolean isRunning = false;
private String serverIp;

@ -0,0 +1,111 @@
package com.idormy.sms.forwarder.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.idormy.sms.forwarder.R;
import com.idormy.sms.forwarder.model.AppInfo;
import java.util.List;
public class AppAdapter extends ArrayAdapter<AppInfo> {
private final int resourceId;
private List<AppInfo> list;
// 适配器的构造函数,把要适配的数据传入这里
public AppAdapter(Context context, int textViewResourceId, List<AppInfo> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
list = objects;
}
@Override
public int getCount() {
return list.size();
}
@Override
public AppInfo getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
AppInfo item = list.get(position);
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
AppInfo appInfo = getItem(position); //获取当前项的TLog实例
// 加个判断以免ListView每次滚动时都要重新加载布局以提高运行效率
View view;
AppAdapter.ViewHolder viewHolder;
if (convertView == null) {
// 避免ListView每次滚动时都要重新加载布局以提高运行效率
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
// 避免每次调用getView()时都要重新获取控件实例
viewHolder = new AppAdapter.ViewHolder();
viewHolder.appName = view.findViewById(R.id.appName);
viewHolder.pkgName = view.findViewById(R.id.pkgName);
viewHolder.appIcon = view.findViewById(R.id.appIcon);
viewHolder.verName = view.findViewById(R.id.verName);
viewHolder.verCode = view.findViewById(R.id.verCode);
// 将ViewHolder存储在View中即将控件的实例存储在其中
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (AppAdapter.ViewHolder) view.getTag();
}
// 获取控件实例并调用set...方法使其显示出来
if (appInfo != null) {
viewHolder.appName.setText(appInfo.getAppName());
viewHolder.pkgName.setText(appInfo.getPkgName());
viewHolder.appIcon.setBackground(appInfo.getAppIcon());
viewHolder.verName.setText(appInfo.getVerName());
viewHolder.verCode.setText(appInfo.getVerCode() + "");
}
return view;
}
public void add(List<AppInfo> appModels) {
if (list != null) {
list = appModels;
notifyDataSetChanged();
}
}
public void del(List<AppInfo> appModels) {
if (list != null) {
list = appModels;
notifyDataSetChanged();
}
}
public void update(List<AppInfo> appModels) {
if (list != null) {
list = appModels;
notifyDataSetChanged();
}
}
// 定义一个内部类,用于对控件的实例进行缓存
static class ViewHolder {
TextView appName;
TextView pkgName;
ImageView appIcon;
TextView verName;
TextView verCode;
}
}

@ -0,0 +1,47 @@
package com.idormy.sms.forwarder.model;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import lombok.Data;
@Data
public class AppInfo {
public String pkgName;
public String appName;
public Drawable appIcon;
public Intent appIntent;
public String verName;
public int verCode;
public AppInfo() {
}
public AppInfo(String appName) {
this.appName = appName;
}
public AppInfo(String appName, String pkgName) {
this.appName = appName;
this.pkgName = pkgName;
}
public AppInfo(String appName, String pkgName, Drawable appIcon, String verName, int verCode) {
this.appName = appName;
this.pkgName = pkgName;
this.appIcon = appIcon;
this.verName = verName;
this.verCode = verCode;
}
@Override
public String toString() {
return "AppInfo{" +
"appName='" + appName + '\'' +
", pkgName='" + pkgName + '\'' +
", appIcon=" + appIcon +
", verName=" + verName +
", verCode=" + verCode +
'}';
}
}

@ -40,7 +40,7 @@ public class LogVo {
}
}
return R.drawable.app;
return R.drawable.ic_app;
}
public int getStatusImageId() {

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dip"
android:orientation="horizontal">
<RadioGroup
android:id="@+id/radioGroupTypeCheck"
style="@style/rg_style"
android:orientation="horizontal">
<RadioButton
android:id="@+id/btnTypeUser"
style="@style/select_style"
android:tag="user"
android:text="@string/user_app"
android:checked="true" />
<RadioButton
android:id="@+id/btnTypeSys"
style="@style/select_style"
android:tag="sys"
android:text="@string/system_app" />
</RadioGroup>
</LinearLayout>
<ListView
android:id="@+id/list_view_app"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="5dp"
android:layout_weight="1" />
<TextView
android:id="@+id/help_tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_tips"
android:textColor="@color/colorPrimary" />
</LinearLayout>

@ -1,211 +1,217 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">SmsForwarder</string>
<string name="notification_content">Forward to DingTalk/WeCom/FeiShu/Email/Bark/ServerChan/Telegram/Webhook, etc</string>
<!--Common-->
<string name="ok">OK</string>
<string name="cancel">Cancel</string>
<string name="del">Delete</string>
<string name="test">Test</string>
<string name="confirm">Confirm</string>
<string name="all">All</string>
<string name="select">Select</string>
<string name="clone">Clone Settings</string>
<string name="setting">Settings</string>
<string name="about">About</string>
<string name="rule_setting">Rule Setting</string>
<string name="sender_setting">Sender Setting</string>
<string name="log_tips">Tips: Pull to refresh; Long press to delete one log entry.</string>
<string name="rule_tips">Tips: Tap "NEW FORWARDING RULE" to add a new rule; Long press one to delete; Tap an existing one to edit.</string>
<string name="sender_tips">Tips: Tap "NEW SENDER" to add a new sender; Long press one to delete; Tap an existing one to edit.</string>
<!--AboutActivity-->
<string name="version">Version</string>
<string name="check_for_updates">Check for updates</string>
<string name="auto_startup">Auto startup</string>
<string name="show_tips">Show tips</string>
<string name="open_source">Open source</string>
<string name="synchronize_mirror">Synchronize Mirror</string>
<string name="qq_group">QQ Group</string>
<string name="qq_group1">1st562854376</string>
<string name="qq_group2">2nd31330492</string>
<string name="join_qq_group1">Join 1st Group</string>
<string name="join_qq_group2">Join 2nd Group</string>
<string name="cache">Cache</string>
<string name="purge">Purge</string>
<string name="checking">Checking…</string>
<string name="up_to_date">Yo, you are up to date!</string>
<string name="cache_purged">Cache purged</string>
<string name="unknown_qq_version">No mobile QQ is installed or not supported by recent version!</string>
<!--MainActivity-->
<string name="bt_refresh_log">Clear Logs</string>
<string name="delete_log_title">Delete confirmation</string>
<string name="delete_log_tips">Are you sure to delete this log entry?</string>
<string name="delete_log_toast">The log entry has deleted.</string>
<string name="details">Details</string>
<string name="clear_logs_tips">Are you sure to clear all forwarding logs?</string>
<string name="pull_tips">Pull to refresh.</string>
<string name="release_tips">Release to refresh.</string>
<string name="reflashing_tips">Refreshing…</string>
<!--RuleActivity-->
<string name="setrule">Fwd Rule Settings</string>
<string name="setrule_call">Fwd Rule Settings of call</string>
<string name="setrule_app">Fwd Rule Settings of app</string>
<string name="delete_rule_title">Delete confirmation</string>
<string name="delete_rule_tips">Are you sure to delete this rule entry?</string>
<string name="delete_rule_toast">The rule entry has deleted.</string>
<string name="new_sender_first">Please add a new sender and then choose it.</string>
<string name="add_sender_first">Please add a sender first.</string>
<string name="select_sender">Select Sender</string>
<string name="rule_tester">Rule tester:</string>
<string name="new_forwarding_rule">New forwarding rule</string>
<string name="test_sim_slot">Test Sim Slot</string>
<string name="test_phone_number">Test Phone Number</string>
<string name="test_msg_content">Test Msg Content</string>
<string name="match_sim_slot">Sim Slot</string>
<string name="match_field">Field</string>
<string name="phone_number">Phone No.</string>
<string name="package_name">PackageName</string>
<string name="sms_content">SMS</string>
<string name="inform_content">Inform content</string>
<string name="multiple_matches">Multiple</string>
<string name="match_type">Type</string>
<string name="btn_is">Is</string>
<string name="btn_contain">Contain</string>
<string name="btn_not_contain">Not Contain</string>
<string name="btn_start_with">Start With</string>
<string name="btn_end_with">End With</string>
<string name="btn_regex">Regex Match</string>
<string name="match_value">Value</string>
<!--SenderActivity-->
<string name="invalid_sender">Invalid sender, abort!</string>
<string name="delete_sender_title">Delete confirmation</string>
<string name="delete_sender_tips">Are you sure to delete this rule entry?</string>
<string name="delete_sender_toast">The rule entry has deleted.</string>
<string name="add_sender_title">Select sender type</string>
<string name="not_supported">Not supported</string>
<string name="setdingdingtitle">DingTalk Bot Settings</string>
<string name="setemailtitle">Email Settings</string>
<string name="setwebnotifytitle">Webhook Settings</string>
<string name="setqywxgrouprobottitle">WeCom Group Bot Settings</string>
<string name="setqywxapptitle">WeCom Settings</string>
<string name="setbarktitle">Bark Settings</string>
<string name="setserverchantitle">ServerChan·Turbo Settings</string>
<string name="settelegramtitle">Telegram Bot Settings</string>
<string name="setsmstitle">SMS Settings</string>
<string name="setfeishutitle">FeiShu Bot Settings</string>
<string name="test_phone_num">19999999999</string>
<string name="test_content">Test content @</string>
<string name="test_sms">【JD】code 387481, ihelp.jd.com</string>
<string name="test_group_name">Test Group Name</string>
<string name="failed_to_fwd">Failed to fwd</string>
<string name="invalid_token">Token cannot be empty</string>
<string name="invalid_email">Invalid email settings</string>
<string name="invalid_bark_server">Bark-server cannot be empty</string>
<string name="invalid_apiToken_or_chatId">Neither ApiToken nor ChatId can be empty</string>
<string name="invalid_sendkey">SendKey cannot be empty</string>
<string name="invalid_webserver">WebServer cannot be empty</string>
<string name="invalid_webhook">webHook cannot be empty</string>
<string name="invalid_at_mobiles">The specified member cannot be empty or select @all</string>
<string name="invalid_phone_num">Phone number cannot be empty</string>
<string name="new_sender">New Sender</string>
<string name="set_bark_name">Bark Group Name</string>
<string name="set_bark_server">Bark-Server, e.g. https://bark.bms.ink/XXXXXXXX/</string>
<string name="set_bark_icon">Bark-Icon (optional), e.g. http://day.app/assets/images/avatar.jpg</string>
<string name="set_name">Name</string>
<string name="dingding_token">Token e.g. the XXXXXX part of https://oapi.dingtalk.com/robot/send?access_token=XXXXXX</string>
<string name="dingding_secret">Secret (optional)</string>
<string name="dingding_at">At Mobiles e.g. 18888888888,19999999999</string>
<string name="email_host">SMTP Host</string>
<string name="smtp_port">SMTP Port</string>
<string name="enable_ssl">SSL</string>
<string name="email_account">Account</string>
<string name="email_password">Password/Auth Code</string>
<string name="email_nickname">Nickname</string>
<string name="email_to">Send To</string>
<string name="feishu_webhook">Webhook</string>
<string name="feishu_secret">Secret (optional)</string>
<string name="Corp_ID">Corp ID</string>
<string name="Agent_ID">Agent ID</string>
<string name="App_Secret">App Secret</string>
<string name="is_at_all">Is at all</string>
<string name="specified_member">Specified Member</string>
<string name="specified_member_tips">TipSpecify members receive messages, member ID list (multiple recipients with \'|\' space, maximum 1000)</string>
<string name="QYWXGroupRobotWebHook">WebHook, e.g. https://qyapi.weixin.qq.com/cgixx?key=xxx</string>
<string name="ServerChanSendKey">ServerChan\'s SendKey</string>
<string name="TelegramApiToken">ApiToken or Custom address</string>
<string name="TelegramChatId">ChatId</string>
<string name="WebNotifyMethod" formatted="false">Method</string>
<string name="WebNotifyWebServer">WebServer e.g. https://a.b.com/msg?token=xyz</string>
<string name="WebNotifyWebParams">WebParams e.g. payload=%7B%22text%22%3A%22[msg]%22%7D [msg] will be replaced with text message content. \nSupport Json format, for example: {"text":[MSG]}.\n Note: MSG is automatically utF-8 encoded in addition to JSON format</string>
<string name="WebNotifySecret">Secret (If empty, sign is not counted)</string>
<string name="SmsSimSlot">Sim Slot</string>
<string name="same_source">Same source</string>
<string name="SmsMobiles">Receive mobile phone numbers separated by, e.g. 15888888888;19999999999</string>
<string name="OnlyNoNetwork">仅当无网络时启用</string>
<!--SettingActivity-->
<string name="device_name">Device name</string>
<string name="sim1_remark" tools:ignore="Typos">SIM1 Remark</string>
<string name="sim2_remark" tools:ignore="Typos">SIM2 Remark</string>
<string name="carrier_mobile">Carrier_Mobile Number</string>
<string name="low_power_alarm_threshold">Low power alarm threshold</string>
<string name="low_power_alarm_threshold_tips">Value range: 0100. Left blank or 0 is disabled</string>
<string name="retry_interval">Retry interval (seconds)</string>
<string name="retry_interval_tips">Retry five times after it fails</string>
<string name="add_extra">Sim slot info attached</string>
<string name="add_device_name">Device Name attached</string>
<string name="forward_missed_calls">Forward missed calls</string>
<string name="forward_app_notify">Forward app notify</string>
<string name="enable_custom_templates">Enable custom templates</string>
<string name="custom_templates">Custom templates</string>
<string name="custom_templates_tips">TipInsert labels as needed;Leave blank to default template</string>
<string name="insert_sender">Phone</string>
<string name="insert_sender_app">PackageName</string>
<string name="insert_content">SMS</string>
<string name="insert_content_app">InformContent</string>
<string name="insert_extra">SIM</string>
<string name="insert_time">Time</string>
<string name="insert_device_name">Device</string>
<string name="init_setting">Restore initial Setting</string>
<string name="battery_setting">Battery Optimization</string>
<string name="request_permission">Request Notify Permission</string>
<string name="unknown_number">Unknown Number</string>
<string name="calling">Incoming telegram</string>
<string name="unsupport">Your phone does not support this setting</string>
<string name="isIgnored">Set successfully!</string>
<!--Other-->
<string name="version_now">v1.0</string>
<string name="linkweb">https://github.com/pppscn/SmsForwarder</string>
<string name="linkweb2">https://gitee.com/pp/SmsForwarder</string>
<string name="cache_size">0KB</string>
<string name="sim1" tools:ignore="Typos">SIM1</string>
<string name="sim2" tools:ignore="Typos">SIM2</string>
<string name="mu_rule_tips">多重匹配规则示例:\n \n 并且 是 手机号 相等 10086\n 或者 是 手机号 相等 10011\n 并且 是 短信内容 包含 欠费\n \n 以上规则表示收到短信并且手机号是10086 或者 手机号是10010并且 短信内容 包含 欠费 时转发短信\n 注意:每行开始的空格代表层级,太过复杂的多重规则可能导致内存占用很大!</string>
<string name="mu_rule_tips2">多重匹配规则示例:\n \n 并且 是 包名 相等 com.tencent.mm\n 或者 是 包名 相等 com.tencent.mm\n 并且 是 通知内容 包含 欠费\n \n 以上规则表示收到APP通知并且包名是com.tencent.mm 或者 包名是com.tencent.mm并且 通知内容 包含 欠费 时转发通知\n 注意:每行开始的空格代表层级,太过复杂的多重规则可能导致内存占用很大!</string>
<string name="post">POST</string>
<string name="get">GET</string>
<!--CloneActivity-->
<string name="local_ip">Local IP</string>
<string name="operating_instruction">Operation instructions: \n1. Please keep the old and new phones in the same WiFi network, and do not turn on isolation \n2.The old mobile phone directly click "send" button, get "server IP" \n3. After filling in "Server IP" for the new mobile phone, click "Receive" button \n [note], the sender and forwarding rules will be completely covered after the new mobile phone receives!</string>
<string name="send">Send</string>
<string name="stop">Stop</string>
<string name="old_mobile_phone">I\'m the old phone</string>
<string name="receive">Receive</string>
<string name="new_mobile_phone">I\'m the new phone</string>
<string name="server_ip">Server IP: </string>
<string name="point">.</string>
<string name="invalid_ip">Please enter a valid IP address</string>
<string name="server_has_started">The server is started successfully</string>
<string name="server_has_stopped">The server has been stopped</string>
<string name="sender_cannot_receive">This mobile phone is the sender and cannot receive files.</string>
<string name="no_wifi_network">If the Wifi network is not connected, the one-click cloning function cannot be used.</string>
<string name="invalid_server_ip">Please enter a valid server IP address</string>
<string name="download_failed">Download Failed</string>
<string name="download_success">Download Success</string>
<string name="on_wireless_network">Currently on a wireless network</string>
<string name="on_mobile_network">Currently on a mobile network</string>
<string name="no_network">No network at present</string>
<string name="not_connected_wifi">Not connected WIFI</string>
<string name="failed_to_get_ip">Failed to get IP address</string>
<string name="sms">短 信</string>
<string name="call">来 电</string>
<string name="app">应 用</string>
</resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">SmsForwarder</string>
<string name="notification_content">Forward to DingTalk/WeCom/FeiShu/Email/Bark/ServerChan/Telegram/Webhook, etc</string>
<!--Common-->
<string name="ok">OK</string>
<string name="cancel">Cancel</string>
<string name="del">Delete</string>
<string name="test">Test</string>
<string name="confirm">Confirm</string>
<string name="all">All</string>
<string name="select">Select</string>
<string name="clone">Clone Settings</string>
<string name="setting">Settings</string>
<string name="about">About</string>
<string name="rule_setting">Rule Setting</string>
<string name="sender_setting">Sender Setting</string>
<string name="app_list">App List</string>
<string name="log_tips">Tips: Pull to refresh; Long press to delete one log entry.</string>
<string name="rule_tips">Tips: Tap "NEW FORWARDING RULE" to add a new rule; Long press one to delete; Tap an existing one to edit.</string>
<string name="sender_tips">Tips: Tap "NEW SENDER" to add a new sender; Long press one to delete; Tap an existing one to edit.</string>
<string name="app_tips">Tips: Tap to copy the package name of APP; Long press one to start and jump to.</string>
<!--AboutActivity-->
<string name="version">Version</string>
<string name="check_for_updates">Check for updates</string>
<string name="auto_startup">Auto startup</string>
<string name="show_tips">Show tips</string>
<string name="open_source">Open source</string>
<string name="synchronize_mirror">Synchronize Mirror</string>
<string name="qq_group">QQ Group</string>
<string name="qq_group1">1st562854376</string>
<string name="qq_group2">2nd31330492</string>
<string name="join_qq_group1">Join 1st Group</string>
<string name="join_qq_group2">Join 2nd Group</string>
<string name="cache">Cache</string>
<string name="purge">Purge</string>
<string name="checking">Checking…</string>
<string name="up_to_date">Yo, you are up to date!</string>
<string name="cache_purged">Cache purged</string>
<string name="unknown_qq_version">No mobile QQ is installed or not supported by recent version!</string>
<!--MainActivity-->
<string name="bt_refresh_log">Clear Logs</string>
<string name="delete_log_title">Delete confirmation</string>
<string name="delete_log_tips">Are you sure to delete this log entry?</string>
<string name="delete_log_toast">The log entry has deleted.</string>
<string name="details">Details</string>
<string name="clear_logs_tips">Are you sure to clear all forwarding logs?</string>
<string name="pull_tips">Pull to refresh.</string>
<string name="release_tips">Release to refresh.</string>
<string name="reflashing_tips">Refreshing…</string>
<!--RuleActivity-->
<string name="setrule">Fwd Rule Settings</string>
<string name="setrule_call">Fwd Rule Settings of call</string>
<string name="setrule_app">Fwd Rule Settings of app</string>
<string name="delete_rule_title">Delete confirmation</string>
<string name="delete_rule_tips">Are you sure to delete this rule entry?</string>
<string name="delete_rule_toast">The rule entry has deleted.</string>
<string name="new_sender_first">Please add a new sender and then choose it.</string>
<string name="add_sender_first">Please add a sender first.</string>
<string name="select_sender">Select Sender</string>
<string name="rule_tester">Rule tester:</string>
<string name="new_forwarding_rule">New forwarding rule</string>
<string name="test_sim_slot">Test Sim Slot</string>
<string name="test_phone_number">Test Phone Number</string>
<string name="test_msg_content">Test Msg Content</string>
<string name="match_sim_slot">Sim Slot</string>
<string name="match_field">Field</string>
<string name="phone_number">Phone No.</string>
<string name="package_name">PackageName</string>
<string name="sms_content">SMS</string>
<string name="inform_content">Inform content</string>
<string name="multiple_matches">Multiple</string>
<string name="match_type">Type</string>
<string name="btn_is">Is</string>
<string name="btn_contain">Contain</string>
<string name="btn_not_contain">Not Contain</string>
<string name="btn_start_with">Start With</string>
<string name="btn_end_with">End With</string>
<string name="btn_regex">Regex Match</string>
<string name="match_value">Value</string>
<!--SenderActivity-->
<string name="invalid_sender">Invalid sender, abort!</string>
<string name="delete_sender_title">Delete confirmation</string>
<string name="delete_sender_tips">Are you sure to delete this rule entry?</string>
<string name="delete_sender_toast">The rule entry has deleted.</string>
<string name="add_sender_title">Select sender type</string>
<string name="not_supported">Not supported</string>
<string name="setdingdingtitle">DingTalk Bot Settings</string>
<string name="setemailtitle">Email Settings</string>
<string name="setwebnotifytitle">Webhook Settings</string>
<string name="setqywxgrouprobottitle">WeCom Group Bot Settings</string>
<string name="setqywxapptitle">WeCom Settings</string>
<string name="setbarktitle">Bark Settings</string>
<string name="setserverchantitle">ServerChan·Turbo Settings</string>
<string name="settelegramtitle">Telegram Bot Settings</string>
<string name="setsmstitle">SMS Settings</string>
<string name="setfeishutitle">FeiShu Bot Settings</string>
<string name="test_phone_num">19999999999</string>
<string name="test_content">Test content @</string>
<string name="test_sms">【JD】code 387481, ihelp.jd.com</string>
<string name="test_group_name">Test Group Name</string>
<string name="failed_to_fwd">Failed to fwd</string>
<string name="invalid_token">Token cannot be empty</string>
<string name="invalid_email">Invalid email settings</string>
<string name="invalid_bark_server">Bark-server cannot be empty</string>
<string name="invalid_apiToken_or_chatId">Neither ApiToken nor ChatId can be empty</string>
<string name="invalid_sendkey">SendKey cannot be empty</string>
<string name="invalid_webserver">WebServer cannot be empty</string>
<string name="invalid_webhook">webHook cannot be empty</string>
<string name="invalid_at_mobiles">The specified member cannot be empty or select @all</string>
<string name="invalid_phone_num">Phone number cannot be empty</string>
<string name="new_sender">New Sender</string>
<string name="set_bark_name">Bark Group Name</string>
<string name="set_bark_server">Bark-Server, e.g. https://bark.bms.ink/XXXXXXXX/</string>
<string name="set_bark_icon">Bark-Icon (optional), e.g. http://day.app/assets/images/avatar.jpg</string>
<string name="set_name">Name</string>
<string name="dingding_token">Token e.g. the XXXXXX part of https://oapi.dingtalk.com/robot/send?access_token=XXXXXX</string>
<string name="dingding_secret">Secret (optional)</string>
<string name="dingding_at">At Mobiles e.g. 18888888888,19999999999</string>
<string name="email_host">SMTP Host</string>
<string name="smtp_port">SMTP Port</string>
<string name="enable_ssl">SSL</string>
<string name="email_account">Account</string>
<string name="email_password">Password/Auth Code</string>
<string name="email_nickname">Nickname</string>
<string name="email_to">Send To</string>
<string name="feishu_webhook">Webhook</string>
<string name="feishu_secret">Secret (optional)</string>
<string name="Corp_ID">Corp ID</string>
<string name="Agent_ID">Agent ID</string>
<string name="App_Secret">App Secret</string>
<string name="is_at_all">Is at all</string>
<string name="specified_member">Specified Member</string>
<string name="specified_member_tips">TipSpecify members receive messages, member ID list (multiple recipients with \'|\' space, maximum 1000)</string>
<string name="QYWXGroupRobotWebHook">WebHook, e.g. https://qyapi.weixin.qq.com/cgixx?key=xxx</string>
<string name="ServerChanSendKey">ServerChan\'s SendKey</string>
<string name="TelegramApiToken">ApiToken or Custom address</string>
<string name="TelegramChatId">ChatId</string>
<string name="WebNotifyMethod" formatted="false">Method</string>
<string name="WebNotifyWebServer">WebServer e.g. https://a.b.com/msg?token=xyz</string>
<string name="WebNotifyWebParams">WebParams e.g. payload=%7B%22text%22%3A%22[msg]%22%7D [msg] will be replaced with text message content. \nSupport Json format, for example: {"text":[MSG]}.\n Note: MSG is automatically utF-8 encoded in addition to JSON format</string>
<string name="WebNotifySecret">Secret (If empty, sign is not counted)</string>
<string name="SmsSimSlot">Sim Slot</string>
<string name="same_source">Same source</string>
<string name="SmsMobiles">Receive mobile phone numbers separated by, e.g. 15888888888;19999999999</string>
<string name="OnlyNoNetwork">仅当无网络时启用</string>
<!--SettingActivity-->
<string name="device_name">Device name</string>
<string name="sim1_remark" tools:ignore="Typos">SIM1 Remark</string>
<string name="sim2_remark" tools:ignore="Typos">SIM2 Remark</string>
<string name="carrier_mobile">Carrier_Mobile Number</string>
<string name="low_power_alarm_threshold">Low power alarm threshold</string>
<string name="low_power_alarm_threshold_tips">Value range: 0100. Left blank or 0 is disabled</string>
<string name="retry_interval">Retry interval (seconds)</string>
<string name="retry_interval_tips">Retry five times after it fails</string>
<string name="add_extra">Sim slot info attached</string>
<string name="add_device_name">Device Name attached</string>
<string name="forward_sms">Forward sms</string>
<string name="forward_missed_calls">Forward missed calls</string>
<string name="forward_app_notify">Forward app notify</string>
<string name="enable_custom_templates">Enable custom templates</string>
<string name="custom_templates">Custom templates</string>
<string name="custom_templates_tips">TipInsert labels as needed;Leave blank to default template</string>
<string name="insert_sender">Phone</string>
<string name="insert_sender_app">PackageName</string>
<string name="insert_content">SMS</string>
<string name="insert_content_app">InformContent</string>
<string name="insert_extra">SIM</string>
<string name="insert_time">Time</string>
<string name="insert_device_name">Device</string>
<string name="init_setting">Restore initial Setting</string>
<string name="battery_setting">Battery Optimization</string>
<string name="request_permission">Request Notify Permission</string>
<string name="unknown_number">Unknown Number</string>
<string name="calling">Incoming telegram</string>
<string name="unsupport">Your phone does not support this setting</string>
<string name="isIgnored">Set successfully!</string>
<!--Other-->
<string name="version_now">v1.0</string>
<string name="linkweb">https://github.com/pppscn/SmsForwarder</string>
<string name="linkweb2">https://gitee.com/pp/SmsForwarder</string>
<string name="cache_size">0KB</string>
<string name="sim1" tools:ignore="Typos">SIM1</string>
<string name="sim2" tools:ignore="Typos">SIM2</string>
<string name="mu_rule_tips">多重匹配规则示例:\n \n 并且 是 手机号 相等 10086\n 或者 是 手机号 相等 10011\n 并且 是 短信内容 包含 欠费\n \n 以上规则表示收到短信并且手机号是10086 或者 手机号是10010并且 短信内容 包含 欠费 时转发短信\n 注意:每行开始的空格代表层级,太过复杂的多重规则可能导致内存占用很大!</string>
<string name="mu_rule_tips2">多重匹配规则示例:\n \n 并且 是 包名 相等 com.tencent.mm\n 或者 是 包名 相等 com.tencent.mm\n 并且 是 通知内容 包含 欠费\n \n 以上规则表示收到APP通知并且包名是com.tencent.mm 或者 包名是com.tencent.mm并且 通知内容 包含 欠费 时转发通知\n 注意:每行开始的空格代表层级,太过复杂的多重规则可能导致内存占用很大!</string>
<string name="post">POST</string>
<string name="get">GET</string>
<!--CloneActivity-->
<string name="local_ip">Local IP</string>
<string name="operating_instruction">Operation instructions: \n1. Please keep the old and new phones in the same WiFi network, and do not turn on isolation \n2.The old mobile phone directly click "send" button, get "server IP" \n3. After filling in "Server IP" for the new mobile phone, click "Receive" button \n [note], the sender and forwarding rules will be completely covered after the new mobile phone receives!</string>
<string name="send">Send</string>
<string name="stop">Stop</string>
<string name="old_mobile_phone">I\'m the old phone</string>
<string name="receive">Receive</string>
<string name="new_mobile_phone">I\'m the new phone</string>
<string name="server_ip">Server IP: </string>
<string name="point">.</string>
<string name="invalid_ip">Please enter a valid IP address</string>
<string name="server_has_started">The server is started successfully</string>
<string name="server_has_stopped">The server has been stopped</string>
<string name="sender_cannot_receive">This mobile phone is the sender and cannot receive files.</string>
<string name="no_wifi_network">If the Wifi network is not connected, the one-click cloning function cannot be used.</string>
<string name="invalid_server_ip">Please enter a valid server IP address</string>
<string name="download_failed">Download Failed</string>
<string name="download_success">Download Success</string>
<string name="on_wireless_network">Currently on a wireless network</string>
<string name="on_mobile_network">Currently on a mobile network</string>
<string name="no_network">No network at present</string>
<string name="not_connected_wifi">Not connected WIFI</string>
<string name="failed_to_get_ip">Failed to get IP address</string>
<string name="sms">SMS</string>
<string name="call">Call</string>
<string name="app">App</string>
<string name="appicon">App Icon</string>
<string name="user_app">User App</string>
<string name="system_app">System App</string>
</resources>

@ -6,6 +6,13 @@
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="actionOverflowMenuStyle">@style/OverflowMenu</item>
</style>
<style name="OverflowMenu" parent="Base.Widget.AppCompat.PopupMenu.Overflow">
<item name="android:dropDownWidth">100dp</item>
<!-- 是否覆盖锚点默认为true即盖住Toolbar -->
<item name="overlapAnchor">false</item>
</style>
<style name="rg_style">

Loading…
Cancel
Save