整理:工具类代码

pull/86/head
pppscn 3 years ago
parent 64f6ec1369
commit e6cafa521a

@ -18,8 +18,8 @@ import androidx.appcompat.app.AppCompatActivity;
import com.idormy.sms.forwarder.receiver.RebootBroadcastReceiver; import com.idormy.sms.forwarder.receiver.RebootBroadcastReceiver;
import com.idormy.sms.forwarder.utils.CacheUtil; import com.idormy.sms.forwarder.utils.CacheUtil;
import com.idormy.sms.forwarder.utils.CommonUtil;
import com.idormy.sms.forwarder.utils.Define; import com.idormy.sms.forwarder.utils.Define;
import com.idormy.sms.forwarder.utils.aUtil;
import com.xuexiang.xupdate.easy.EasyUpdate; import com.xuexiang.xupdate.easy.EasyUpdate;
import com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker; import com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker;
@ -48,7 +48,7 @@ public class AboutActivity extends AppCompatActivity {
final TextView version_now = findViewById(R.id.version_now); final TextView version_now = findViewById(R.id.version_now);
Button check_version_now = findViewById(R.id.check_version_now); Button check_version_now = findViewById(R.id.check_version_now);
try { try {
version_now.setText(aUtil.getVersionName(AboutActivity.this)); version_now.setText(CommonUtil.getVersionName(AboutActivity.this));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -56,7 +56,7 @@ public class AboutActivity extends AppCompatActivity {
check_version_now.setOnClickListener(v -> { check_version_now.setOnClickListener(v -> {
try { try {
String updateUrl = "https://xupdate.bms.ink/update/checkVersion?appKey=com.idormy.sms.forwarder&versionCode="; String updateUrl = "https://xupdate.bms.ink/update/checkVersion?appKey=com.idormy.sms.forwarder&versionCode=";
updateUrl += aUtil.getVersionCode(AboutActivity.this); updateUrl += CommonUtil.getVersionCode(AboutActivity.this);
EasyUpdate.create(AboutActivity.this, updateUrl) EasyUpdate.create(AboutActivity.this, updateUrl)
.updateChecker(new DefaultUpdateChecker() { .updateChecker(new DefaultUpdateChecker() {
@ -154,5 +154,4 @@ public class AboutActivity extends AppCompatActivity {
} }
} }
} }

@ -34,11 +34,12 @@ import com.idormy.sms.forwarder.notify.NotifyListener;
import com.idormy.sms.forwarder.sender.SendUtil; import com.idormy.sms.forwarder.sender.SendUtil;
import com.idormy.sms.forwarder.service.FrontService; import com.idormy.sms.forwarder.service.FrontService;
import com.idormy.sms.forwarder.service.NotifyService; import com.idormy.sms.forwarder.service.NotifyService;
import com.idormy.sms.forwarder.utils.CommonUtil;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.NetUtil; import com.idormy.sms.forwarder.utils.NetUtil;
import com.idormy.sms.forwarder.utils.PhoneUtils; import com.idormy.sms.forwarder.utils.PhoneUtils;
import com.idormy.sms.forwarder.utils.SmsUtil; import com.idormy.sms.forwarder.utils.SmsUtil;
import com.idormy.sms.forwarder.utils.aUtil; import com.idormy.sms.forwarder.utils.TimeUtil;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -71,7 +72,7 @@ public class MainActivity extends AppCompatActivity implements NotifyListener, R
//检查权限是否获取 //检查权限是否获取
PackageManager pm = getPackageManager(); PackageManager pm = getPackageManager();
PhoneUtils.CheckPermission(pm, this); CommonUtil.CheckPermission(pm, this);
//获取SIM信息 //获取SIM信息
PhoneUtils.init(this); PhoneUtils.init(this);
@ -298,9 +299,9 @@ public class MainActivity extends AppCompatActivity implements NotifyListener, R
builder.setTitle(R.string.details); builder.setTitle(R.string.details);
String simInfo = logVo.getSimInfo(); String simInfo = logVo.getSimInfo();
if (simInfo != null) { if (simInfo != null) {
builder.setMessage(logVo.getFrom() + "\n\n" + logVo.getContent() + "\n\n" + logVo.getSimInfo() + "\n\n" + logVo.getRule() + "\n\n" + aUtil.utc2Local(logVo.getTime()) + "\n\nResponse" + logVo.getForwardResponse()); builder.setMessage(logVo.getFrom() + "\n\n" + logVo.getContent() + "\n\n" + logVo.getSimInfo() + "\n\n" + logVo.getRule() + "\n\n" + TimeUtil.utc2Local(logVo.getTime()) + "\n\nResponse" + logVo.getForwardResponse());
} else { } else {
builder.setMessage(logVo.getFrom() + "\n\n" + logVo.getContent() + "\n\n" + logVo.getRule() + "\n\n" + aUtil.utc2Local(logVo.getTime()) + "\n\nResponse" + logVo.getForwardResponse()); builder.setMessage(logVo.getFrom() + "\n\n" + logVo.getContent() + "\n\n" + logVo.getRule() + "\n\n" + TimeUtil.utc2Local(logVo.getTime()) + "\n\nResponse" + logVo.getForwardResponse());
} }
//删除 //删除
builder.setNegativeButton(R.string.del, (dialog, which) -> { builder.setNegativeButton(R.string.del, (dialog, which) -> {

@ -10,7 +10,7 @@ import android.widget.TextView;
import com.idormy.sms.forwarder.R; import com.idormy.sms.forwarder.R;
import com.idormy.sms.forwarder.model.vo.LogVo; import com.idormy.sms.forwarder.model.vo.LogVo;
import com.idormy.sms.forwarder.utils.aUtil; import com.idormy.sms.forwarder.utils.TimeUtil;
import java.util.List; import java.util.List;
@ -76,7 +76,7 @@ public class LogAdapter extends ArrayAdapter<LogVo> {
viewHolder.tLogFrom.setText(logVo.getFrom()); viewHolder.tLogFrom.setText(logVo.getFrom());
viewHolder.tLogContent.setText(logVo.getContent()); viewHolder.tLogContent.setText(logVo.getContent());
viewHolder.tLogRule.setText(logVo.getRule()); viewHolder.tLogRule.setText(logVo.getRule());
viewHolder.tLogTime.setText(aUtil.friendlyTime(logVo.getTime())); viewHolder.tLogTime.setText(TimeUtil.friendlyTime(logVo.getTime()));
viewHolder.senderImage.setImageResource(logVo.getSenderImageId()); viewHolder.senderImage.setImageResource(logVo.getSenderImageId());
viewHolder.simImage.setImageResource(logVo.getSimImageId()); viewHolder.simImage.setImageResource(logVo.getSimImageId());
viewHolder.statusImage.setImageResource(logVo.getStatusImageId()); viewHolder.statusImage.setImageResource(logVo.getStatusImageId());

@ -0,0 +1,77 @@
package com.idormy.sms.forwarder.utils;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
/**
*
*/
public class CommonUtil {
//获取当前版本名称
public static String getVersionName(Context context) throws Exception {
// 获取packagemanager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
return packInfo.versionName;
}
//获取当前版本号
public static Integer getVersionCode(Context context) throws Exception {
// 获取packagemanager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
return packInfo.versionCode;
}
// 检查权限是否获取android6.0及以上系统可能默认关闭权限,且没提示)
@SuppressLint("InlinedApi")
public static void CheckPermission(PackageManager pm, Context that) {
//PackageManager pm = getPackageManager();
boolean permission_internet = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.INTERNET", that.getPackageName()));
boolean permission_receive_boot = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.RECEIVE_BOOT_COMPLETED", that.getPackageName()));
boolean permission_foreground_service = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.FOREGROUND_SERVICE", that.getPackageName()));
boolean permission_read_external_storage = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_EXTERNAL_STORAGE", that.getPackageName()));
boolean permission_write_external_storage = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", that.getPackageName()));
boolean permission_receive_sms = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.RECEIVE_SMS", that.getPackageName()));
boolean permission_read_sms = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_SMS", that.getPackageName()));
boolean permission_send_sms = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.SEND_SMS", that.getPackageName()));
boolean permission_read_phone_state = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_PHONE_STATE", that.getPackageName()));
boolean permission_read_phone_numbers = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_PHONE_NUMBERS", that.getPackageName()));
boolean permission_read_call_log = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_CALL_LOG", that.getPackageName()));
boolean permission_read_contacts = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_CONTACTS", that.getPackageName()));
boolean permission_battery_stats = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.BATTERY_STATS", that.getPackageName()));
boolean permission_bind_notification_listener_service = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.BIND_NOTIFICATION_LISTENER_SERVICE", that.getPackageName()));
if (!(permission_internet && permission_receive_boot && permission_foreground_service &&
permission_read_external_storage && permission_write_external_storage &&
permission_receive_sms && permission_read_sms && permission_send_sms &&
permission_read_call_log && permission_read_contacts &&
permission_read_phone_state && permission_read_phone_numbers && permission_battery_stats && permission_bind_notification_listener_service)) {
ActivityCompat.requestPermissions((Activity) that, new String[]{
Manifest.permission.INTERNET,
Manifest.permission.RECEIVE_BOOT_COMPLETED,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_SMS,
Manifest.permission.SEND_SMS,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_CALL_LOG,
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_PHONE_NUMBERS,
Manifest.permission.FOREGROUND_SERVICE,
Manifest.permission.BATTERY_STATS,
Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE,
}, 0x01);
}
}
}

@ -21,8 +21,6 @@ public class InitUtil {
Log.d(TAG, "init context"); Log.d(TAG, "init context");
SettingUtil.init(context); SettingUtil.init(context);
} }
} }
} }

@ -1,39 +1,44 @@
package com.idormy.sms.forwarder.utils; package com.idormy.sms.forwarder.utils;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.net.Uri; import android.net.Uri;
import android.os.PowerManager; import android.os.Build;
import android.provider.Settings; import android.os.PowerManager;
import android.widget.Toast; import android.provider.Settings;
import android.widget.Toast;
import com.idormy.sms.forwarder.R;
import androidx.annotation.RequiresApi;
public class KeepAliveUtils {
import com.idormy.sms.forwarder.R;
public static boolean isIgnoreBatteryOptimization(Activity activity) {
PowerManager powerManager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE); public class KeepAliveUtils {
if (powerManager != null) {
return powerManager.isIgnoringBatteryOptimizations(activity.getPackageName()); @RequiresApi(api = Build.VERSION_CODES.M)
} else { public static boolean isIgnoreBatteryOptimization(Activity activity) {
return true; PowerManager powerManager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
} if (powerManager != null) {
} return powerManager.isIgnoringBatteryOptimizations(activity.getPackageName());
} else {
public static void ignoreBatteryOptimization(Activity activity) { return true;
if (isIgnoreBatteryOptimization(activity)) { }
return; }
}
@SuppressLint("BatteryLife") Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); @RequiresApi(api = Build.VERSION_CODES.M)
intent.setData(Uri.parse("package:" + activity.getPackageName())); public static void ignoreBatteryOptimization(Activity activity) {
ResolveInfo resolveInfo = activity.getPackageManager().resolveActivity(intent, 0); if (isIgnoreBatteryOptimization(activity)) {
if (resolveInfo != null) { return;
activity.startActivity(intent); }
} else { @SuppressLint("BatteryLife") Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
Toast.makeText(activity, R.string.unsupport, Toast.LENGTH_SHORT).show(); intent.setData(Uri.parse("package:" + activity.getPackageName()));
} ResolveInfo resolveInfo = activity.getPackageManager().resolveActivity(intent, 0);
} if (resolveInfo != null) {
} activity.startActivity(intent);
} else {
Toast.makeText(activity, R.string.unsupport, Toast.LENGTH_SHORT).show();
}
}
}

@ -1,12 +1,16 @@
package com.idormy.sms.forwarder.utils; package com.idormy.sms.forwarder.utils;
import android.os.Environment;
import android.text.TextUtils; import android.text.TextUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Properties;
/** /**
* 使: * 使:
* OSUtils.ROM_TYPE romType = OSUtils.getRomType(); * OSUtil.ROM_TYPE romType = OSUtil.getRomType();
* ROM * ROM
* 使BuildPropertieskey,value(getProperty),build.prop * 使BuildPropertieskey,value(getProperty),build.prop
* ROMkey/value * ROMkey/value
@ -14,7 +18,30 @@ import java.io.IOException;
* YouAreMyShine * YouAreMyShine
* https://www.jianshu.com/p/bb1f765a425f * https://www.jianshu.com/p/bb1f765a425f
*/ */
public class OSUtils { public class OSUtil {
/**
* MIUIhttp://blog.csdn.net/xx326664162/article/details/52438706
*
* @return
*/
@SuppressWarnings("unused")
public static boolean isMIUI() {
try {
String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
Properties prop = new Properties();
prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
} catch (final IOException e) {
return false;
}
}
/** /**
* MIUI ROM * MIUI ROM
* <p> * <p>

@ -2,7 +2,6 @@ package com.idormy.sms.forwarder.utils;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -528,49 +527,6 @@ public class PhoneUtils {
return list; return list;
} }
// 检查权限是否获取android6.0及以上系统可能默认关闭权限,且没提示)
@SuppressLint("InlinedApi")
public static void CheckPermission(PackageManager pm, Context that) {
//PackageManager pm = getPackageManager();
boolean permission_internet = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.INTERNET", that.getPackageName()));
boolean permission_receive_boot = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.RECEIVE_BOOT_COMPLETED", that.getPackageName()));
boolean permission_foreground_service = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.FOREGROUND_SERVICE", that.getPackageName()));
boolean permission_read_external_storage = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_EXTERNAL_STORAGE", that.getPackageName()));
boolean permission_write_external_storage = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", that.getPackageName()));
boolean permission_receive_sms = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.RECEIVE_SMS", that.getPackageName()));
boolean permission_read_sms = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_SMS", that.getPackageName()));
boolean permission_send_sms = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.SEND_SMS", that.getPackageName()));
boolean permission_read_phone_state = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_PHONE_STATE", that.getPackageName()));
boolean permission_read_phone_numbers = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_PHONE_NUMBERS", that.getPackageName()));
boolean permission_read_call_log = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_CALL_LOG", that.getPackageName()));
boolean permission_read_contacts = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_CONTACTS", that.getPackageName()));
boolean permission_battery_stats = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.BATTERY_STATS", that.getPackageName()));
boolean permission_bind_notification_listener_service = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.BIND_NOTIFICATION_LISTENER_SERVICE", that.getPackageName()));
if (!(permission_internet && permission_receive_boot && permission_foreground_service &&
permission_read_external_storage && permission_write_external_storage &&
permission_receive_sms && permission_read_sms && permission_send_sms &&
permission_read_call_log && permission_read_contacts &&
permission_read_phone_state && permission_read_phone_numbers && permission_battery_stats && permission_bind_notification_listener_service)) {
ActivityCompat.requestPermissions((Activity) that, new String[]{
Manifest.permission.INTERNET,
Manifest.permission.RECEIVE_BOOT_COMPLETED,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_SMS,
Manifest.permission.SEND_SMS,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_CALL_LOG,
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_PHONE_NUMBERS,
Manifest.permission.FOREGROUND_SERVICE,
Manifest.permission.BATTERY_STATS,
Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE,
}, 0x01);
}
}
/** /**
* SIM * SIM
*/ */

@ -53,7 +53,6 @@ public class SimUtil {
return 1; return 1;
} }
//通过卡槽ID获取SubscriptionId //通过卡槽ID获取SubscriptionId
public static int getSubscriptionIdBySimId(int simId) { public static int getSubscriptionIdBySimId(int simId) {
try { try {

@ -4,9 +4,12 @@ import android.annotation.SuppressLint;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.telephony.SmsManager; import android.telephony.SmsManager;
import android.util.Log; import android.util.Log;
import androidx.annotation.RequiresApi;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects; import java.util.Objects;
@ -25,6 +28,7 @@ public class SmsUtil {
} }
} }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
public static String sendSms(int subId, String mobiles, String message) { public static String sendSms(int subId, String mobiles, String message) {
mobiles = mobiles.replace("", ";"); mobiles = mobiles.replace("", ";");
Log.d(TAG, "subId = " + subId + ", mobiles = " + mobiles + ", message = " + message); Log.d(TAG, "subId = " + subId + ", mobiles = " + mobiles + ", message = " + message);

@ -1,59 +1,13 @@
package com.idormy.sms.forwarder.utils; package com.idormy.sms.forwarder.utils;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Environment;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Properties;
import java.util.TimeZone; import java.util.TimeZone;
public class aUtil { public class TimeUtil {
/**
* MIUIhttp://blog.csdn.net/xx326664162/article/details/52438706
*
* @return
*/
@SuppressWarnings("unused")
public static boolean isMIUI() {
try {
String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
Properties prop = new Properties();
prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
} catch (final IOException e) {
return false;
}
}
public static String getVersionName(Context context) throws Exception {
// 获取packagemanager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
return packInfo.versionName;
}
public static Integer getVersionCode(Context context) throws Exception {
// 获取packagemanager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
return packInfo.versionCode;
}
//友好时间显示 //友好时间显示
public static String friendlyTime(String utcTime) { public static String friendlyTime(String utcTime) {
Loading…
Cancel
Save