From 546cf3cc5df3fd55e10672e474c246582b947689 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Tue, 05 Aug 2025 02:30:23 +0000
Subject: [PATCH] 网络请求加密 网络请求优化 弹窗优化
---
libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt | 14
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/EncryptInterceptor.java | 20 +
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/HttpLoggingInterceptor.java | 42 --
libmvi/build.gradle.kts | 4
libmvi/src/main/java/com/runt/open/mvi/data/PhoneDevice.java | 4
libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RetrofitUtils.java | 175 ++++++++--
/dev/null | 41 --
libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/GsonConverterFactory.java | 2
libmvi/src/main/java/com/runt/open/mvi/utils/DeviceIdUtils.java | 2
libmvi/src/main/java/com/runt/open/mvi/utils/DeviceUtil.java | 52 ---
libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonResponseBodyConverter.java | 98 ++++++
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/LogEncryptInterceptor.java | 19 +
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/OpenInterceptor.java | 117 +++++++
libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/EncryptGsonRequestBodyConverter.java | 43 ++
libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonConverterFactory.java | 58 +++
libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RSAUtils.java | 180 ++++++++++++
16 files changed, 697 insertions(+), 174 deletions(-)
diff --git a/libmvi/build.gradle.kts b/libmvi/build.gradle.kts
index 2ff9876..7283dbf 100644
--- a/libmvi/build.gradle.kts
+++ b/libmvi/build.gradle.kts
@@ -17,12 +17,12 @@
debug {
isMinifyEnabled = false
- buildConfigField("String","HOST_IP_ADDR","\"http://192.168.28.9:8080/\"")
+ buildConfigField("String","HOST_IP_ADDR","\"http://192.168.28.89:8080/\"")
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt") , "proguard-rules.pro")
}
release {
isMinifyEnabled = false
- buildConfigField("String","HOST_IP_ADDR","\"http://192.168.28.9:8080/\"")
+ buildConfigField("String","HOST_IP_ADDR","\"http://192.168.28.175:8888/advert/\"")
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt") , "proguard-rules.pro")
}
}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/data/PhoneDevice.java b/libmvi/src/main/java/com/runt/open/mvi/data/PhoneDevice.java
index 456b6fa..01ebede 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/data/PhoneDevice.java
+++ b/libmvi/src/main/java/com/runt/open/mvi/data/PhoneDevice.java
@@ -4,7 +4,7 @@
import android.os.Build;
import com.runt.open.mvi.retrofit.utils.NetWorkUtils;
-import com.runt.open.mvi.utils.DeviceUtil;
+import com.runt.open.mvi.utils.DeviceIdUtils;
/**
@@ -20,7 +20,7 @@
static PhoneDevice device;
public static void setDevice(Context context) {
- device = new PhoneDevice(Build.BRAND,Build.MODEL,Build.VERSION.SDK_INT+"",Build.VERSION.RELEASE, DeviceUtil.getSerialNumber(context), NetWorkUtils.getNetIp());
+ device = new PhoneDevice(Build.BRAND,Build.MODEL,Build.VERSION.SDK_INT+"",Build.VERSION.RELEASE, DeviceIdUtils.getDeviceId(context), NetWorkUtils.getNetIp());
}
public static PhoneDevice getDevice() {
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/AddHeadersInterceptor.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/AddHeadersInterceptor.java
deleted file mode 100644
index c958403..0000000
--- a/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/AddHeadersInterceptor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.runt.open.mvi.retrofit.Interceptor;
-
-
-import com.google.gson.Gson;
-import com.runt.open.mvi.OpenApplication;
-import com.runt.open.mvi.data.PhoneDevice;
-import com.runt.open.mvi.utils.DeviceUtil;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-
-import okhttp3.Interceptor;
-import okhttp3.Request;
-import okhttp3.Response;
-
-/**
- * My father is Object, ites purpose of 添加header拦截器
- *
- * @purpose Created by Runt (qingingrunt2010@qq.com) on 2021-10-8.
- */
-public class AddHeadersInterceptor implements Interceptor {
-
- protected final Charset UTF8 = Charset.forName("UTF-8");
-
- @Override
- public Response intercept(Chain chain) throws IOException {
- return chain.proceed(addHeaders(chain.request()));
- }
-
- protected Request addHeaders(Request request){
- Request.Builder requestBuild = request.newBuilder()
- .addHeader("device", new Gson().toJson(PhoneDevice.getDevice()))
- .addHeader("appVersion", DeviceUtil.getAppVersionName(OpenApplication.Companion.getApplication()))
- .addHeader("os", DeviceUtil.isHarmonyOS()? "harmony" : "android");
- /*if(UserBean.getUser() != null){
- requestBuild.addHeader("token", UserBean.getUser().getToken());
- }*/
- return requestBuild.build().newBuilder().build();
- }
-
-}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/EncryptInterceptor.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/EncryptInterceptor.java
new file mode 100644
index 0000000..57def63
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/EncryptInterceptor.java
@@ -0,0 +1,20 @@
+package com.runt.open.mvi.retrofit.Interceptor;
+
+import java.io.IOException;
+
+import okhttp3.Response;
+
+/**
+ * @purpose 加密拦截器
+ * @author Runt (qingingrunt2010@qq.com)
+ * @date 2021-10-8.
+ */
+
+public class EncryptInterceptor extends OpenInterceptor {
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ return chain.proceed(encryptRequest(chain.request()));
+ }
+
+}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/HttpLoggingInterceptor.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/HttpLoggingInterceptor.java
index 20bb448..72d9512 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/HttpLoggingInterceptor.java
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/HttpLoggingInterceptor.java
@@ -2,13 +2,9 @@
import android.util.Log;
-import com.google.gson.Gson;
-import com.runt.open.mvi.OpenApplication;
-import com.runt.open.mvi.data.PhoneDevice;
import com.runt.open.mvi.retrofit.net.NetWorkCost;
import com.runt.open.mvi.retrofit.net.NetWorkListener;
import com.runt.open.mvi.retrofit.utils.HttpPrintUtils;
-import com.runt.open.mvi.utils.DeviceUtil;
import org.json.JSONArray;
import org.json.JSONException;
@@ -40,31 +36,17 @@
* @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-21.
*/
-public class HttpLoggingInterceptor extends AddHeadersInterceptor {
+public class HttpLoggingInterceptor extends OpenInterceptor {
final String TAG = "HttpLogging";
-
- private boolean printLog ;
-
- public HttpLoggingInterceptor(){
- this(true);
- }
- public HttpLoggingInterceptor(boolean printLog) {
- this.printLog = printLog;
- }
@Override
public Response intercept(Chain chain) throws IOException {
Request requestTemp = chain.request();
int hashCode = requestTemp.hashCode();
- if(printLog) {
- Log.d(TAG, "hashcode:" + hashCode);
- }
- Request.Builder requestBuild = requestTemp.newBuilder()
- .addHeader("device", new Gson().toJson(PhoneDevice.getDevice()))
- .addHeader("appVersion", DeviceUtil.getAppVersionName(OpenApplication.Companion.getApplication()))
- .addHeader("os", DeviceUtil.isHarmonyOS()? "harmony" : "android");
+ Log.d(TAG, "hashcode:" + hashCode);
+ Request.Builder requestBuild = addHeaders(requestTemp);
/*if(UserBean.getUser() != null){
requestBuild.addHeader("token",UserBean.getUser().getToken());
}*/
@@ -74,7 +56,7 @@
try {
logArrays.addAll(getRequestLog(request));
int position = logArrays.size() +2;
- response = chain.proceed(request);
+ response = proceed(chain,request);
logArrays.addAll(getResponseLog(response));
NetWorkCost netWorkCost = NetWorkListener.workCostMap.get(hashCode);
if(netWorkCost != null) {
@@ -84,9 +66,7 @@
new Thread(){
@Override
public void run() {
- if(printLog) {
- HttpPrintUtils.getInstance().printLog(logArrays, true);//线程安全方法,需在新线程执行,避免阻塞当前线程,导致程序无响应
- }
+ HttpPrintUtils.getInstance().printLog(logArrays, true);//线程安全方法,需在新线程执行,避免阻塞当前线程,导致程序无响应
}
}.start();
} catch (JSONException e) {
@@ -107,9 +87,7 @@
new Thread(){
@Override
public void run() {
- if(printLog) {
- HttpPrintUtils.getInstance().printLog(logArrays, false);//线程安全方法,需在新线程执行,避免阻塞当前线程,导致程序无响应
- }
+ HttpPrintUtils.getInstance().printLog(logArrays, false);//线程安全方法,需在新线程执行,避免阻塞当前线程,导致程序无响应
}
}.start();
throw e;//抛出异常,用于请求接收信息
@@ -117,12 +95,16 @@
return response;
}
+ protected Response proceed(Chain chain,Request request) throws IOException {
+ return chain.proceed(request);
+ }
+
/**
* 请求数据信息
* @param request
* @return
*/
- private ArrayList<String> getRequestLog(Request request) throws IOException, JSONException {
+ protected ArrayList<String> getRequestLog(Request request) throws IOException, JSONException {
RequestBody requestBody = request.body();
ArrayList<String> logArrays = new ArrayList<>();
String requestStartMessage = "--> " + request.method() + ' ' + URLDecoder.decode(request.url().toString() ,"UTF-8")+ ' ' ;
@@ -195,7 +177,7 @@
* @throws IOException
* @throws JSONException
*/
- private ArrayList<String> getResponseLog(Response response) throws IOException, JSONException {
+ protected ArrayList<String> getResponseLog(Response response) throws IOException, JSONException {
ArrayList<String> logArrays = new ArrayList<>();
ResponseBody responseBody = response.body();
long contentLength = responseBody.contentLength();
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/LogEncryptInterceptor.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/LogEncryptInterceptor.java
new file mode 100644
index 0000000..589e696
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/LogEncryptInterceptor.java
@@ -0,0 +1,19 @@
+package com.runt.open.mvi.retrofit.Interceptor;
+
+import java.io.IOException;
+
+import okhttp3.Request;
+import okhttp3.Response;
+
+/**
+ * @author Runt(qingingrunt2010 @ qq.com)
+ * @purpose
+ * @date 8/4/25
+ */
+public class LogEncryptInterceptor extends HttpLoggingInterceptor{
+
+ @Override
+ protected Response proceed(Chain chain, Request request) throws IOException {
+ return super.proceed(chain, encryptRequest(request));
+ }
+}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/OpenInterceptor.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/OpenInterceptor.java
new file mode 100644
index 0000000..3af2d03
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/OpenInterceptor.java
@@ -0,0 +1,117 @@
+package com.runt.open.mvi.retrofit.Interceptor;
+
+
+import com.google.gson.Gson;
+import com.runt.open.mvi.OpenApplication;
+import com.runt.open.mvi.data.PhoneDevice;
+import com.runt.open.mvi.retrofit.utils.RSAUtils;
+import com.runt.open.mvi.utils.DeviceUtil;
+
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+
+import okhttp3.FormBody;
+import okhttp3.Headers;
+import okhttp3.Interceptor;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+import okio.Buffer;
+
+/**
+ * My father is Object, ites purpose of 添加header拦截器
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2021-10-8.
+ */
+public class OpenInterceptor implements Interceptor {
+
+ protected final Charset UTF8 = Charset.forName("UTF-8");
+ protected final String ENCRYPT = "encrypt";
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ return chain.proceed(addHeaders(chain.request()).build().newBuilder().build());
+ }
+
+ protected Request.Builder addHeaders(Request request){
+ Request.Builder requestBuild = request.newBuilder()
+ .addHeader("device", new Gson().toJson(PhoneDevice.getDevice()))
+ .addHeader("appVersion", DeviceUtil.getAppVersionName(OpenApplication.Companion.getApplication()))
+ .addHeader("os", DeviceUtil.isHarmonyOS()? "harmony" : "android");
+ /*if(UserBean.getUser() != null){
+ requestBuild.addHeader("token", UserBean.getUser().getToken());
+ }*/
+ return requestBuild;
+ }
+
+ //加密
+ protected Request encryptRequest(Request request) throws IOException {
+ Headers headers = request.headers();
+ RequestBody requestBody = request.body();
+ Request.Builder builder = addHeaders(request);;
+ for(int i = 0 ; i < headers.size() ; i ++){
+ builder.addHeader(headers.name(i),headers.value(i));
+ }
+ if(requestBody != null){
+ Charset charset = UTF8;
+ MediaType contentType = requestBody.contentType();
+ if (contentType != null) {
+ charset = contentType.charset(UTF8);
+ }
+ HashMap param = new HashMap();
+ if(requestBody instanceof MultipartBody){
+ MultipartBody body = (MultipartBody) requestBody;
+ for(MultipartBody.Part part:body.parts()){
+ Buffer buffer1 = new Buffer();
+ part.body().writeTo(buffer1);
+ String str=buffer1.readString(charset).replaceAll("%(?![0-9a-fA-F]{2})","%25");
+ param.put(part.headers().get(part.headers().name(0)), URLDecoder.decode(str, "UTF-8"));
+ }
+ MultipartBody.Builder mbuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ mbuilder.addFormDataPart(ENCRYPT,encryptParam(param));
+ builder.post(mbuilder.build());
+ }else if(requestBody instanceof FormBody){
+ FormBody body = (FormBody) requestBody;
+ for(int i = 0 ; i < body.size() ; i ++ ){
+ param.put(body.name(i),body.value(i));
+ }
+ FormBody.Builder formBuild = new FormBody.Builder();
+ formBuild.add(ENCRYPT,encryptParam(param));
+ builder.post(formBuild.build());
+ }else{
+ Buffer buffer = new Buffer();
+ requestBody.writeTo(buffer);
+ String str = buffer.readString(charset);
+ String encrypt = encryptJson(str);
+ param.put(ENCRYPT,encrypt);
+ builder.post(RequestBody.create(MediaType.parse("application/json;charset=utf-8"), new JSONObject(param).toString()));
+ }
+ }
+ return builder.build();
+ }
+
+ /**
+ * 加密传递的参数
+ * @param params
+ * @return
+ */
+ protected String encryptParam(Map<String, Object> params){
+ return encryptJson(new JSONObject(params).toString());
+ }
+
+ protected String encryptJson(String json){
+ try {
+ return RSAUtils.encrypt(json,RSAUtils.getPublicKey(RSAUtils.PUBLIC_KEY));
+ }catch (Exception e){
+ e.printStackTrace();
+ return e.getMessage();
+ }
+ }
+}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonConverterFactory.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonConverterFactory.java
new file mode 100644
index 0000000..2897d0e
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonConverterFactory.java
@@ -0,0 +1,58 @@
+package com.runt.open.mvi.retrofit.converter;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import okhttp3.RequestBody;
+import okhttp3.ResponseBody;
+import retrofit2.Converter;
+import retrofit2.Retrofit;
+
+/**
+ * @purpose 解密gson转换
+ * @author Runt (qingingrunt2010@qq.com)
+ * @date 2021-7-22.
+ */
+public class DecryptGsonConverterFactory extends Converter.Factory {
+
+ public static DecryptGsonConverterFactory create() {
+ return create(new Gson(),false);
+ }
+
+ public static DecryptGsonConverterFactory create(boolean transHump) {
+ return create(new Gson(),transHump);
+ }
+
+
+ public static DecryptGsonConverterFactory create(Gson gson,boolean transHump) {
+ return new DecryptGsonConverterFactory(gson,transHump);
+ }
+
+ private final Gson gson;
+
+ private final boolean transHump;
+
+ public DecryptGsonConverterFactory(Gson gson, boolean transHump) {
+ if (gson == null) throw new NullPointerException("gson == null");
+ this.gson = gson;
+ this.transHump = transHump;
+ }
+
+ @Override
+ public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
+ Retrofit retrofit) {
+ TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
+ return new DecryptGsonResponseBodyConverter<>(gson, adapter,transHump);
+ }
+
+ @Override
+ public Converter<?, RequestBody> requestBodyConverter(Type type,
+ Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
+ TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
+ return new EncryptGsonRequestBodyConverter<>(gson, adapter);
+ }
+}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonResponseBodyConverter.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonResponseBodyConverter.java
new file mode 100644
index 0000000..44e36e4
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonResponseBodyConverter.java
@@ -0,0 +1,98 @@
+package com.runt.open.mvi.retrofit.converter;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonIOException;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import com.runt.open.mvi.BuildConfig;
+import com.runt.open.mvi.retrofit.utils.RSAUtils;
+import com.runt.open.mvi.utils.GsonUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+
+import okhttp3.ResponseBody;
+import retrofit2.Converter;
+
+/**
+ * @purpose 解密gson转换器
+ * @author Runt (qingingrunt2010@qq.com)
+ * @date 2021-7-22.
+ */
+public class DecryptGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
+ private final Gson gson;
+ private final TypeAdapter<T> adapter;
+ private final Charset UTF_8 = Charset.forName("UTF-8");
+ private final boolean transHump;//驼峰转换
+ private final String ENCRYPT = "encrypt";
+
+ public DecryptGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter, boolean transHump) {
+ this.gson = gson;
+ this.adapter = adapter;
+ this.transHump = transHump;
+ }
+
+ @Override
+ public T convert(ResponseBody value) throws IOException {
+ String response = null;
+ try {
+ String val = new String(value.bytes(),UTF_8);
+ response = decryptJsonStr(val);//解密
+ } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
+ e.printStackTrace();
+ response = "{\"code\":412,\"message\":\""+"解密数据出错"+e.getMessage()+"\"}";
+ } catch (JSONException e) {
+ e.printStackTrace();
+ response = "{\"code\":414,\"message\":\"非标准json\"}";
+ }catch (Exception e){
+ e.printStackTrace();
+ JsonReader jsonReader = gson.newJsonReader(value.charStream());
+ return adapter.read(jsonReader);
+ } finally {
+ if(response==null){
+ return null;
+ }
+ InputStream inputStream = new ByteArrayInputStream(response.getBytes());
+ JsonReader jsonReader = gson.newJsonReader(new InputStreamReader(inputStream, UTF_8));
+ T result = adapter.read(jsonReader);
+ if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
+ throw new JsonIOException("JSON document was not fully consumed.");
+ }
+ value.close();
+ return result;
+ }
+ }
+
+ /**
+ * 解密json
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ protected String decryptJsonStr(String body) throws Exception {
+ if(BuildConfig.DEBUG) {
+ Log.e("Converter", "decryptJsonStr body:" + body);
+ }
+ if(TextUtils.isEmpty(body)){
+
+ }else if(body.indexOf("{") == 0) {
+ JSONObject json = new JSONObject(body);
+ body = RSAUtils.decrypt(json.getString(ENCRYPT), RSAUtils.getPublicKey(RSAUtils.PUBLIC_KEY));//
+ //Log.e("Converter", "decryptJsonStr body:" + body);
+ }
+ return transHump? GsonUtils.toHumpJson(body):body;
+ }
+
+}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/EncryptGsonRequestBodyConverter.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/EncryptGsonRequestBodyConverter.java
new file mode 100644
index 0000000..03f8b85
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/EncryptGsonRequestBodyConverter.java
@@ -0,0 +1,43 @@
+package com.runt.open.mvi.retrofit.converter;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonWriter;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.Charset;
+
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import okio.Buffer;
+import retrofit2.Converter;
+
+/**
+ * @author Runt(qingingrunt2010 @ qq.com)
+ * @purpose 加密gson转换器
+ * @date 8/4/25
+ */
+public class EncryptGsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
+ private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
+ private static final Charset UTF_8 = Charset.forName("UTF-8");
+
+ private final Gson gson;
+ private final TypeAdapter<T> adapter;
+
+ EncryptGsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
+ this.gson = gson;
+ this.adapter = adapter;
+ }
+
+ @Override
+ public RequestBody convert(T value) throws IOException {
+ Buffer buffer = new Buffer();
+ Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
+ JsonWriter jsonWriter = gson.newJsonWriter(writer);
+ adapter.write(jsonWriter, value);
+ jsonWriter.close();
+ return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
+ }
+}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/GsonConverterFactory.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/GsonConverterFactory.java
index af95142..5097e1f 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/GsonConverterFactory.java
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/GsonConverterFactory.java
@@ -15,7 +15,7 @@
import retrofit2.Retrofit;
/**
- * My father is Object, ites purpose of 解密gson转换
+ * My father is Object, ites purpose of gson转换
*
* @purpose Created by Runt (qingingrunt2010@qq.com) on 2021-7-22.
*/
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RSAUtils.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RSAUtils.java
new file mode 100644
index 0000000..5bbd89d
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RSAUtils.java
@@ -0,0 +1,180 @@
+package com.runt.open.mvi.retrofit.utils;
+
+import android.util.Base64;
+
+import java.io.ByteArrayOutputStream;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+import javax.crypto.Cipher;
+
+
+public class RSAUtils {
+
+ //客户端私钥
+ public static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALBGei0scHoOjTLImPHvASaGqYNrdLie0ckWp74Nkqv7FVeXPOvWEG8_jRJCVjJ1grr8SGd9sVY2sxn5XIz7fUEBfx7Vm8m0DaCNBWJpFLGw9xiaVZ2AUKoNyTD4NgZobbwZbt6ZNB6_fggPrGF18pq6GPyCndX1JW8ZiZKj33VBAgMBAAECgYB0q-EX3y7_CnyYXT8l-mxHhJ_T9R6HR89QimcyGqe2nvRMSjSvX7r29xg3OqL0uORzQKHnpcDncELw8SQ5yAbpENeIsD0dvdFlkoyFYU4ljeUbJ46binwwg20TNARjTbpNos9zbhTPh8qixdblxppXA1WC18HtXhixgca5bNG9lQJBAPQfNdpNdDL9l8Tw4hYVuDMszcFuZYbHbm0S4xcwqj-dXNWBztNf5W_K92-N5GIoHbOypkGzjlBjSZi_oKA0HusCQQC42irhw682CG44mKdP6YRDxy6OaauVX4yE9WnsbO8JFSSc9ZCKMMD0F3NGtytDrVMAJxG1iPWXa4ptEdtgwCmDAkAUW1npR1YuPllekdu4jb0bf1v1ClirAYxiyhVnxKYdweiQ4U827yM5zEoP4lwuFzxK1NXqWqe-alkjxK8HTPFbAkAviQLf_adP2MknSrIzzZQSreTeAHR8PA7xnf54KucpScOZjVh3AOSNoH4nYDEC_U5LysA2E5s8Lg5xz9a_QYsrAkEAwV6gNED7_SYDsYyEWimQ6znUb_QSY-sSChnSCY-ILG1wpynBHw_t1Oi3ljl6gL_cYKG1O3uwOtvZtb-Vr1bNkQ";
+
+ //服务器公钥
+ public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVj4BkEYtlv8z4quUUrkRvW4xuWQvXegMuLKPQZky8LObbxfFZniSvQ4gllFlyFuCjeeInjyQFPC3ARdbihV3P88drBsB2gCG9lwlCkgMjZfSc/hxC4VirsHbGGSIN5oPyCZMQNAUnIojpKBRlE0TJmHvP+FpAe46Yb+oPs8R5DQIDAQAB";
+
+
+ /**
+ * RSA最大加密明文大小
+ */
+ private static final int MAX_ENCRYPT_BLOCK = 117;
+
+ /**
+ * RSA最大解密密文大小
+ */
+ private static final int MAX_DECRYPT_BLOCK = 128;
+
+ static final String KEY_RSA = "RSA"; //android标准 “RSA/ECB/PKCS1Padding” 服务端标准 “RSA”
+
+ /**
+ * 获取密钥对
+ *
+ * @return 密钥对
+ */
+ public static KeyPair getKeyPair() throws Exception {
+ KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA);
+ generator.initialize(1024);
+ return generator.generateKeyPair();
+ }
+
+ /**
+ * 获取私钥
+ *
+ * @param privateKey 私钥字符串
+ * @return
+ */
+ public static PrivateKey getPrivateKey(String privateKey) throws Exception {
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
+ byte[] decodedKey = Base64.decode(privateKey.getBytes(), Base64.URL_SAFE);
+ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
+ return keyFactory.generatePrivate(keySpec);
+ }
+
+ /**
+ * 获取公钥
+ *
+ * @param publicKey 公钥字符串
+ * @return
+ */
+ public static PublicKey getPublicKey(String publicKey) throws Exception {
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
+ byte[] decodedKey = Base64.decode(publicKey.getBytes(), Base64.DEFAULT);
+ X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
+ return keyFactory.generatePublic(keySpec);
+ }
+
+ /**
+ * RSA加密
+ *
+ * @param data 待加密数据
+ * @param key 密钥
+ * @return
+ */
+ public static String encrypt(String data, Key key) throws Exception {
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, key);
+ int inputLen = data.getBytes().length;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offset = 0;
+ byte[] cache;
+ int i = 0;
+ // 对数据分段加密
+ while (inputLen - offset > 0) {
+ if (inputLen - offset > MAX_ENCRYPT_BLOCK) {
+ cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);
+ } else {
+ cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
+ }
+ out.write(cache, 0, cache.length);
+ i++;
+ offset = i * MAX_ENCRYPT_BLOCK;
+ }
+ byte[] encryptedData = out.toByteArray();
+ out.close();
+ // 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串
+ // 加密后的字符串
+ return Base64.encodeToString(encryptedData,Base64.URL_SAFE | Base64.NO_WRAP);
+ }
+
+ /**
+ * RSA解密
+ *
+ * @param data 待解密数据
+ * @param key 密钥
+ * @return
+ */
+ public static String decrypt(String data, Key key) throws Exception {
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(Cipher.DECRYPT_MODE, key);
+ byte[] dataBytes = Base64.decode(data.getBytes(), Base64.URL_SAFE);
+ int inputLen = dataBytes.length;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offset = 0;
+ byte[] cache;
+ int i = 0;
+ // 对数据分段解密
+ while (inputLen - offset > 0) {
+ if (inputLen - offset > MAX_DECRYPT_BLOCK) {
+ cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);
+ } else {
+ cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
+ }
+ out.write(cache, 0, cache.length);
+ i++;
+ offset = i * MAX_DECRYPT_BLOCK;
+ }
+ byte[] decryptedData = out.toByteArray();
+ out.close();
+ // 解密后的内容
+ return new String(decryptedData, "UTF-8");
+ }
+
+ /**
+ * 签名
+ *
+ * @param data 待签名数据
+ * @param privateKey 私钥
+ * @return 签名
+ */
+ public static String sign(String data, PrivateKey privateKey) throws Exception {
+ byte[] keyBytes = privateKey.getEncoded();
+ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
+ PrivateKey key = keyFactory.generatePrivate(keySpec);
+ Signature signature = Signature.getInstance("MD5withRSA");
+ signature.initSign(key);
+ signature.update(data.getBytes());
+ return Base64.encodeToString(signature.sign(),Base64.DEFAULT);
+ }
+
+ /**
+ * 验签
+ *
+ * @param srcData 原始字符串
+ * @param publicKey 公钥
+ * @param sign 签名
+ * @return 是否验签通过
+ */
+ public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
+ byte[] keyBytes = publicKey.getEncoded();
+ X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
+ PublicKey key = keyFactory.generatePublic(keySpec);
+ Signature signature = Signature.getInstance("MD5withRSA");
+ signature.initVerify(key);
+ signature.update(srcData.getBytes());
+ return signature.verify(Base64.decode(sign.getBytes(),Base64.DEFAULT));
+ }
+
+}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RetrofitUtils.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RetrofitUtils.java
index b5b0988..fa21c1a 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RetrofitUtils.java
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RetrofitUtils.java
@@ -2,14 +2,18 @@
import com.runt.open.mvi.BuildConfig;
-import com.runt.open.mvi.retrofit.Interceptor.AddHeadersInterceptor;
+import com.runt.open.mvi.retrofit.Interceptor.LogEncryptInterceptor;
+import com.runt.open.mvi.retrofit.Interceptor.OpenInterceptor;
+import com.runt.open.mvi.retrofit.Interceptor.EncryptInterceptor;
import com.runt.open.mvi.retrofit.Interceptor.HttpLoggingInterceptor;
+import com.runt.open.mvi.retrofit.converter.DecryptGsonConverterFactory;
import com.runt.open.mvi.retrofit.converter.GsonConverterFactory;
import com.runt.open.mvi.retrofit.net.NetWorkListener;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
+import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Protocol;
import retrofit2.Retrofit;
@@ -23,13 +27,11 @@
public class RetrofitUtils {
static RetrofitUtils instance;
- Retrofit retrofit/*log输出,驼峰转换*/,unHumpRetrofit/*log输出,不强制驼峰转换*/,
- unLogRetrofit/*log不输出,驼峰转换*/,unLogHumpRetorfit/*log不输出,不强制驼峰转换*/;
+ Retrofit retrofit/*log输出*/,humpRetrofit/*log输出,强制驼峰转换*/,
+ unLogRetrofit/*log不输出*/,unLogHumpRetrofit/*log不输出,强制驼峰转换*/,
+ encryptRetrofit/*加密log输出*/,humpEncryptRetrofit/*加密log输出,强制驼峰转换*/,
+ unLogEncryptRetrofit/*加密log不输出*/,unLogHumpEncryptRetrofit/*加密log不输出,强制驼峰转换*/;
- OkHttpClient.Builder builder = new OkHttpClient.Builder()
- .addInterceptor(new AddHeadersInterceptor());
- OkHttpClient.Builder logBuilder = new OkHttpClient.Builder()
- .addInterceptor(new HttpLoggingInterceptor());//log打印拦截器
public static RetrofitUtils getInstance() {
if(instance == null){
@@ -47,38 +49,22 @@
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
+
+ public <T> T getTempRetrofit(Class<T> clas,String url) {
+ Interceptor interceptor = BuildConfig.DEBUG ? new HttpLoggingInterceptor() : new OpenInterceptor();
+ return getRetrofit(getOkHttpClient(new OkHttpClient.Builder().addInterceptor(interceptor)),
+ new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(true)),url).create(clas);
+ }
+
/**
- * log输出,gson驼峰转换
+ * log输出
* @return
*/
public <T> T getRetrofit(Class<T> clas) {
- if(retrofit == null){
- retrofit = getRetrofit(getOkHttpClient(logBuilder),
- new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(true))) ;
- }
if(!BuildConfig.DEBUG){//正式版 不打印log
return getUnLogRetrofit(clas);
}
- return retrofit.create(clas);
- }
-
- public <T> T getTempRetrofit(Class<T> clas,String url) {
- return getRetrofit(getOkHttpClient(new OkHttpClient.Builder().addInterceptor(new HttpLoggingInterceptor(BuildConfig.DEBUG))),
- new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(true)),url).create(clas);
- }
- /**
- * log输出,gson不转换驼峰
- * @return
- */
- public <T> T getUnHumpRetrofit(Class<T> clas) {
- if(unHumpRetrofit == null){
- unHumpRetrofit = getRetrofit(getOkHttpClient(logBuilder),
- new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())) ;
- }
- if(!BuildConfig.DEBUG){//正式版 不打印log
- return getUnLogHumpRetorfit(clas);
- }
- return unHumpRetrofit.create(clas);
+ return getRetrofit(clas,false,false,true);
}
/**
@@ -86,23 +72,128 @@
* @return
*/
public <T> T getUnLogRetrofit(Class<T> clas) {
- if(unLogRetrofit == null){
- unLogRetrofit = getRetrofit(getOkHttpClient(builder),
- new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(true))) ;
- }
- return unLogRetrofit.create(clas);
+ return getRetrofit(clas,false,false,false);
}
/**
- * log不输出,gson不转换驼峰
+ * log输出,gson转换驼峰
+ * @return
+ */
+ public <T> T getHumpRetrofit(Class<T> clas) {
+ if(!BuildConfig.DEBUG){//正式版 不打印log
+ return getUnLogHumpRetorfit(clas);
+ }
+ return getRetrofit(clas,true,false,true);
+ }
+
+ /**
+ * log不输出,gson转换驼峰
* @return
*/
public <T> T getUnLogHumpRetorfit(Class<T> clas) {
- if(unLogHumpRetorfit == null){
- unLogHumpRetorfit = getRetrofit(getOkHttpClient(builder),
- new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())) ;
+ return getRetrofit(clas,true,false,false);
+ }
+
+ /**
+ * 加密log输出
+ * @return
+ */
+ public <T> T getEncrptRetrofit(Class<T> clas) {
+ if(!BuildConfig.DEBUG){//正式版 不打印log
+ return getUnLogEncryptRetrofit(clas);
}
- return unLogHumpRetorfit.create(clas);
+ return getRetrofit(clas,false,true,true);
+ }
+
+ /**
+ * 加密log不输出
+ * @return
+ */
+ public <T> T getUnLogEncryptRetrofit(Class<T> clas) {
+ return getRetrofit(clas,false,true,false);
+ }
+
+ /**
+ * 加密log输出 gson转换驼峰
+ * @return
+ */
+ public <T> T getHumpEncryptRetrofit(Class<T> clas) {
+ if(!BuildConfig.DEBUG){//正式版 不打印log
+ return getUnLogHumpEncryptRetrofit(clas);
+ }
+ return getRetrofit(clas,true,true,true);
+ }
+
+ /**
+ * 加密log不输出 gson转换驼峰
+ * @return
+ */
+ public <T> T getUnLogHumpEncryptRetrofit(Class<T> clas) {
+ return getRetrofit(clas,true,true,false);
+ }
+
+ private <T> T getRetrofit(Class<T> clzz,boolean transHump,boolean encrypt,boolean log){
+ Retrofit temp = null;
+ if(transHump && encrypt && log){
+ if(humpEncryptRetrofit == null){
+ humpEncryptRetrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = humpEncryptRetrofit;
+ }else if(transHump && encrypt && !log ){
+ if(unLogHumpEncryptRetrofit == null){
+ unLogHumpEncryptRetrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = unLogHumpEncryptRetrofit;
+ }else if(transHump && !encrypt && !log ){
+ if(unLogHumpRetrofit == null){
+ unLogHumpRetrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = unLogHumpRetrofit;
+ }else if(!transHump && !encrypt && !log ){
+ if(unLogRetrofit == null){
+ unLogRetrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = unLogRetrofit;
+ }else if(!transHump && !encrypt && log ){
+ if(retrofit == null){
+ retrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = retrofit;
+ }else if(!transHump && encrypt && log ){
+ if(encryptRetrofit == null){
+ encryptRetrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = encryptRetrofit;
+ }else if(!transHump && encrypt && !log ){
+ if(unLogEncryptRetrofit == null){
+ unLogEncryptRetrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = unLogEncryptRetrofit;
+ }else if(transHump && !encrypt && log ){
+ if(humpRetrofit == null){
+ humpRetrofit = initRetrofit(transHump,encrypt,log);
+ }
+ temp = humpRetrofit;
+ }
+ return temp.create(clzz);
+ }
+
+ private Retrofit initRetrofit(boolean transHump,boolean encrypt,boolean log){
+ Retrofit.Builder builder = new Retrofit.Builder();
+ builder.addConverterFactory(encrypt ? DecryptGsonConverterFactory.create(transHump) : GsonConverterFactory.create(transHump));
+
+ OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
+ if(log && encrypt){
+ httpBuilder.addInterceptor(new LogEncryptInterceptor());//log打印加密拦截器
+ } else if (log && !encrypt) {
+ httpBuilder.addInterceptor(new HttpLoggingInterceptor());//log打印拦截器
+ } else if (!log && encrypt) {
+ httpBuilder.addInterceptor(new EncryptInterceptor());//加密拦截器
+ } else if (!log && !encrypt) {
+ httpBuilder.addInterceptor(new OpenInterceptor());//拦截器
+ }
+ OkHttpClient httpClient = getOkHttpClient(httpBuilder);
+ return getRetrofit(httpClient,builder);
}
private OkHttpClient getOkHttpClient(OkHttpClient.Builder builder){
diff --git a/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceIdUtils.java b/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceIdUtils.java
index 69a6a94..e9bea59 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceIdUtils.java
+++ b/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceIdUtils.java
@@ -51,7 +51,7 @@
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getDeviceId();
} catch (Exception e) {
- //e.printStackTrace();
+ e.printStackTrace();
}
return "";
}
diff --git a/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceUtil.java b/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceUtil.java
index e8c0234..5586242 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceUtil.java
+++ b/libmvi/src/main/java/com/runt/open/mvi/utils/DeviceUtil.java
@@ -1,21 +1,16 @@
package com.runt.open.mvi.utils;
-import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Point;
import android.os.Build;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
-
-import androidx.core.app.ActivityCompat;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -43,8 +38,7 @@
sb.append("设备厂商:");//设备型号
sb.append(getDeviceBrand() + "\t");//设备型号
sb.append("程序版本号:" + getAppVersionCode(context) + " " + getAppVersionName(context) + "\t");//程序版本号
- sb.append("设备唯一标识符:" + getSerialNumber(context));
- sb.append("\n设备imei:" + getIMEI(context));
+ sb.append("设备唯一标识符:" + DeviceIdUtils.getDeviceId(context));
String str = sb.toString() + " \n";
str += getDisplayInfomation(context) + " \n";
str += getDensity(context) + " \n";
@@ -291,50 +285,6 @@
}
return 0;
- }
-
-
-
- public static String getSerialNumber(Context context) {
- String serial = "";
- try {
- if (Build.VERSION.SDK_INT >= 28) {//9.0+
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
- Log.i(TAG, "getMEID meid: READ_PHONE_STATE" );
- ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_PHONE_STATE}, 1567);
- } else {
- serial = Build.getSerial();
- }
- } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//8.0+
- serial = Build.SERIAL;
- } else {//8.0-
- Class<?> c = Class.forName("android.os.SystemProperties");
- Method get = c.getMethod("get", String.class);
- serial = (String) get.invoke(c, "ro.serialno");
- }
- } catch (Exception e) {
- Log.e("e", "读取设备序列号异常:" + e.toString());
- }
- return serial;
- }
-
- public static String getIMEI(Context context) {
- String deviceId = "";
- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
- if (null != tm) {
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
- Log.i(TAG, "getMEID meid: READ_PHONE_STATE" );
- ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_PHONE_STATE}, 1567);
- } else {
- if (tm.getDeviceId() != null) {
- deviceId = tm.getDeviceId();
- } else {
- deviceId = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
- }
- }
- Log.d("deviceId--->", deviceId);
- }
- return "";
}
public static String getMEID() {
diff --git a/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt b/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt
index f13f6dc..6cf1b26 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt
+++ b/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt
@@ -1,5 +1,6 @@
package com.runt.open.mvi.views
+import android.util.Log
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
@@ -72,10 +73,13 @@
fun MessageDialog(message : MessageState){
if(message.isVisible){
Dialog(onDismissRequest = {
- if(message.cancelDissmiss){
+ //系统响应
+ Log.i("PublicViews" , "MessageDialog: onDismiss")
+ if(message.touchOutside){
message.setDismiss.invoke()
+ message.onCancelRequest.invoke()
+ message.onDismissRequest.invoke()
}
- message.onDismissRequest.invoke()
}) {
Card(
modifier = Modifier
@@ -104,10 +108,11 @@
if(!message.cancelText.equals("")){
Spacer(modifier = Modifier.weight(1f))
Button(onClick = {
+ message.onCancelRequest.invoke()
if(message.cancelDissmiss){
message.setDismiss.invoke()
+ message.onDismissRequest.invoke()
}
- message.onCancelRequest.invoke()
},
colors = ButtonDefaults.buttonColors(
containerColor = Color.Gray, // 背景色
@@ -119,10 +124,11 @@
}
Spacer(modifier = Modifier.weight(1f))
Button(onClick = {
+ message.onConfirmRequest.invoke()
if(message.confirmDissmiss){
message.setDismiss.invoke()
+ message.onDismissRequest.invoke()
}
- message.onConfirmRequest.invoke()
}) {
Text(text = message.confirmText)
}
--
Gitblit v1.9.1