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

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

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

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

Loading…
Cancel
Save