version:2.2.10.25
fix: update:增加禁用app
This commit is contained in:
@@ -17,4 +17,5 @@ interface SystemInfoInterface {
|
||||
String getTopAppPackage();
|
||||
boolean SystemPutInt(String name, int value);
|
||||
void setDefaultDesktop(String pkg);
|
||||
List<String> getDisableApp();
|
||||
}
|
||||
|
||||
@@ -284,6 +284,11 @@ public class CheckNetActivity extends BaseActivity implements CheckNetContact.Ma
|
||||
|
||||
@Override
|
||||
public void getAppAutoStartUpdateAndNetFinish() {
|
||||
mCheckNetPresenter.getSnAppAttr();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getSnAppAttrFinish() {
|
||||
mCheckNetPresenter.getAppIDControl();
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,8 @@ public class CheckNetContact {
|
||||
void getDesktopIcon();
|
||||
//获取应用自启升级和网络权限管理
|
||||
void getAppAutoStartUpdateAndNet();
|
||||
/*获取禁用app*/
|
||||
void getSnAppAttr();
|
||||
//获取第三方应用子页面ID连网限制
|
||||
void getAppIDControl();
|
||||
//获取第三方应用内部网页跳转屏蔽
|
||||
@@ -126,6 +128,8 @@ public class CheckNetContact {
|
||||
void getDesktopIconFinish();
|
||||
//获取应用自启升级和网络权限管理结束
|
||||
void getAppAutoStartUpdateAndNetFinish();
|
||||
/*获取禁用app*/
|
||||
void getSnAppAttrFinish();
|
||||
//获取第三方应用子页面ID连网限制结束
|
||||
void getAppIDControlFinish();
|
||||
//获取第三方应用内部网页跳转屏蔽结束
|
||||
|
||||
@@ -293,6 +293,16 @@ public class CheckNetPresenter implements CheckNetContact.Presenter {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getSnAppAttr() {
|
||||
mNetInterfaceManager.getSnAppAttr(new NetInterfaceManager.onCompleteCallback() {
|
||||
@Override
|
||||
public void onComplete() {
|
||||
mView.getSnAppAttrFinish();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getAppIDControl() {
|
||||
mNetInterfaceManager.getAppIDControl(true, getLifecycle(), new NetInterfaceManager.onCompleteCallback() {
|
||||
|
||||
27
app/src/main/java/com/aoleyun/sn/bean/AppAttr.java
Normal file
27
app/src/main/java/com/aoleyun/sn/bean/AppAttr.java
Normal file
@@ -0,0 +1,27 @@
|
||||
package com.aoleyun.sn.bean;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class AppAttr implements Serializable {
|
||||
private static final long serialVersionUID = -4530860765778383316L;
|
||||
|
||||
String app_package;
|
||||
/*应用是否允许打开 0不允许 1允许*/
|
||||
int is_open;
|
||||
|
||||
public String getApp_package() {
|
||||
return app_package;
|
||||
}
|
||||
|
||||
public void setApp_package(String app_package) {
|
||||
this.app_package = app_package;
|
||||
}
|
||||
|
||||
public int getIs_open() {
|
||||
return is_open;
|
||||
}
|
||||
|
||||
public void setIs_open(int is_open) {
|
||||
this.is_open = is_open;
|
||||
}
|
||||
}
|
||||
@@ -112,5 +112,6 @@ public class CommonConfig {
|
||||
/*恢复出厂设置开关*/
|
||||
public final static String AOLE_ACTION_RESTORE_FORBID_ON = "aole_restore_forbid_on";
|
||||
|
||||
public final static String AOLE_ACTION_DISABLE_APP = "aole_disable_app_list";
|
||||
|
||||
}
|
||||
|
||||
144
app/src/main/java/com/aoleyun/sn/gson/GsonUtils.java
Normal file
144
app/src/main/java/com/aoleyun/sn/gson/GsonUtils.java
Normal file
@@ -0,0 +1,144 @@
|
||||
package com.aoleyun.sn.gson;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
public class GsonUtils {
|
||||
//https://blog.csdn.net/zte1055889498/article/details/122400299
|
||||
|
||||
public static JsonObject getJsonObject(String jsonString) {
|
||||
JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
|
||||
return jsonObject;
|
||||
}
|
||||
|
||||
private static final Gson gson;
|
||||
|
||||
static {
|
||||
GsonBuilder builder = new GsonBuilder();
|
||||
builder.registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory());
|
||||
builder.registerTypeAdapter(Integer.class, new IntegerDefault0Adapter());
|
||||
builder.registerTypeAdapter(int.class, new IntegerDefault0Adapter());
|
||||
builder.disableHtmlEscaping();
|
||||
builder.enableComplexMapKeySerialization();
|
||||
// builder.excludeFieldsWithoutExposeAnnotation();
|
||||
builder.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
gson = builder.create();
|
||||
}
|
||||
|
||||
public static Type makeJavaType(Type rawType, Type... typeArguments) {
|
||||
return TypeToken.getParameterized(rawType, typeArguments).getType();
|
||||
}
|
||||
|
||||
public static String toString(Object value) {
|
||||
if (Objects.isNull(value)) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof String) {
|
||||
return (String) value;
|
||||
}
|
||||
return toJSONString(value);
|
||||
}
|
||||
|
||||
public static String toJSONString(Object value) {
|
||||
return gson.toJson(value);
|
||||
}
|
||||
|
||||
public static String toPrettyString(Object value) {
|
||||
return gson.newBuilder().setPrettyPrinting().create().toJson(value);
|
||||
}
|
||||
|
||||
public static JsonElement fromJavaObject(Object value) {
|
||||
JsonElement result = null;
|
||||
if (Objects.nonNull(value) && (value instanceof String)) {
|
||||
result = parseObject((String) value);
|
||||
} else {
|
||||
result = gson.toJsonTree(value);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static JsonElement parseObject(String content) {
|
||||
return JsonParser.parseString(content);
|
||||
}
|
||||
|
||||
public static JsonElement getJsonElement(JsonObject node, String name) {
|
||||
return node.get(name);
|
||||
}
|
||||
|
||||
public static JsonElement getJsonElement(JsonArray node, int index) {
|
||||
return node.get(index);
|
||||
}
|
||||
|
||||
public static <T> T toJavaObject(JsonElement node, Class<T> clazz) {
|
||||
return gson.fromJson(node, clazz);
|
||||
}
|
||||
|
||||
public static <T> T toJavaObject(JsonElement node, Type type) {
|
||||
return gson.fromJson(node, type);
|
||||
}
|
||||
|
||||
public static <T> T toJavaObject(JsonElement node, TypeToken<?> typeToken) {
|
||||
return toJavaObject(node, typeToken.getType());
|
||||
}
|
||||
|
||||
public static <E> List<E> toJavaList(JsonElement node, Class<E> clazz) {
|
||||
return toJavaObject(node, makeJavaType(List.class, clazz));
|
||||
}
|
||||
|
||||
public static List<Object> toJavaList(JsonElement node) {
|
||||
return toJavaObject(node, new TypeToken<List<Object>>() {
|
||||
}.getType());
|
||||
}
|
||||
|
||||
public static <V> Map<String, V> toJavaMap(JsonElement node, Class<V> clazz) {
|
||||
return toJavaObject(node, makeJavaType(Map.class, String.class, clazz));
|
||||
}
|
||||
|
||||
public static Map<String, Object> toJavaMap(JsonElement node) {
|
||||
return toJavaObject(node, new TypeToken<Map<String, Object>>() {
|
||||
}.getType());
|
||||
}
|
||||
|
||||
public static <T> T toJavaObject(String content, Class<T> clazz) {
|
||||
JsonObject jsonObject = getJsonObject(content);
|
||||
String jsonString = jsonObject.toString();
|
||||
return gson.fromJson(jsonString, clazz);
|
||||
}
|
||||
|
||||
public static <T> T toJavaObject(String content, Type type) {
|
||||
return gson.fromJson(content, type);
|
||||
}
|
||||
|
||||
public static <T> T toJavaObject(String content, TypeToken<?> typeToken) {
|
||||
return toJavaObject(content, typeToken.getType());
|
||||
}
|
||||
|
||||
public static <E> List<E> toJavaList(String content, Class<E> clazz) {
|
||||
return toJavaObject(content, makeJavaType(List.class, clazz));
|
||||
}
|
||||
|
||||
public static List<Object> toJavaList(String content) {
|
||||
return toJavaObject(content, new TypeToken<List<Object>>() {
|
||||
}.getType());
|
||||
}
|
||||
|
||||
public static <V> Map<String, V> toJavaMap(String content, Class<V> clazz) {
|
||||
return toJavaObject(content, makeJavaType(Map.class, String.class, clazz));
|
||||
}
|
||||
|
||||
public static Map<String, Object> toJavaMap(String content) {
|
||||
return toJavaObject(content, new TypeToken<Map<String, Object>>() {
|
||||
}.getType());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.aoleyun.sn.gson;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonDeserializer;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.google.gson.JsonSerializationContext;
|
||||
import com.google.gson.JsonSerializer;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
public class IntegerDefault0Adapter implements JsonSerializer<Integer>, JsonDeserializer<Integer> {
|
||||
@Override
|
||||
public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||
throws JsonParseException {
|
||||
try {
|
||||
if (json.getAsString().equals("")) {
|
||||
return 0;
|
||||
}
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
try {
|
||||
return json.getAsInt();
|
||||
} catch (NumberFormatException e) {
|
||||
throw new JsonSyntaxException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
|
||||
return new JsonPrimitive(src);
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.aoleyun.sn.BuildConfig;
|
||||
import com.aoleyun.sn.bean.AppAttr;
|
||||
import com.aoleyun.sn.bean.AppID;
|
||||
import com.aoleyun.sn.bean.AppLimit;
|
||||
import com.aoleyun.sn.bean.AppListInfo;
|
||||
@@ -44,20 +45,22 @@ import com.aoleyun.sn.comm.CommonConfig;
|
||||
import com.aoleyun.sn.comm.JGYActions;
|
||||
import com.aoleyun.sn.comm.PackageNames;
|
||||
import com.aoleyun.sn.disklrucache.CacheHelper;
|
||||
import com.aoleyun.sn.gson.GsonUtils;
|
||||
import com.aoleyun.sn.gson.NullStringToEmptyAdapterFactory;
|
||||
import com.aoleyun.sn.manager.ConnectManager;
|
||||
import com.aoleyun.sn.manager.ConnectMode;
|
||||
import com.aoleyun.sn.network.api.GetPublicIPApi;
|
||||
import com.aoleyun.sn.network.api.GetWhoisApi;
|
||||
import com.aoleyun.sn.network.api.get.CheckTestUpdateApi;
|
||||
import com.aoleyun.sn.network.api.get.DefaultAppApi;
|
||||
import com.aoleyun.sn.network.api.get.GetDesktopApi;
|
||||
import com.aoleyun.sn.network.api.get.GetDeveloperApi;
|
||||
import com.aoleyun.sn.network.api.get.GetPushTagsApi;
|
||||
import com.aoleyun.sn.network.api.GetPublicIPApi;
|
||||
import com.aoleyun.sn.network.api.get.GetSnRunLogApi;
|
||||
import com.aoleyun.sn.network.api.get.GetWiFiAliasApi;
|
||||
import com.aoleyun.sn.network.api.get.LogoImgApi;
|
||||
import com.aoleyun.sn.network.api.get.ScreenLockStateApi;
|
||||
import com.aoleyun.sn.network.api.get.SnAppAttrApi;
|
||||
import com.aoleyun.sn.network.api.get.SnTimeControlApi;
|
||||
import com.aoleyun.sn.network.api.get.TopAppControlApi;
|
||||
import com.aoleyun.sn.network.api.post.AppLimitApi;
|
||||
@@ -100,7 +103,6 @@ import com.aoleyun.sn.statistics.StatisticsInfo;
|
||||
import com.aoleyun.sn.utils.ApkUtils;
|
||||
import com.aoleyun.sn.utils.CacheUtils;
|
||||
import com.aoleyun.sn.utils.ForegroundAppUtil;
|
||||
import com.aoleyun.sn.utils.GsonUtils;
|
||||
import com.aoleyun.sn.utils.JGYUtils;
|
||||
import com.aoleyun.sn.utils.MD5Util;
|
||||
import com.aoleyun.sn.utils.NetworkUtils;
|
||||
@@ -426,6 +428,13 @@ public class NetInterfaceManager {
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<List<AppAttr>>> getSnAppAttrObservable() {
|
||||
return mRetrofit.create(SnAppAttrApi.class)
|
||||
.getSnAppAttr(Utils.getSerial(mContext))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<AppID>> getAppIDControlObservable() {
|
||||
return mRetrofit.create(DeselectIDApi.class)
|
||||
.getDeselectIDApi(NetInterfaceManager.HTTP_KEY, Utils.getSerial(mContext))
|
||||
@@ -767,7 +776,7 @@ public class NetInterfaceManager {
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull List<AppUpdateInfo> appUpdateInfos) {
|
||||
String jsonString = GsonUtils.toJsonString(appUpdateInfos);
|
||||
String jsonString = GsonUtils.toJSONString(appUpdateInfos);
|
||||
cacheHelper.put(UrlAddress.CHECK_UPDATE, jsonString);
|
||||
Log.e("checkAoleyunUpdate", "onNext: " + jsonString);
|
||||
for (AppUpdateInfo info : appUpdateInfos) {
|
||||
@@ -844,7 +853,7 @@ public class NetInterfaceManager {
|
||||
public void onNext(BaseResponse<List<ForceDownloadData>> listBaseResponse) {
|
||||
Log.e("checkTestUpdate", "onNext: " + listBaseResponse.data);
|
||||
if (listBaseResponse.code == OK) {
|
||||
cacheHelper.put(UrlAddress.GET_SN_APP_TEST, GsonUtils.toJsonString(listBaseResponse.data));
|
||||
cacheHelper.put(UrlAddress.GET_SN_APP_TEST, GsonUtils.toJSONString(listBaseResponse.data));
|
||||
List<ForceDownloadData> APPlist = listBaseResponse.data;
|
||||
JGYUtils.getInstance().installTestAPK(APPlist);
|
||||
} else {
|
||||
@@ -925,7 +934,7 @@ public class NetInterfaceManager {
|
||||
if (forceDownloadBean.code == OK) {
|
||||
cacheHelper.getAsString(UrlAddress.GET_FORCE_INSTALL_LIST);
|
||||
List<ForceDownloadData> forceDownloadData = forceDownloadBean.data;
|
||||
cacheHelper.put(UrlAddress.GET_FORCE_INSTALL_LIST, GsonUtils.toJsonString(forceDownloadData));
|
||||
cacheHelper.put(UrlAddress.GET_FORCE_INSTALL_LIST, GsonUtils.toJSONString(forceDownloadData));
|
||||
Aria.download(this).resumeAllTask();
|
||||
JGYUtils.getInstance().forceDownload(forceDownloadData);
|
||||
List<String> forceApp = forceDownloadData.stream().map(ForceDownloadData::getApp_package).collect(Collectors.toList());
|
||||
@@ -1008,7 +1017,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getDefaultDesktop", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == OK) {
|
||||
ForceDownloadData desktopInfo = baseResponse.data;
|
||||
String jsonString = GsonUtils.toJsonString(desktopInfo);
|
||||
String jsonString = GsonUtils.toJSONString(desktopInfo);
|
||||
JSONObject data = JSON.parseObject(jsonString);
|
||||
cacheHelper.put(UrlAddress.GET_DESKTOP, jsonString);
|
||||
JGYUtils.getInstance().installDesktop(data);
|
||||
@@ -1099,7 +1108,7 @@ public class NetInterfaceManager {
|
||||
Log.e("setLogoImg", "onNext: " + logoImgBaseResponse.data);
|
||||
if (logoImgBaseResponse.code == OK) {
|
||||
LogoImg logoImg = logoImgBaseResponse.data;
|
||||
cacheHelper.put(UrlAddress.GET_LOGO_IMG, GsonUtils.toJsonString(logoImg));
|
||||
cacheHelper.put(UrlAddress.GET_LOGO_IMG, GsonUtils.toJSONString(logoImg));
|
||||
String file_url = logoImg.getFile_url();
|
||||
String file_md5 = logoImg.getFile_md5();
|
||||
String batch = logoImg.getBatch();
|
||||
@@ -1165,7 +1174,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getDeveloper", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == OK) {
|
||||
DeveloperBean developerBean = baseResponse.data;
|
||||
cacheHelper.put(UrlAddress.GET_DEVELOPER, GsonUtils.toJsonString(developerBean));
|
||||
cacheHelper.put(UrlAddress.GET_DEVELOPER, GsonUtils.toJSONString(developerBean));
|
||||
int is_developer = developerBean.getIs_developer();
|
||||
Log.e("getDeveloper", "onNext: " + is_developer);
|
||||
//后台1是0否 底层0是1否
|
||||
@@ -1231,7 +1240,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getROMApp", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == OK) {
|
||||
CustomROMApp customROMApp = baseResponse.data;
|
||||
cacheHelper.put(UrlAddress.GET_ROM_APP, GsonUtils.toJsonString(customROMApp));
|
||||
cacheHelper.put(UrlAddress.GET_ROM_APP, GsonUtils.toJSONString(customROMApp));
|
||||
String packageName = customROMApp.getPackage_name();
|
||||
Settings.System.putString(mContext.getContentResolver(), "jgy_customromapp", packageName);
|
||||
} else {
|
||||
@@ -1329,7 +1338,7 @@ public class NetInterfaceManager {
|
||||
String data = response.data.toString();
|
||||
if (!TextUtils.isEmpty(data)) {
|
||||
List<String> newList = Arrays.asList(data.split(","));//新的list
|
||||
cacheHelper.put(UrlAddress.GET_HIDE_DESKTOPICON, GsonUtils.toJsonString(newList));
|
||||
cacheHelper.put(UrlAddress.GET_HIDE_DESKTOPICON, GsonUtils.toJSONString(newList));
|
||||
PackageManager pm = mContext.getPackageManager();
|
||||
for (String pack : newList) {
|
||||
try {
|
||||
@@ -1408,7 +1417,7 @@ public class NetInterfaceManager {
|
||||
public void onNext(@NonNull NetAndLaunchBean netAndLaunchBean) {
|
||||
Log.e("getAppAutoStart", "onNext: " + netAndLaunchBean.toString());
|
||||
if (netAndLaunchBean.getCode() == OK) {
|
||||
cacheHelper.put(UrlAddress.NET_AND_LAUNCH_API, GsonUtils.toJsonString(netAndLaunchBean));
|
||||
cacheHelper.put(UrlAddress.NET_AND_LAUNCH_API, GsonUtils.toJSONString(netAndLaunchBean));
|
||||
JGYUtils.getInstance().setNetAndlaunch(netAndLaunchBean);
|
||||
} else {
|
||||
cacheHelper.put(UrlAddress.NET_AND_LAUNCH_API, "");
|
||||
@@ -1488,7 +1497,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getAppIDControl", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == OK) {
|
||||
AppID appID = baseResponse.data;
|
||||
cacheHelper.put(UrlAddress.GET_APPID, GsonUtils.toJsonString(appID));
|
||||
cacheHelper.put(UrlAddress.GET_APPID, GsonUtils.toJSONString(appID));
|
||||
String ids = appID.getIds();
|
||||
String packages = appID.getPackages();
|
||||
if (appID == null) {
|
||||
@@ -1518,6 +1527,63 @@ public class NetInterfaceManager {
|
||||
};
|
||||
}
|
||||
|
||||
public void getSnAppAttr(BehaviorSubject<ActivityEvent> lifecycle, onCompleteCallback callback) {
|
||||
getSnAppAttrObservable()
|
||||
.compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY))
|
||||
.subscribe(getSnAppAttrObserver(callback));
|
||||
}
|
||||
|
||||
public void getSnAppAttr(onCompleteCallback callback) {
|
||||
getSnAppAttrObservable()
|
||||
.subscribe(getSnAppAttrObserver(callback));
|
||||
}
|
||||
|
||||
public void getSnAppAttr() {
|
||||
getSnAppAttrObservable()
|
||||
.subscribe(getSnAppAttrObserver(null));
|
||||
}
|
||||
|
||||
public Observer<BaseResponse<List<AppAttr>>> getSnAppAttrObserver(onCompleteCallback onCompleteCallback) {
|
||||
return new Observer<BaseResponse<List<AppAttr>>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getSnAppAttr", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<List<AppAttr>> baseResponse) {
|
||||
Log.e("getSnAppAttr", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == 200) {
|
||||
List<AppAttr> appAttrList = baseResponse.data;
|
||||
if (appAttrList == null || appAttrList.size() == 0) {
|
||||
Log.e("getSnAppAttr", "onNext: appAttrList is empty");
|
||||
Settings.Global.putString(mContext.getContentResolver(), CommonConfig.AOLE_ACTION_DISABLE_APP, "null");
|
||||
} else {
|
||||
String disableApp = appAttrList.stream()
|
||||
.filter(appAttr -> appAttr.getIs_open() == 0)
|
||||
.map(AppAttr::getApp_package)
|
||||
.collect(Collectors.joining(","));
|
||||
Log.e("getSnAppAttr", "onNext: disableApp = " + disableApp);
|
||||
Settings.Global.putString(mContext.getContentResolver(), CommonConfig.AOLE_ACTION_DISABLE_APP, disableApp);
|
||||
}
|
||||
} else {
|
||||
Settings.Global.putString(mContext.getContentResolver(), CommonConfig.AOLE_ACTION_DISABLE_APP, "null");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getSnAppAttr", "onError: " + e.getMessage());
|
||||
onComplete();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getSnAppAttr", "onComplete: ");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public void setSystemSetting(boolean refresh, BehaviorSubject<ActivityEvent> lifecycle, onCompleteCallback callback) {
|
||||
ConnectMode connectMode = ConnectMode.ONE_HOUR;
|
||||
@@ -1556,7 +1622,7 @@ public class NetInterfaceManager {
|
||||
Log.e("setSystemSetting", "onNext: " + baseResponse);
|
||||
SPUtils.put(mContext, CommonConfig.JGY_FIRST_CONNECT, 1);
|
||||
if (baseResponse.code == OK) {
|
||||
String data = GsonUtils.toJsonString(baseResponse.data);
|
||||
String data = GsonUtils.toJSONString(baseResponse.data);
|
||||
Log.e("setSystemSetting", "onNext: " + data);
|
||||
cacheHelper.put(UrlAddress.GET_FIRMWARE, data);
|
||||
//结果保存到本地
|
||||
@@ -1627,7 +1693,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getEBagCode", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == OK) {
|
||||
EBagCode eBagCode = baseResponse.data;
|
||||
cacheHelper.put(UrlAddress.GET_EBAG_CODE, GsonUtils.toJsonString(eBagCode));
|
||||
cacheHelper.put(UrlAddress.GET_EBAG_CODE, GsonUtils.toJSONString(eBagCode));
|
||||
String ebagCode = eBagCode.getEbagCode();
|
||||
SPUtils.put(mContext, "ebagCode", ebagCode);
|
||||
} else {
|
||||
@@ -1787,7 +1853,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getStudesInfo", "onNext: " + studentsInfoBaseResponse.data);
|
||||
if (studentsInfoBaseResponse.code == OK) {
|
||||
studesInfoListener.setStudentsInfo(studentsInfoBaseResponse.data);
|
||||
cacheHelper.put(UrlAddress.GET_STUDENTS_INFO, GsonUtils.toJsonString(studentsInfoBaseResponse.data));
|
||||
cacheHelper.put(UrlAddress.GET_STUDENTS_INFO, GsonUtils.toJSONString(studentsInfoBaseResponse.data));
|
||||
} else {
|
||||
cacheHelper.put(UrlAddress.GET_STUDENTS_INFO, "");
|
||||
Log.e("getStudesInfo", "onNext: " + studentsInfoBaseResponse.toString());
|
||||
@@ -1991,7 +2057,7 @@ public class NetInterfaceManager {
|
||||
public void onNext(@NonNull BaseResponse<Batch> response) {
|
||||
if (response.code == OK) {
|
||||
String batch = response.data.getBatch();
|
||||
cacheHelper.put(CommonConfig.DEVICES_TAG, GsonUtils.toJsonString(response.data));
|
||||
cacheHelper.put(CommonConfig.DEVICES_TAG, GsonUtils.toJSONString(response.data));
|
||||
Log.e(TAG + ":" + "setPushTags", "onNext: " + batch);
|
||||
if (!TextUtils.isEmpty(batch)) {
|
||||
set.add(batch);
|
||||
@@ -2359,7 +2425,7 @@ public class NetInterfaceManager {
|
||||
private void setBrowserBookmarks(BaseResponse<BrowserBookmarks> browserBookmarksBaseResponse) {
|
||||
if (browserBookmarksBaseResponse.code == 200) {
|
||||
BrowserBookmarks browserBookmarks = browserBookmarksBaseResponse.data;
|
||||
cacheHelper.put(UrlAddress.SET_HOMEPAG_TAG, GsonUtils.toJsonString(browserBookmarks));
|
||||
cacheHelper.put(UrlAddress.SET_HOMEPAG_TAG, GsonUtils.toJSONString(browserBookmarks));
|
||||
|
||||
//主页不包含白名单添加进去
|
||||
String homepagURL = browserBookmarks.getHomepage();
|
||||
@@ -2453,7 +2519,7 @@ public class NetInterfaceManager {
|
||||
//黑白名单
|
||||
if (browserDataBaseResponse.code == 200) {
|
||||
BrowserData browserData = browserDataBaseResponse.data;
|
||||
cacheHelper.put(UrlAddress.SET_BROWSER_LIST, GsonUtils.toJsonString(browserData));
|
||||
cacheHelper.put(UrlAddress.SET_BROWSER_LIST, GsonUtils.toJSONString(browserData));
|
||||
String white = browserData.getWhite();
|
||||
if (!TextUtils.isEmpty(white)) {
|
||||
if (!TextUtils.isEmpty(homePage) && !white.contains(homePage)) {
|
||||
@@ -2540,7 +2606,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getScreenLockState", "onNext: " + response);
|
||||
if (response.code == OK) {
|
||||
ScreenLockState screenLockState = response.data;
|
||||
cacheHelper.put(UrlAddress.GET_LOCK_SCREEN_STATE, GsonUtils.toJsonString(screenLockState));
|
||||
cacheHelper.put(UrlAddress.GET_LOCK_SCREEN_STATE, GsonUtils.toJSONString(screenLockState));
|
||||
int is_screen_lock = screenLockState.getIs_screen_lock();
|
||||
String name = screenLockState.getName();
|
||||
listener.setScreenLockState(is_screen_lock == 1, name);
|
||||
@@ -2617,7 +2683,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getAppLimit", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == 200) {
|
||||
AppLimit appLimit = baseResponse.data;
|
||||
cacheHelper.put(UrlAddress.SET_WHITE_PACKAGE_LIST, GsonUtils.toJsonString(appLimit));
|
||||
cacheHelper.put(UrlAddress.SET_WHITE_PACKAGE_LIST, GsonUtils.toJSONString(appLimit));
|
||||
String result = appLimit.getResult();
|
||||
//开机图标 只记录后台传的包名
|
||||
boolean write = Settings.System.putString(mContext.getContentResolver(), JGYActions.ACTION_JGY_SHORTCUTLIST, result);
|
||||
@@ -2701,7 +2767,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getAllAppList", "onNext: " + listBaseResponse);
|
||||
if (listBaseResponse.code == 200) {
|
||||
List<AppListInfo> appListInfos = listBaseResponse.data;
|
||||
cacheHelper.put(UrlAddress.GET_ALL_APP, GsonUtils.toJsonString(appListInfos));
|
||||
cacheHelper.put(UrlAddress.GET_ALL_APP, GsonUtils.toJSONString(appListInfos));
|
||||
getAppAutoStartUpdateAndNet(appListInfos);
|
||||
} else {
|
||||
cacheHelper.put(UrlAddress.GET_ALL_APP, "");
|
||||
@@ -2922,7 +2988,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getTopApp", "onNext: " + response.data);
|
||||
if (response.code == OK) {
|
||||
String app_package = response.data.getApp_package();
|
||||
cacheHelper.put(UrlAddress.GET_TOP_APP_CONTROL, GsonUtils.toJsonString(response.data));
|
||||
cacheHelper.put(UrlAddress.GET_TOP_APP_CONTROL, GsonUtils.toJSONString(response.data));
|
||||
ForegroundAppUtil.setTopAppClass(mContext, app_package);
|
||||
Settings.Global.putString(mContext.getContentResolver(), ForegroundAppUtil.TOPAPP_KEY, app_package);
|
||||
ForegroundAppUtil.openTopApp(mContext);
|
||||
@@ -3069,7 +3135,7 @@ public class NetInterfaceManager {
|
||||
Log.e("getPoweroffTime", "onNext: " + listBaseResponse);
|
||||
if (listBaseResponse.code == 200) {
|
||||
List<PoweroffBean> poweroffBeanList = listBaseResponse.data;
|
||||
String poweroffTime = GsonUtils.toJsonString(poweroffBeanList);
|
||||
String poweroffTime = GsonUtils.toJSONString(poweroffBeanList);
|
||||
cacheHelper.put(UrlAddress.GET_POWEROFF_TIME, poweroffTime);
|
||||
mMMKV.encode("poweroffTime", poweroffTime);
|
||||
} else {
|
||||
@@ -3146,7 +3212,7 @@ public class NetInterfaceManager {
|
||||
public void onNext(BaseResponse<List<WiFiAlias>> listBaseResponse) {
|
||||
Log.e("getWiFiPasswd", "onNext: " + listBaseResponse);
|
||||
if (listBaseResponse.code == OK) {
|
||||
cacheHelper.put(UrlAddress.GET_WIFI_ALIAS_PW, GsonUtils.toJsonString(listBaseResponse.data));
|
||||
cacheHelper.put(UrlAddress.GET_WIFI_ALIAS_PW, GsonUtils.toJSONString(listBaseResponse.data));
|
||||
WiFiUtils.saveWiFiPasswd(listBaseResponse.data);
|
||||
mMMKV.encode("WiFiPassword", parseString(new Gson().toJson(listBaseResponse.data)).toString());
|
||||
} else {
|
||||
|
||||
@@ -22,6 +22,8 @@ public class UrlAddress {
|
||||
public static final String GET_ROM_APP = "And/getFirmwareApp";
|
||||
/*获取应用升级自启*/
|
||||
public static final String NET_AND_LAUNCH_API = "automatic/get";
|
||||
/*获取禁用的app包名*/
|
||||
public static final String GET_SN_APP_ATTR = "automatic/getSnAppAttr";
|
||||
/*获取顶部app管控*/
|
||||
public static final String GET_TOP_APP_CONTROL = "Sn/getSnAppControl";
|
||||
/*APPID管控*/
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.aoleyun.sn.network.api.get;
|
||||
|
||||
import com.aoleyun.sn.bean.AppAttr;
|
||||
import com.aoleyun.sn.bean.BaseResponse;
|
||||
import com.aoleyun.sn.network.UrlAddress;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
public interface SnAppAttrApi {
|
||||
@GET(UrlAddress.GET_SN_APP_ATTR)
|
||||
Observable<BaseResponse<List<AppAttr>>> getSnAppAttr(
|
||||
@Query("sn") String sn
|
||||
);
|
||||
}
|
||||
@@ -5,9 +5,11 @@ import android.content.Intent;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.aoleyun.sn.SystemInfoInterface;
|
||||
import com.aoleyun.sn.comm.CommonConfig;
|
||||
import com.aoleyun.sn.comm.PackageNames;
|
||||
import com.aoleyun.sn.utils.CacheUtils;
|
||||
import com.aoleyun.sn.utils.ForegroundAppUtil;
|
||||
@@ -15,6 +17,8 @@ import com.aoleyun.sn.utils.JGYUtils;
|
||||
import com.aoleyun.sn.utils.SPUtils;
|
||||
import com.aoleyun.sn.utils.Utils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class RemoteService extends Service {
|
||||
@@ -89,5 +93,16 @@ public class RemoteService extends Service {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getDisableApp() throws RemoteException {
|
||||
String disable_app_list = Settings.Global.getString(getContentResolver(), CommonConfig.AOLE_ACTION_DISABLE_APP);
|
||||
Log.e(TAG, "getDisableApp: " + disable_app_list);
|
||||
if (TextUtils.isEmpty(disable_app_list)) {
|
||||
return new ArrayList<>();
|
||||
} else {
|
||||
return new ArrayList<>(Arrays.asList(disable_app_list.split(",")));
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -60,6 +60,8 @@ public class MainSContact {
|
||||
void getDesktopIcon();
|
||||
/*获取应用自启升级和网络权限管理*/
|
||||
void getAppAutoStartUpdateAndNet();
|
||||
/*获取禁用app*/
|
||||
void getSnAppAttr();
|
||||
/*获取第三方应用子页面ID连网限制*/
|
||||
void getAppIDControl();
|
||||
/*获取第三方应用内部网页跳转屏蔽*/
|
||||
@@ -134,6 +136,8 @@ public class MainSContact {
|
||||
void getDesktopIconFinish();
|
||||
/*获取应用自启升级和网络权限管理结束*/
|
||||
void getAppAutoStartUpdateAndNetFinish();
|
||||
/*获取禁用app*/
|
||||
void getSnAppAttrFinish();
|
||||
/*获取第三方应用子页面ID连网限制结束*/
|
||||
void getAppIDControlFinish();
|
||||
/*获取第三方应用内部网页跳转屏蔽结束*/
|
||||
|
||||
@@ -374,6 +374,16 @@ public class MainSPresenter implements MainSContact.Presenter {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getSnAppAttr() {
|
||||
NetInterfaceManager.getInstance().getSnAppAttr(new NetInterfaceManager.onCompleteCallback() {
|
||||
@Override
|
||||
public void onComplete() {
|
||||
mView.getSnAppAttrFinish();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getAppIDControl() {
|
||||
NetInterfaceManager.getInstance()
|
||||
|
||||
@@ -1022,6 +1022,11 @@ public class MainService extends Service implements MainSContact.MainView, Netwo
|
||||
|
||||
@Override
|
||||
public void getAppAutoStartUpdateAndNetFinish() {
|
||||
mPresenter.getSnAppAttr();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getSnAppAttrFinish() {
|
||||
mPresenter.getAppIDControl();
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ import com.aoleyun.sn.bean.ScreenLockState;
|
||||
import com.aoleyun.sn.comm.CommonConfig;
|
||||
import com.aoleyun.sn.comm.JGYActions;
|
||||
import com.aoleyun.sn.disklrucache.CacheHelper;
|
||||
import com.aoleyun.sn.gson.GsonUtils;
|
||||
import com.aoleyun.sn.gson.NullStringToEmptyAdapterFactory;
|
||||
import com.aoleyun.sn.manager.MapManager;
|
||||
import com.aoleyun.sn.network.NetInterfaceManager;
|
||||
@@ -43,7 +44,6 @@ import com.aoleyun.sn.utils.BatteryUtils;
|
||||
import com.aoleyun.sn.utils.CacheUtils;
|
||||
import com.aoleyun.sn.utils.CmdUtil;
|
||||
import com.aoleyun.sn.utils.ForegroundAppUtil;
|
||||
import com.aoleyun.sn.utils.GsonUtils;
|
||||
import com.aoleyun.sn.utils.JGYUtils;
|
||||
import com.aoleyun.sn.utils.MySQLData;
|
||||
import com.aoleyun.sn.utils.SPUtils;
|
||||
@@ -182,8 +182,12 @@ public class MessageReceiver extends XGPushBaseReceiver {
|
||||
private final String CLEAN_MEMORY = "47";
|
||||
/*运行日志设置*/
|
||||
private final String SN_LOG_SETTING = "48";
|
||||
/*禁止应用打开*/
|
||||
private final String DISABLE_APP_USAGE = "51";
|
||||
/*上传电池信息*/
|
||||
private final String INFO_BATTERY_INFO = "53";
|
||||
/*判断是否更新桌面*/
|
||||
private final String UPDATE_DESKTOP = "56";
|
||||
|
||||
|
||||
private Context mContext;
|
||||
@@ -802,13 +806,33 @@ public class MessageReceiver extends XGPushBaseReceiver {
|
||||
case SN_LOG_SETTING:
|
||||
senSNLogFile(extras);
|
||||
break;
|
||||
case DISABLE_APP_USAGE:
|
||||
disableApp(content, extras);
|
||||
break;
|
||||
case INFO_BATTERY_INFO:
|
||||
getBatteryInfo(context);
|
||||
break;
|
||||
case UPDATE_DESKTOP:
|
||||
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
private void disableApp(String content, String extras) {
|
||||
JsonObject jsonObject = GsonUtils.getJsonObject(extras);
|
||||
try {
|
||||
String packages = jsonObject.get("package").getAsString();
|
||||
int is_open = jsonObject.get("is_open").getAsInt();
|
||||
if (is_open == 0) {
|
||||
JGYUtils.getInstance().killBackgroundProcesses(packages);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "disableApp: " + e.getMessage());
|
||||
}
|
||||
Handler.getMain().postDelayed(() -> NetInterfaceManager.getInstance().getSnAppAttr(), 1234);
|
||||
}
|
||||
|
||||
private void setLock_screen(int state, String name) {
|
||||
if (ServiceAliveUtils.isServiceAlive(mContext)) {
|
||||
mContext.startService(new Intent(mContext, MainService.class));
|
||||
@@ -816,7 +840,7 @@ public class MessageReceiver extends XGPushBaseReceiver {
|
||||
ScreenLockState screenLockState = new ScreenLockState();
|
||||
screenLockState.setIs_screen_lock(state);
|
||||
screenLockState.setName(name);
|
||||
cacheHelper.put(UrlAddress.GET_LOCK_SCREEN_STATE, GsonUtils.toJsonString(screenLockState));
|
||||
cacheHelper.put(UrlAddress.GET_LOCK_SCREEN_STATE, GsonUtils.toJSONString(screenLockState));
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("name", name);
|
||||
if (state == 1) {
|
||||
|
||||
@@ -944,6 +944,30 @@ public class ApkUtils {
|
||||
this.add("com.android.calculator2");
|
||||
this.add("com.qi.TFSystem");
|
||||
this.add("com.qi.appstore");
|
||||
|
||||
this.add("com.wyt.evaluating");
|
||||
this.add("com.wyt.picturebook");
|
||||
this.add("com.hhdd.kadahd");
|
||||
this.add("com.wyt.onlinedic");
|
||||
this.add("com.ximalaya.ting.kid");
|
||||
this.add("com.baidu.duershow.child");
|
||||
this.add("com.gl.souti");
|
||||
this.add("com.ihuman.pinyin");
|
||||
this.add("com.hongen.app.word");
|
||||
this.add("com.wyt.parents_assistant");
|
||||
this.add("com.wyt.forbitpoint");
|
||||
this.add("com.wyt.lessonhelper");
|
||||
this.add("com.wyt.wangkexueximvvm");
|
||||
this.add("com.wyt.clicktoread");
|
||||
this.add("com.robot.app_ai");
|
||||
this.add("com.wyt.appstore");
|
||||
this.add("air.com.wyt.GLLearnMain");
|
||||
this.add("com.wyt.examcenter");
|
||||
|
||||
this.add("com.gl.compositioncorrection");
|
||||
this.add("com.gl.compositioncorrectionen");
|
||||
this.add("cn.wps.moffice_eng");
|
||||
this.add("com.ckl.launcher");
|
||||
}};
|
||||
|
||||
public static void showAllAPP(Context context) {
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
package com.aoleyun.sn.utils;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
|
||||
public class GsonUtils {
|
||||
public static JsonObject getJsonObject(String jsonString) {
|
||||
JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
|
||||
return jsonObject;
|
||||
}
|
||||
|
||||
// TODO: 2022/3/31 暂时没有实现
|
||||
public static <T> T getJsonFromType(String jsonString, Class clazz) {
|
||||
Gson gson = new Gson();
|
||||
T t = (T) gson.fromJson(jsonString, clazz);
|
||||
return t;
|
||||
}
|
||||
|
||||
public static String toJsonString(Object o) {
|
||||
return new Gson().toJson(o);
|
||||
}
|
||||
}
|
||||
@@ -1120,10 +1120,12 @@ public class JGYUtils {
|
||||
this.add("com.calendar.uiui");
|
||||
this.add("com.alarmclock.uiui");
|
||||
this.add("com.uiui.videoplayer");
|
||||
|
||||
}};
|
||||
HashSet<String> pkgSet = new HashSet<>(Arrays.asList(packageList.split(",")));
|
||||
pkgSet.addAll(packages);
|
||||
pkgSet.addAll(ApkUtils.desktopAPP);
|
||||
pkgSet.addAll(ApkUtils.aoleyunAPP);
|
||||
pkgSet.addAll(ApkUtils.aihuaApp);
|
||||
pkgSet.removeIf(TextUtils::isEmpty);
|
||||
String aole_app_forbid = String.join(",", pkgSet);
|
||||
Log.e(TAG, "writeAppPackageList: " + aole_app_forbid);
|
||||
@@ -1799,18 +1801,23 @@ public class JGYUtils {
|
||||
}
|
||||
|
||||
public void removeTask(String packageName) {
|
||||
List<ActivityManager.RecentTaskInfo> list = getRecentTasks(ActivityManager.getMaxRecentTasksStatic(), getCurrentUserId());
|
||||
HashMap<String, Integer> taskMap = new HashMap<>();
|
||||
for (ActivityManager.RecentTaskInfo info : list) {
|
||||
taskMap.put(info.realActivity.getPackageName(), info.id);
|
||||
}
|
||||
try {
|
||||
ActivityManagerNative.getDefault().removeTask(taskMap.get(packageName));
|
||||
} catch (RemoteException e) {
|
||||
e.printStackTrace();
|
||||
Log.e(TAG, "removeTask: " + e.getMessage());
|
||||
} catch (NullPointerException e) {
|
||||
Log.e(TAG, "removeTask: " + e.getMessage());
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
|
||||
List<ActivityManager.RecentTaskInfo> list = getRecentTasks(ActivityManager.getMaxRecentTasksStatic(), getCurrentUserId());
|
||||
HashMap<String, Integer> taskMap = new HashMap<>();
|
||||
for (ActivityManager.RecentTaskInfo info : list) {
|
||||
taskMap.put(info.realActivity.getPackageName(), info.id);
|
||||
}
|
||||
try {
|
||||
ActivityManagerNative.getDefault().removeTask(taskMap.get(packageName));
|
||||
} catch (RemoteException e) {
|
||||
e.printStackTrace();
|
||||
Log.e(TAG, "removeTask: " + e.getMessage());
|
||||
} catch (NullPointerException e) {
|
||||
Log.e(TAG, "removeTask: " + e.getMessage());
|
||||
}
|
||||
} else {
|
||||
ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
// TODO: 2022/10/25
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user