Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
android_street
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
android
android_street
Commits
f6088882
Commit
f6088882
authored
Jul 12, 2021
by
mengcuiguang2
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
代码优化
parent
a85abb1e
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
152 additions
and
352 deletions
+152
-352
build.gradle
app/build.gradle
+1
-1
LoginViewModel.kt
app/src/main/java/com/mints/street/login/LoginViewModel.kt
+2
-0
OkHttpInterceptor.kt
...c/main/java/com/mints/street/netwrok/OkHttpInterceptor.kt
+4
-0
SplashActivity.kt
app/src/main/java/com/mints/street/splash/SplashActivity.kt
+8
-7
libcrashsdk.so
app/src/main/jniLibs/arm64-v8a/libcrashsdk.so
+0
-0
libcrashsdk.so
app/src/main/jniLibs/armeabi-v7a/libcrashsdk.so
+0
-0
libcrashsdk.so
app/src/main/jniLibs/armeabi/libcrashsdk.so
+0
-0
GsonConverterFactory.java
...n/java/com/fry/base/basenetwork/GsonConverterFactory.java
+137
-0
HttpResponseListenerImpl.java
...va/com/fry/base/basenetwork/HttpResponseListenerImpl.java
+0
-95
HttpsUtil.java
...ase/src/main/java/com/fry/base/basenetwork/HttpsUtil.java
+0
-60
RetrofitClient.java
...rc/main/java/com/fry/base/basenetwork/RetrofitClient.java
+0
-2
SslHttpsUtils.java
...src/main/java/com/fry/base/basenetwork/SslHttpsUtils.java
+0
-187
No files found.
app/build.gradle
View file @
f6088882
...
...
@@ -134,7 +134,7 @@ android {
}
dependencies
{
implementation
fileTree
(
include:
[
'*.jar'
],
dir:
'libs'
)
implementation
fileTree
(
include:
[
'*.jar'
],
dir:
'libs'
)
testImplementation
rootProject
.
ext
.
support
[
"junit"
]
//下拉刷新
...
...
app/src/main/java/com/mints/street/login/LoginViewModel.kt
View file @
f6088882
...
...
@@ -26,7 +26,9 @@ class LoginViewModel(application:Application):BaseViewModel(application) {
override
fun
onBusinessSuccess
(
response
:
BaseResponse
<
AwardBean
>)
{
KLog
.
e
(
"sfdsdf"
,
response
.
result
.
toString
())
}
override
fun
onBusinessFail
(
response
:
BaseResponse
<
AwardBean
>?)
{
}
})
}
}
\ No newline at end of file
app/src/main/java/com/mints/street/netwrok/OkHttpInterceptor.kt
View file @
f6088882
...
...
@@ -165,6 +165,10 @@ class OkHttpInterceptor(aesKey: String) : Interceptor {
// 解密
try
{
val
json
=
JSONObject
(
rspString
)
// if(!json.isNull("status")&& TextUtils.equals(json["status"].toString(),"401")){
// return
// }
if
(!
json
.
isNull
(
"data"
))
{
val
data
=
json
[
"data"
]
rspString
=
AESUtils
.
detrypt
(
data
.
toString
(),
aesKey
)
...
...
app/src/main/java/com/mints/street/splash/SplashActivity.kt
View file @
f6088882
...
...
@@ -89,15 +89,16 @@ class SplashActivity:BaseActivity<ActivitySplashBinding,SplashViewModel>() {
if
(!
deviceInfo
.
signInfo
)
{
finish
()
}
else
{
try
{
mSplashContainer
=
findViewById
(
R
.
id
.
splash_container
)
//加载开屏广告
loadSplashAd
()
}
catch
(
e
:
Exception
)
{
// try {
// mSplashContainer = findViewById(R.id.splash_container)
// //加载开屏广告
// loadSplashAd()
// } catch (e: Exception) {
// goToMainActivity()
// }
goToMainActivity
()
}
}
}
/**
* 加载开屏广告
...
...
app/src/main/jniLibs/arm64-v8a/libcrashsdk.so
0 → 100644
View file @
f6088882
File added
app/src/main/jniLibs/armeabi-v7a/libcrashsdk.so
0 → 100644
View file @
f6088882
File added
app/src/main/jniLibs/armeabi/libcrashsdk.so
0 → 100644
View file @
f6088882
File added
library_base/src/main/java/com/fry/base/basenetwork/GsonConverterFactory.java
0 → 100644
View file @
f6088882
package
com
.
fry
.
base
.
basenetwork
;
import
com.google.gson.Gson
;
import
java.io.IOException
;
import
java.io.OutputStreamWriter
;
import
java.io.Reader
;
import
java.io.Writer
;
import
java.lang.annotation.Annotation
;
import
java.lang.reflect.Type
;
import
java.nio.charset.Charset
;
import
java.nio.charset.StandardCharsets
;
import
me.goldze.mvvmhabit.http.BaseResponse
;
import
okhttp3.MediaType
;
import
okhttp3.RequestBody
;
import
okhttp3.ResponseBody
;
import
okio.Buffer
;
import
retrofit2.Converter
;
import
retrofit2.Retrofit
;
/**
* Description:gson全局解析
*/
public
class
GsonConverterFactory
extends
Converter
.
Factory
{
private
final
Gson
gson
;
public
static
GsonConverterFactory
create
()
{
return
create
(
new
Gson
());
}
public
static
GsonConverterFactory
create
(
Gson
gson
)
{
return
new
GsonConverterFactory
(
gson
);
}
private
GsonConverterFactory
(
Gson
gson
)
{
if
(
gson
==
null
)
throw
new
NullPointerException
(
"gson == null"
);
this
.
gson
=
gson
;
}
@Override
public
Converter
<
ResponseBody
,
?>
responseBodyConverter
(
Type
type
,
Annotation
[]
annotations
,
Retrofit
retrofit
)
{
return
new
GsonResponseBodyConverter
<>(
gson
,
type
);
}
@Override
public
Converter
<?,
RequestBody
>
requestBodyConverter
(
Type
type
,
Annotation
[]
parameterAnnotations
,
Annotation
[]
methodAnnotations
,
Retrofit
retrofit
)
{
return
new
GsonRequestBodyConverter
<>(
gson
,
type
);
}
// 这里创建从ResponseBody其它类型的Converter
// 主要用于对响应体的处理
final
class
GsonResponseBodyConverter
<
T
>
implements
Converter
<
ResponseBody
,
T
>
{
private
final
Gson
gson
;
private
final
Type
type
;
GsonResponseBodyConverter
(
Gson
gson
,
Type
type
)
{
this
.
gson
=
gson
;
this
.
type
=
type
;
}
@Override
public
T
convert
(
ResponseBody
value
)
throws
IOException
{
Reader
reader
=
value
.
charStream
();
try
{
T
t
=
gson
.
fromJson
(
reader
,
type
);
loginInvalid
(
t
);
return
t
;
}
finally
{
try
{
if
(
reader
!=
null
)
reader
.
close
();
}
catch
(
IOException
ignored
)
{
ignored
.
printStackTrace
();
}
}
}
/**
* 用户登陆失效
*
* @param t
*/
private
void
loginInvalid
(
T
t
)
{
if
(
t
instanceof
BaseResponse
)
{
BaseResponse
br
=
(
BaseResponse
)
t
;
int
code
=
br
.
getstatus
();
if
(
code
==
401
)
{
try
{
// UserManager.Companion.getINSTANCE().userLogout();
// Activity forwardActivity = ForegroundOrBackground.getApp_activity();
// if (forwardActivity != null) {
// if (!forwardActivity.isFinishing()) {
// forwardActivity.startActivity(new Intent(forwardActivity, WxLoginActivity.class));
// }
// }
}
catch
(
Exception
e
)
{
}
}
}
}
}
// 在这里创建 从自定类型到ResponseBody 的Converter
// 主要用于对Part、PartMap、Body注解的处理
final
class
GsonRequestBodyConverter
<
T
>
implements
Converter
<
T
,
RequestBody
>
{
private
final
MediaType
MEDIA_TYPE
=
MediaType
.
parse
(
"application/json; charset=UTF-8"
);
private
final
Charset
UTF_8
=
StandardCharsets
.
UTF_8
;
private
final
Gson
gson
;
private
final
Type
type
;
GsonRequestBodyConverter
(
Gson
gson
,
Type
type
)
{
this
.
gson
=
gson
;
this
.
type
=
type
;
}
@Override
public
RequestBody
convert
(
T
value
)
throws
IOException
{
Buffer
buffer
=
new
Buffer
();
Writer
writer
=
new
OutputStreamWriter
(
buffer
.
outputStream
(),
UTF_8
);
gson
.
toJson
(
value
,
type
,
writer
);
writer
.
flush
();
return
RequestBody
.
create
(
MEDIA_TYPE
,
buffer
.
readByteString
());
}
}
}
library_base/src/main/java/com/fry/base/basenetwork/HttpResponseListenerImpl.java
deleted
100644 → 0
View file @
a85abb1e
package
com
.
fry
.
base
.
basenetwork
;
import
java.lang.ref.WeakReference
;
import
io.reactivex.disposables.Disposable
;
import
me.goldze.mvvmhabit._enum.ViewStatus
;
import
me.goldze.mvvmhabit.base.BaseViewModel
;
import
me.goldze.mvvmhabit.http.BaseResponse
;
import
me.goldze.mvvmhabit.http.ExceptionHandle
;
import
me.goldze.mvvmhabit.http.ResponseThrowable
;
import
me.goldze.mvvmhabit.utils.ToastUtils
;
import
retrofit2.Response
;
/**
* Created by jeme on 2019/1/31
*/
public
abstract
class
HttpResponseListenerImpl
<
T
extends
BaseResponse
>
implements
IHttpResponseListener
<
T
>{
private
WeakReference
<
BaseViewModel
>
viewModel
;
private
boolean
needToast
=
true
;
protected
boolean
isLoading
=
false
;
public
HttpResponseListenerImpl
(
BaseViewModel
viewModel
)
{
this
.
viewModel
=
new
WeakReference
<>(
viewModel
);
}
public
HttpResponseListenerImpl
(
BaseViewModel
viewModel
,
boolean
needToast
)
{
this
.
viewModel
=
new
WeakReference
<>(
viewModel
);
this
.
needToast
=
needToast
;
}
public
HttpResponseListenerImpl
()
{
}
@Override
public
void
onStart
(
Disposable
disposable
)
{
if
(!
isLoading
){
if
(
viewModel
!=
null
&&
viewModel
.
get
()
!=
null
){
viewModel
.
get
().
showDialog
();
}
isLoading
=
true
;
}
else
{
disposable
.
dispose
();
}
}
@Override
public
boolean
onParseResponse
(
Response
<
T
>
response
)
{
return
false
;
}
public
boolean
isEmpty
(
T
response
){
return
false
;
}
@Override
public
void
onBusinessFail
(
T
response
)
{
/* if(isEmpty(response)){
viewModel.get().viewSwitch(ViewStatus.NODATA);
}*/
if
(
response
==
null
){
viewModel
.
get
().
viewSwitch
(
ViewStatus
.
NODATA
);
return
;
}
if
(
needToast
)
{
ToastUtils
.
showShort
(
response
.
getMessage
());
}
}
@Override
public
void
onFailed
(
ResponseThrowable
throwable
)
{
isLoading
=
false
;
if
(
throwable
==
null
){
return
;
}
if
(
needToast
)
{
ToastUtils
.
showShort
(
throwable
.
message
);
}
if
(
throwable
.
code
==
ExceptionHandle
.
ERROR
.
HTTP_ERROR
||
throwable
.
code
==
ExceptionHandle
.
ERROR
.
NETWORD_ERROR
||
throwable
.
code
==
ExceptionHandle
.
ERROR
.
TIMEOUT_ERROR
){
if
(
viewModel
!=
null
&&
viewModel
.
get
()
!=
null
){
viewModel
.
get
().
viewSwitch
(
ViewStatus
.
NONETWORK
);
}
}
}
@Override
public
void
onCompleted
()
{
isLoading
=
false
;
if
(
viewModel
!=
null
&&
viewModel
.
get
()
!=
null
){
viewModel
.
get
().
dismissDialog
();
}
}
}
library_base/src/main/java/com/fry/base/basenetwork/HttpsUtil.java
deleted
100644 → 0
View file @
a85abb1e
package
com
.
fry
.
base
.
basenetwork
;
import
java.security.SecureRandom
;
import
java.security.cert.X509Certificate
;
import
javax.net.ssl.HostnameVerifier
;
import
javax.net.ssl.SSLContext
;
import
javax.net.ssl.SSLSession
;
import
javax.net.ssl.SSLSocketFactory
;
import
javax.net.ssl.TrustManager
;
import
javax.net.ssl.X509TrustManager
;
/**
* Created by ωǒ、〃尐川.η on 2018/8/20.
*/
public
class
HttpsUtil
{
//获取这个SSLSocketFactory
public
static
SSLSocketFactory
getSSLSocketFactory
()
{
try
{
SSLContext
sslContext
=
SSLContext
.
getInstance
(
"SSL"
);
sslContext
.
init
(
null
,
getTrustManager
(),
new
SecureRandom
());
return
sslContext
.
getSocketFactory
();
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
}
//获取TrustManager
private
static
TrustManager
[]
getTrustManager
()
{
TrustManager
[]
trustAllCerts
=
new
TrustManager
[]{
new
X509TrustManager
()
{
@Override
public
void
checkClientTrusted
(
X509Certificate
[]
chain
,
String
authType
)
{
}
@Override
public
void
checkServerTrusted
(
X509Certificate
[]
chain
,
String
authType
)
{
}
@Override
public
X509Certificate
[]
getAcceptedIssuers
()
{
return
new
X509Certificate
[]{};
}
}
};
return
trustAllCerts
;
}
//获取HostnameVerifier
public
static
HostnameVerifier
getHostnameVerifier
()
{
HostnameVerifier
hostnameVerifier
=
new
HostnameVerifier
()
{
@Override
public
boolean
verify
(
String
s
,
SSLSession
sslSession
)
{
return
true
;
}
};
return
hostnameVerifier
;
}
}
library_base/src/main/java/com/fry/base/basenetwork/RetrofitClient.java
View file @
f6088882
...
...
@@ -25,7 +25,6 @@ import okhttp3.OkHttpClient;
import
okhttp3.internal.platform.Platform
;
import
retrofit2.Retrofit
;
import
retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
;
import
retrofit2.converter.gson.GsonConverterFactory
;
/**
* Created by jeme on 2019/1/31
...
...
@@ -45,7 +44,6 @@ public class RetrofitClient {
throw
new
RuntimeException
(
"baseUrl 不能为空"
);
}
SslHttpsUtils
.
SSLParams
sslParams
=
SslHttpsUtils
.
getSslSocketFactory
();
OkHttpClient
.
Builder
clientBuilder
=
new
OkHttpClient
.
Builder
()
.
cookieJar
(
new
CookieJarImpl
(
new
PersistentCookieStore
(
mContext
)))
// .cache(cache)
...
...
library_base/src/main/java/com/fry/base/basenetwork/SslHttpsUtils.java
deleted
100644 → 0
View file @
a85abb1e
package
com
.
fry
.
base
.
basenetwork
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.security.KeyManagementException
;
import
java.security.KeyStore
;
import
java.security.NoSuchAlgorithmException
;
import
java.security.cert.Certificate
;
import
java.security.cert.CertificateException
;
import
java.security.cert.CertificateFactory
;
import
java.security.cert.X509Certificate
;
import
javax.net.ssl.HostnameVerifier
;
import
javax.net.ssl.KeyManager
;
import
javax.net.ssl.KeyManagerFactory
;
import
javax.net.ssl.SSLContext
;
import
javax.net.ssl.SSLSession
;
import
javax.net.ssl.SSLSocketFactory
;
import
javax.net.ssl.TrustManager
;
import
javax.net.ssl.TrustManagerFactory
;
import
javax.net.ssl.X509TrustManager
;
/**
* Created by jeme on 2019/1/31
*/
public
class
SslHttpsUtils
{
public
static
class
SSLParams
{
public
SSLSocketFactory
sSLSocketFactory
;
public
X509TrustManager
trustManager
;
}
public
static
SSLParams
getSslSocketFactory
()
{
return
getSslSocketFactoryBase
(
null
,
null
,
null
);
}
/**
* https单向认证
* 可以额外配置信任服务端的证书策略,否则默认是按CA证书去验证的,若不是CA可信任的证书,则无法通过验证
*/
public
static
SSLParams
getSslSocketFactory
(
X509TrustManager
trustManager
)
{
return
getSslSocketFactoryBase
(
trustManager
,
null
,
null
);
}
/**
* https单向认证
* 用含有服务端公钥的证书校验服务端证书
*/
public
static
SSLParams
getSslSocketFactory
(
InputStream
...
certificates
)
{
return
getSslSocketFactoryBase
(
null
,
null
,
null
,
certificates
);
}
/**
* https双向认证
* bksFile 和 password -> 客户端使用bks证书校验服务端证书
* certificates -> 用含有服务端公钥的证书校验服务端证书
*/
public
static
SSLParams
getSslSocketFactory
(
InputStream
bksFile
,
String
password
,
InputStream
...
certificates
)
{
return
getSslSocketFactoryBase
(
null
,
bksFile
,
password
,
certificates
);
}
/**
* https双向认证
* bksFile 和 password -> 客户端使用bks证书校验服务端证书
* X509TrustManager -> 如果需要自己校验,那么可以自己实现相关校验,如果不需要自己校验,那么传null即可
*/
public
static
SSLParams
getSslSocketFactory
(
InputStream
bksFile
,
String
password
,
X509TrustManager
trustManager
)
{
return
getSslSocketFactoryBase
(
trustManager
,
bksFile
,
password
);
}
private
static
SSLParams
getSslSocketFactoryBase
(
X509TrustManager
trustManager
,
InputStream
bksFile
,
String
password
,
InputStream
...
certificates
)
{
SSLParams
sslParams
=
new
SSLParams
();
try
{
KeyManager
[]
keyManagers
=
prepareKeyManager
(
bksFile
,
password
);
TrustManager
[]
trustManagers
=
prepareTrustManager
(
certificates
);
X509TrustManager
manager
;
if
(
trustManager
!=
null
)
{
//优先使用用户自定义的TrustManager
manager
=
trustManager
;
}
else
if
(
trustManagers
!=
null
)
{
//然后使用默认的TrustManager
manager
=
chooseTrustManager
(
trustManagers
);
}
else
{
//否则使用不安全的TrustManager
manager
=
UnSafeTrustManager
;
}
// 创建TLS类型的SSLContext对象, that uses our TrustManager
SSLContext
sslContext
=
SSLContext
.
getInstance
(
"TLS"
);
// 用上面得到的trustManagers初始化SSLContext,这样sslContext就会信任keyStore中的证书
// 第一个参数是授权的密钥管理器,用来授权验证,比如授权自签名的证书验证。第二个是被授权的证书管理器,用来验证服务器端的证书
sslContext
.
init
(
keyManagers
,
new
TrustManager
[]{
manager
},
null
);
// 通过sslContext获取SSLSocketFactory对象
sslParams
.
sSLSocketFactory
=
sslContext
.
getSocketFactory
();
sslParams
.
trustManager
=
manager
;
return
sslParams
;
}
catch
(
NoSuchAlgorithmException
e
)
{
throw
new
AssertionError
(
e
);
}
catch
(
KeyManagementException
e
)
{
throw
new
AssertionError
(
e
);
}
}
private
static
KeyManager
[]
prepareKeyManager
(
InputStream
bksFile
,
String
password
)
{
try
{
if
(
bksFile
==
null
||
password
==
null
)
return
null
;
KeyStore
clientKeyStore
=
KeyStore
.
getInstance
(
"BKS"
);
clientKeyStore
.
load
(
bksFile
,
password
.
toCharArray
());
KeyManagerFactory
kmf
=
KeyManagerFactory
.
getInstance
(
KeyManagerFactory
.
getDefaultAlgorithm
());
kmf
.
init
(
clientKeyStore
,
password
.
toCharArray
());
return
kmf
.
getKeyManagers
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
private
static
TrustManager
[]
prepareTrustManager
(
InputStream
...
certificates
)
{
if
(
certificates
==
null
||
certificates
.
length
<=
0
)
return
null
;
try
{
CertificateFactory
certificateFactory
=
CertificateFactory
.
getInstance
(
"X.509"
);
// 创建一个默认类型的KeyStore,存储我们信任的证书
KeyStore
keyStore
=
KeyStore
.
getInstance
(
KeyStore
.
getDefaultType
());
keyStore
.
load
(
null
);
int
index
=
0
;
for
(
InputStream
certStream
:
certificates
)
{
String
certificateAlias
=
Integer
.
toString
(
index
++);
// 证书工厂根据证书文件的流生成证书 cert
Certificate
cert
=
certificateFactory
.
generateCertificate
(
certStream
);
// 将 cert 作为可信证书放入到keyStore中
keyStore
.
setCertificateEntry
(
certificateAlias
,
cert
);
try
{
if
(
certStream
!=
null
)
certStream
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
//我们创建一个默认类型的TrustManagerFactory
TrustManagerFactory
tmf
=
TrustManagerFactory
.
getInstance
(
TrustManagerFactory
.
getDefaultAlgorithm
());
//用我们之前的keyStore实例初始化TrustManagerFactory,这样tmf就会信任keyStore中的证书
tmf
.
init
(
keyStore
);
//通过tmf获取TrustManager数组,TrustManager也会信任keyStore中的证书
return
tmf
.
getTrustManagers
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
private
static
X509TrustManager
chooseTrustManager
(
TrustManager
[]
trustManagers
)
{
for
(
TrustManager
trustManager
:
trustManagers
)
{
if
(
trustManager
instanceof
X509TrustManager
)
{
return
(
X509TrustManager
)
trustManager
;
}
}
return
null
;
}
/**
* 为了解决客户端不信任服务器数字证书的问题,网络上大部分的解决方案都是让客户端不对证书做任何检查,
* 这是一种有很大安全漏洞的办法
*/
public
static
X509TrustManager
UnSafeTrustManager
=
new
X509TrustManager
()
{
@Override
public
void
checkClientTrusted
(
X509Certificate
[]
chain
,
String
authType
)
throws
CertificateException
{
}
@Override
public
void
checkServerTrusted
(
X509Certificate
[]
chain
,
String
authType
)
throws
CertificateException
{
}
@Override
public
X509Certificate
[]
getAcceptedIssuers
()
{
return
new
X509Certificate
[]{};
}
};
/**
* 此类是用于主机名验证的基接口。 在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,
* 则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。策略可以是基于证书的或依赖于其他验证方案。
* 当验证 URL 主机名使用的默认规则失败时使用这些回调。如果主机名是可接受的,则返回 true
*/
public
static
HostnameVerifier
UnSafeHostnameVerifier
=
new
HostnameVerifier
()
{
@Override
public
boolean
verify
(
String
hostname
,
SSLSession
session
)
{
return
true
;
}
};
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment