Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
YDL-Component-Medical
Overview
Overview
Details
Activity
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
杨凯
YDL-Component-Medical
Commits
cfab77e2
Commit
cfab77e2
authored
Nov 28, 2019
by
徐健
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/dev' into feature/test_home_pager
# Conflicts: # config.gradle
parents
1717b7cf
b1b6a6a5
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
394 additions
and
165 deletions
+394
-165
MainActivity.kt
app/src/main/java/com/ydl/component/MainActivity.kt
+1
-2
config.gradle
config.gradle
+17
-17
ExpertSearchActivity.kt
m-consultant/src/main/java/com/yidianling/consultant/ExpertSearchActivity.kt
+3
-3
ExpertSearchAdapter.kt
m-consultant/src/main/java/com/yidianling/consultant/adapter/ExpertSearchAdapter.kt
+1
-1
ConsultAssistantDialogUtils.kt
m-consultant/src/main/java/com/yidianling/consultant/modular/singlton/ConsultAssistantDialogUtils.kt
+105
-41
FlutterCourseHomeFragment.kt
m-course/src/main/java/com/yidianling/course/FlutterCourseHomeFragment.kt
+1
-1
CourseListContainerActivity.kt
m-course/src/main/java/com/yidianling/course/courseNew/courseList/CourseListContainerActivity.kt
+8
-8
MuseActivity.kt
m-muse/src/main/java/com/yidianling/muse/activity/MuseActivity.kt
+1
-1
OkHttpConfig.java
ydl-net/src/main/java/com/ydl/ydlnet/builder/config/OkHttpConfig.java
+15
-7
RequestHandler.java
ydl-net/src/main/java/com/ydl/ydlnet/builder/interceptor/log/RequestHandler.java
+30
-0
RequestLogInterceptor.java
ydl-net/src/main/java/com/ydl/ydlnet/builder/interceptor/log/RequestLogInterceptor.java
+35
-17
build.gradle
ydl-platform/build.gradle
+2
-1
GlobalConfig.kt
ydl-platform/src/main/java/com/ydl/ydlcommon/base/config/GlobalConfig.kt
+1
-0
HttpConfig.kt
ydl-platform/src/main/java/com/ydl/ydlcommon/base/config/HttpConfig.kt
+129
-61
AuthBean.kt
ydl-platform/src/main/java/com/ydl/ydlcommon/bean/AuthBean.kt
+20
-0
ApiRequestUtil.java
ydl-platform/src/main/java/com/ydl/ydlcommon/data/http/api/ApiRequestUtil.java
+12
-2
NetApiStore.java
ydl-platform/src/main/java/com/ydl/ydlcommon/data/http/api/NetApiStore.java
+13
-3
No files found.
app/src/main/java/com/ydl/component/MainActivity.kt
View file @
cfab77e2
...
...
@@ -13,7 +13,6 @@ import android.util.Log
import
com.alibaba.android.arouter.launcher.ARouter
import
com.tbruyelle.rxpermissions2.RxPermissions
import
com.umeng.analytics.MobclickAgent
import
com.umeng.commonsdk.framework.UMModuleRegister.getAppContext
import
com.ydl.audioim.YDLavManager
import
com.ydl.component.music.MusicPlayActivity
import
com.ydl.component.mvp.DemoContract
...
...
@@ -137,7 +136,7 @@ class MainActivity : BaseLceActivity<DemoContract.View, DemoContract.Presenter>(
override
fun
reLoadData
()
{
mPresenter
?.
loadUsers
()
mPresenter
.
loadHome
()
}
...
...
config.gradle
View file @
cfab77e2
...
...
@@ -43,14 +43,14 @@ ext {
// -------------- 业务模块 --------------
//第三步 若干
"m-confide"
:
"0.0.2
8
"
,
"m-consultant"
:
"0.0.
39
"
,
"m-fm"
:
"0.0.2
0
"
,
"m-user"
:
"0.0.3
3
"
,
"m-confide"
:
"0.0.2
9
"
,
"m-consultant"
:
"0.0.
44
"
,
"m-fm"
:
"0.0.2
1
"
,
"m-user"
:
"0.0.3
4
"
,
// 接入flutter的模块
"m-tests"
:
"0.0.1
1.10
"
,
"m-muse"
:
"0.0.1
7.10
"
,
"m-course"
:
"0.0.
28.1
0"
,
"m-tests"
:
"0.0.1
2
"
,
"m-muse"
:
"0.0.1
9
"
,
"m-course"
:
"0.0.
3
0"
,
//-------------- 业务模块 API 层 --------------
"m-audioim-api"
:
"0.0.5"
,
...
...
@@ -64,13 +64,13 @@ ext {
//-------------- 功能组件 --------------
//第一步
"ydl-platform"
:
"0.0.2
6
"
,
"ydl-platform"
:
"0.0.2
7
"
,
//第二步 若干
"ydl-webview"
:
"0.0.2
7
"
,
"ydl-media"
:
"0.0.1
3
"
,
"ydl-pay"
:
"0.0.1
0
"
,
"m-audioim"
:
"0.0.2
8
"
,
"ydl-webview"
:
"0.0.2
8
"
,
"ydl-media"
:
"0.0.1
4
"
,
"ydl-pay"
:
"0.0.1
1
"
,
"m-audioim"
:
"0.0.2
9
"
,
//以下 几乎不会动
"router"
:
"0.0.1"
,
...
...
@@ -104,13 +104,13 @@ ext {
//-------------- 功能组件 --------------
//第一步
"ydl-platform"
:
"0.0.2
6
"
,
"ydl-platform"
:
"0.0.2
7
"
,
//第二步 若干
"ydl-webview"
:
"0.0.2
7
"
,
"ydl-media"
:
"0.0.1
3
"
,
"ydl-pay"
:
"0.0.1
0
"
,
"m-audioim"
:
"0.0.2
8
"
,
"ydl-webview"
:
"0.0.2
8
"
,
"ydl-media"
:
"0.0.1
4
"
,
"ydl-pay"
:
"0.0.1
1
"
,
"m-audioim"
:
"0.0.2
9
"
,
//以下 几乎不会动
...
...
m-consultant/src/main/java/com/yidianling/consultant/ExpertSearchActivity.kt
View file @
cfab77e2
...
...
@@ -312,7 +312,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
image_scroll_top
.
setOnClickListener
(
this
)
// initStatus()
ConsultAssistantDialogUtils
.
INSTANCE
.
fitRequest
(
this
,
"doctor_list"
)
ConsultAssistantDialogUtils
.
INSTANCE
.
fitRequest
(
this
,
"doctor_list"
,
true
)
}
private
fun
initNetLossView
()
{
...
...
@@ -999,7 +999,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
}
else
{
updateFilterTextViewStatus
(
tvFilter
,
FILTER_STATUS_NORMAL
)
}
ConsultAssistantDialogUtils
.
INSTANCE
.
fitRequest
(
this
,
"doctor_list"
)
ConsultAssistantDialogUtils
.
INSTANCE
.
fitRequest
(
this
,
"doctor_list"
,
true
)
}
filterPopupWindow
.
isClippingEnabled
=
false
filterPopupWindow
.
showAtLocation
(
viewSep2
.
rootView
,
Gravity
.
TOP
+
Gravity
.
RIGHT
,
0
,
0
)
...
...
@@ -1478,6 +1478,6 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
override
fun
onDestroy
()
{
super
.
onDestroy
()
ConsultAssistantDialogUtils
.
INSTANCE
.
r
esetStatus
()
ConsultAssistantDialogUtils
.
INSTANCE
.
expertSearchR
esetStatus
()
}
}
m-consultant/src/main/java/com/yidianling/consultant/adapter/ExpertSearchAdapter.kt
View file @
cfab77e2
...
...
@@ -208,7 +208,7 @@ class ExpertSearchAdapter(private val context: Context, private val expertSearch
//私聊文案
if
(
TextUtils
.
isEmpty
(
itemBean
.
chatBtnText
)){
holder
.
tvChat
.
text
=
"私聊"
holder
.
tvChat
.
setTextColor
(
ContextCompat
.
getColor
(
context
,
R
.
color
.
white
))
holder
.
tvChat
.
setTextColor
(
ContextCompat
.
getColor
(
context
,
R
.
color
.
consultant_confirm_text_color
))
holder
.
tvChat
.
background
=
ContextCompat
.
getDrawable
(
context
,
R
.
drawable
.
consultant_expert_search_chat
)
}
else
{
holder
.
tvChat
.
text
=
itemBean
.
chatBtnText
...
...
m-consultant/src/main/java/com/yidianling/consultant/modular/singlton/ConsultAssistantDialogUtils.kt
View file @
cfab77e2
...
...
@@ -2,6 +2,7 @@ package com.yidianling.consultant.modular.singlton
import
android.app.Activity
import
android.support.v7.app.AppCompatActivity
import
com.ydl.ydlcommon.utils.YdlBuryPointUtil
import
com.yidianling.common.tools.ToastUtil
import
com.yidianling.consultant.dialog.ConsultAssistantDialog
import
com.yidianling.consultant.model.SearchApi
...
...
@@ -21,16 +22,19 @@ class ConsultAssistantDialogUtils private constructor() {
}
var
consultAssistantDialogFromHomePage
:
ConsultAssistantDialog
?
=
null
// 首页展示的dialog
var
consultAssistantDialog
:
ConsultAssistantDialog
?
=
null
//咨询师列表页面展示的dialog
var
expertSearchPageHasShown
:
Boolean
=
false
// 专家咨询列表页面是否已经展示
var
consultAssistantFragmentDialog
:
ConsultAssistantDialog
?
=
null
//咨询师列表fragment页面展示的dialog
var
expertSearchPageHasShown
:
Boolean
=
false
// 专家咨询列表fragment页面是否已经展示
var
consultAssistantActivityDialog
:
ConsultAssistantDialog
?
=
null
//咨询师列表activity页面展示的dialog
var
expertSearchActivityPageHasShown
:
Boolean
=
false
// 专家咨询列表activity页面是否已经展示
var
timer
:
Timer
?
=
null
/**
*判断是否符合代码展示逻辑
* origin 展示请求来源 首页 home_index 咨询列表 doctor_list
* fromActivity 默认不是来自于咨询师列表activity
*/
fun
fitRequest
(
activity
:
Activity
,
origin
:
String
)
{
fun
fitRequest
(
activity
:
Activity
,
origin
:
String
,
fromActivity
:
Boolean
=
false
)
{
when
(
origin
)
{
"home_index"
->
{
if
(
ConsultantIn
.
isLogin
()
&&
...
...
@@ -40,7 +44,9 @@ class ConsultAssistantDialogUtils private constructor() {
}
}
"doctor_list"
->
{
shouldShowDialog
(
activity
,
origin
)
if
(!
ConsultantIn
.
isLogin
()
||
(
ConsultantIn
.
getUserImpl
().
getUserInfo
()
?.
user_type
==
1
&&
ConsultantIn
.
isLogin
()))
{
shouldShowDialog
(
activity
,
origin
,
fromActivity
=
fromActivity
)
}
}
}
...
...
@@ -49,7 +55,7 @@ class ConsultAssistantDialogUtils private constructor() {
/**
* 判断是否符合接口展示逻辑
*/
private
fun
shouldShowDialog
(
activity
:
Activity
,
origin
:
String
,
isDelay
:
Boolean
=
false
)
{
private
fun
shouldShowDialog
(
activity
:
Activity
,
origin
:
String
,
isDelay
:
Boolean
=
false
,
fromActivity
:
Boolean
=
false
)
{
// 请求接口判断导医咨询助理按钮是否展示
SearchApi
.
getSearchApi
().
getConsultAssistantRequest
(
origin
)
.
subscribeOn
(
Schedulers
.
io
())
...
...
@@ -59,7 +65,7 @@ class ConsultAssistantDialogUtils private constructor() {
if
(
origin
==
"home_index"
)
{
showFromYdlHome
(
activity
)
}
else
if
(
origin
==
"doctor_list"
)
{
show
(
activity
)
show
(
activity
,
fromActivity
)
}
}
}
...
...
@@ -78,6 +84,7 @@ class ConsultAssistantDialogUtils private constructor() {
object
:
ConsultAssistantDialog
.
OnConsultAssistantClickListener
{
override
fun
onClickAction
()
{
//获取用户uid
YdlBuryPointUtil
.
sendClick
(
"home_page_assistant_click"
)
getConsultAssistantUid
(
activity
)
}
...
...
@@ -100,46 +107,87 @@ class ConsultAssistantDialogUtils private constructor() {
/**
* 咨询师列表页展示
*/
fun
show
(
activity
:
Activity
)
{
if
(!
expertSearchPageHasShown
&&
timer
==
null
)
{
timer
=
Timer
()
timer
!!
.
schedule
(
object
:
TimerTask
()
{
override
fun
run
()
{
Observable
.
just
(
1
).
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
{
expertSearchPageHasShown
=
true
showDialog
(
activity
)
}
}
},
5000
)
}
else
{
showDialog
(
activity
)
fun
show
(
activity
:
Activity
,
fromActivity
:
Boolean
=
false
)
{
// 来自于fragment咨询师列表
if
(!
fromActivity
)
{
if
(!
expertSearchPageHasShown
&&
timer
==
null
)
{
timer
=
Timer
()
timer
!!
.
schedule
(
object
:
TimerTask
()
{
override
fun
run
()
{
Observable
.
just
(
1
).
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
{
expertSearchPageHasShown
=
true
showDialog
(
activity
)
}
}
},
5000
)
}
else
{
showDialog
(
activity
)
}
}
else
{
// 来自于activity咨询师列表
if
(!
expertSearchActivityPageHasShown
&&
timer
==
null
)
{
timer
=
Timer
()
timer
!!
.
schedule
(
object
:
TimerTask
()
{
override
fun
run
()
{
Observable
.
just
(
1
).
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
{
expertSearchActivityPageHasShown
=
true
showDialog
(
activity
,
true
)
}
}
},
5000
)
}
else
{
showDialog
(
activity
,
true
)
}
}
}
/**
* 咨询师列表页展示浮层
*/
fun
showDialog
(
activity
:
Activity
)
{
if
(!
activity
.
isFinishing
)
{
if
(
consultAssistantDialog
==
null
)
{
consultAssistantDialog
=
ConsultAssistantDialog
(
activity
,
object
:
ConsultAssistantDialog
.
OnConsultAssistantClickListener
{
override
fun
onClickAction
()
{
// 咨询师列表页面且未登录情况下,跳转登录页面
if
(!
ConsultantIn
.
isLogin
())
{
ConsultantIn
.
toLogin
(
activity
)
}
else
{
//获取用户uid
getConsultAssistantUid
(
activity
)
fun
showDialog
(
activity
:
Activity
,
fromActivity
:
Boolean
=
false
)
{
if
(!
fromActivity
)
{
if
(!
activity
.
isFinishing
)
{
if
(
consultAssistantFragmentDialog
==
null
)
{
consultAssistantFragmentDialog
=
ConsultAssistantDialog
(
activity
,
object
:
ConsultAssistantDialog
.
OnConsultAssistantClickListener
{
override
fun
onClickAction
()
{
YdlBuryPointUtil
.
sendClick
(
"assistant_list_click"
)
// 咨询师列表页面且未登录情况下,跳转登录页面
if
(!
ConsultantIn
.
isLogin
())
{
ConsultantIn
.
toLogin
(
activity
)
}
else
{
//获取用户uid
getConsultAssistantUid
(
activity
)
}
}
}
})
})
}
consultAssistantFragmentDialog
?.
show
()
}
}
else
{
if
(!
activity
.
isFinishing
)
{
if
(
consultAssistantActivityDialog
==
null
)
{
consultAssistantActivityDialog
=
ConsultAssistantDialog
(
activity
,
object
:
ConsultAssistantDialog
.
OnConsultAssistantClickListener
{
override
fun
onClickAction
()
{
YdlBuryPointUtil
.
sendClick
(
"assistant_list_click"
)
// 咨询师列表页面且未登录情况下,跳转登录页面
if
(!
ConsultantIn
.
isLogin
())
{
ConsultantIn
.
toLogin
(
activity
)
}
else
{
//获取用户uid
getConsultAssistantUid
(
activity
)
}
}
})
}
consultAssistantActivityDialog
?.
show
()
}
consultAssistantDialog
?.
show
()
}
}
...
...
@@ -148,20 +196,36 @@ class ConsultAssistantDialogUtils private constructor() {
* 咨询师列表页隐藏
*/
fun
hide
()
{
consultAssistantDialog
?.
hide
()
consultAssistant
Fragment
Dialog
?.
hide
()
}
/**
* 咨询师列表页面使用的重置本单例关于专家咨询列表页面得状态
* 释放本单例所有资源(咨询师列表fragmnet在MainActivity,
* 且在MainActivity销毁的时候,会先执行咨询师列表fragmnet
* 的ondeatroy,所以这边直接在该专家咨询列表碎片执行该方法)
*/
fun
resetStatus
()
{
consultAssistantDialogFromHomePage
?.
dismiss
()
consultAssistantDialog
?.
dismiss
()
consultAssistantFragmentDialog
?.
dismiss
()
consultAssistantActivityDialog
?.
dismiss
()
timer
?.
cancel
()
timer
=
null
expertSearchPageHasShown
=
false
expertSearchActivityPageHasShown
=
false
consultAssistantDialogFromHomePage
=
null
consultAssistantDialog
=
null
consultAssistantFragmentDialog
=
null
consultAssistantActivityDialog
=
null
}
/**
* 咨询师列表activity页面使用的重置本单例关于专家咨询列表页面得状态
*/
fun
expertSearchResetStatus
()
{
consultAssistantActivityDialog
?.
dismiss
()
timer
?.
cancel
()
timer
=
null
expertSearchActivityPageHasShown
=
false
consultAssistantActivityDialog
=
null
}
////////////////////////////////////// 咨询师列表页面的展示隐藏逻辑 代码块end ///////////////////////////////////////////////////
...
...
m-course/src/main/java/com/yidianling/course/FlutterCourseHomeFragment.kt
View file @
cfab77e2
...
...
@@ -49,7 +49,7 @@ class FlutterCourseHomeFragment : BaseFlutterFragment() {
}
override
fun
initialRoute
():
String
{
return
"
native/
course/home"
return
"course/home"
}
override
fun
setUserVisibleHint
(
isVisibleToUser
:
Boolean
)
{
...
...
m-course/src/main/java/com/yidianling/course/courseNew/courseList/CourseListContainerActivity.kt
View file @
cfab77e2
...
...
@@ -139,7 +139,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
}
else
{
...
...
@@ -233,7 +233,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
}
else
{
...
...
@@ -330,7 +330,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
}
else
{
...
...
@@ -352,7 +352,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
classify_layout
.
setCompoundDrawablesWithIntrinsicBounds
(
...
...
@@ -399,7 +399,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
}
else
{
...
...
@@ -421,7 +421,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
filter_layout
.
setCompoundDrawablesWithIntrinsicBounds
(
...
...
@@ -642,7 +642,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
}
else
{
...
...
@@ -689,7 +689,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout
.
setTextColor
(
ContextCompat
.
getColor
(
this
@CourseListContainerActivity
,
R
.
color
.
course_color_1DA1F2
R
.
color
.
main_theme
)
)
}
else
{
...
...
m-muse/src/main/java/com/yidianling/muse/activity/MuseActivity.kt
View file @
cfab77e2
...
...
@@ -15,7 +15,7 @@ import org.json.JSONObject
@Route
(
path
=
"/module/muse"
)
class
MuseActivity
:
BaseFlutterActivity
()
{
override
fun
initialRoute
():
String
{
return
"
native/
muse/home"
return
"muse/home"
}
override
fun
initChannelPlugin
(
jsonObject
:
JSONObject
)
{
...
...
ydl-net/src/main/java/com/ydl/ydlnet/builder/config/OkHttpConfig.java
View file @
cfab77e2
...
...
@@ -2,6 +2,7 @@ package com.ydl.ydlnet.builder.config;
import
android.content.Context
;
import
android.text.TextUtils
;
import
com.ydl.ydlnet.builder.cookie.CookieJarImpl
;
import
com.ydl.ydlnet.builder.cookie.store.CookieStore
;
import
com.ydl.ydlnet.builder.factory.ApiFactory
;
...
...
@@ -9,19 +10,22 @@ import com.ydl.ydlnet.builder.http.SSLUtils;
import
com.ydl.ydlnet.builder.interceptor.HeaderInterceptor
;
import
com.ydl.ydlnet.builder.interceptor.NetCacheInterceptor
;
import
com.ydl.ydlnet.builder.interceptor.NoNetCacheInterceptor
;
import
com.ydl.ydlnet.builder.interceptor.log.RequestHandler
;
import
com.ydl.ydlnet.builder.interceptor.log.RequestLogInterceptor
;
import
com.ydl.ydlnet.builder.manage.HttpUrlManager
;
import
com.ydl.ydlnet.client.interfaces.BuildHeadersListener
;
import
okhttp3.Cache
;
import
okhttp3.Interceptor
;
import
okhttp3.OkHttpClient
;
import
javax.net.ssl.HostnameVerifier
;
import
java.io.File
;
import
java.io.InputStream
;
import
java.util.Map
;
import
java.util.concurrent.TimeUnit
;
import
javax.net.ssl.HostnameVerifier
;
import
okhttp3.Cache
;
import
okhttp3.Interceptor
;
import
okhttp3.OkHttpClient
;
/**
* Created by haorui on 2019-09-02 .
* Des: 统一OkHttp配置信息
...
...
@@ -80,6 +84,7 @@ public class OkHttpConfig {
private
InputStream
bksFile
;
private
String
password
;
private
InputStream
[]
certificates
;
private
RequestHandler
requestHandler
;
private
Interceptor
[]
interceptors
;
private
Interceptor
[]
netInterceptors
;
private
BuildHeadersListener
buildHeadersListener
;
...
...
@@ -99,6 +104,11 @@ public class OkHttpConfig {
return
this
;
}
public
Builder
setRequestHandler
(
RequestHandler
requestHandler
)
{
this
.
requestHandler
=
requestHandler
;
return
this
;
}
public
Builder
setCache
(
boolean
isCache
)
{
this
.
isCache
=
isCache
;
return
this
;
...
...
@@ -210,9 +220,7 @@ public class OkHttpConfig {
* 配置开发环境
*/
private
void
setDebugConfig
()
{
if
(
isDebug
)
{
okHttpClientBuilder
.
addInterceptor
(
new
RequestLogInterceptor
());
}
okHttpClientBuilder
.
addInterceptor
(
new
RequestLogInterceptor
(
isDebug
,
requestHandler
));
}
...
...
ydl-net/src/main/java/com/ydl/ydlnet/builder/interceptor/log/RequestHandler.java
0 → 100644
View file @
cfab77e2
package
com
.
ydl
.
ydlnet
.
builder
.
interceptor
.
log
;
import
okhttp3.Interceptor
;
import
okhttp3.Request
;
import
okhttp3.Response
;
/**
* Created by haorui on 2019-11-26 .
* Des:
*/
public
interface
RequestHandler
{
Response
onHttpResultResponse
(
String
httpResult
,
Interceptor
.
Chain
chain
,
Response
response
);
Request
onHttpRequestBefore
(
Interceptor
.
Chain
chain
,
Request
request
);
RequestHandler
EMPTY
=
new
RequestHandler
()
{
@Override
public
Response
onHttpResultResponse
(
String
httpResult
,
Interceptor
.
Chain
chain
,
Response
response
)
{
//不管是否处理,都必须将response返回出去
return
response
;
}
@Override
public
Request
onHttpRequestBefore
(
Interceptor
.
Chain
chain
,
Request
request
)
{
//不管是否处理,都必须将request返回出去
return
request
;
}
};
}
ydl-net/src/main/java/com/ydl/ydlnet/builder/interceptor/log/RequestLogInterceptor.java
View file @
cfab77e2
package
com
.
ydl
.
ydlnet
.
builder
.
interceptor
.
log
;
import
android.support.annotation.Nullable
;
import
com.ydl.ydlnet.utils.CharacterHandler
;
import
com.ydl.ydlnet.utils.NetLogUtils
;
import
com.ydl.ydlnet.utils.UrlEncoderUtils
;
import
com.ydl.ydlnet.utils.ZipHelper
;
import
okhttp3.*
;
import
okio.Buffer
;
import
okio.BufferedSource
;
import
java.io.IOException
;
import
java.io.UnsupportedEncodingException
;
...
...
@@ -15,14 +13,27 @@ import java.net.URLDecoder;
import
java.nio.charset.Charset
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
import
okhttp3.Interceptor
;
import
okhttp3.MediaType
;
import
okhttp3.Request
;
import
okhttp3.RequestBody
;
import
okhttp3.Response
;
import
okhttp3.ResponseBody
;
import
okio.Buffer
;
import
okio.BufferedSource
;
/**
* Created by haorui on 2019-09-01 .
* Des: 解析框架中的网络请求和响应结果并打印
*/
public
class
RequestLogInterceptor
implements
Interceptor
{
private
DefaultFormatPrinter
mPrinter
=
new
DefaultFormatPrinter
();
private
boolean
mIsDebug
;
private
RequestHandler
mRequestHandler
;
public
RequestLogInterceptor
()
{
public
RequestLogInterceptor
(
boolean
isDebug
,
RequestHandler
requestHandler
)
{
this
.
mIsDebug
=
isDebug
;
this
.
mRequestHandler
=
requestHandler
;
}
@Override
...
...
@@ -36,6 +47,8 @@ public class RequestLogInterceptor implements Interceptor {
mPrinter
.
printFileRequest
(
request
);
}
if
(
mRequestHandler
!=
null
)
request
=
mRequestHandler
.
onHttpRequestBefore
(
chain
,
request
);
long
t1
=
System
.
nanoTime
()
;
Response
originalResponse
;
...
...
@@ -55,19 +68,24 @@ public class RequestLogInterceptor implements Interceptor {
bodyString
=
printResult
(
request
,
originalResponse
);
}
final
List
<
String
>
segmentList
=
request
.
url
().
encodedPathSegments
();
final
String
header
=
originalResponse
.
headers
().
toString
();
final
int
code
=
originalResponse
.
code
();
final
boolean
isSuccessful
=
originalResponse
.
isSuccessful
();
final
String
message
=
originalResponse
.
message
();
final
String
url
=
originalResponse
.
request
().
url
().
toString
();
if
(
responseBody
!=
null
&&
isParseable
(
responseBody
.
contentType
()))
{
mPrinter
.
printJsonResponse
(
TimeUnit
.
NANOSECONDS
.
toMillis
(
t2
-
t1
),
isSuccessful
,
code
,
header
,
responseBody
.
contentType
(),
bodyString
,
segmentList
,
message
,
url
);
}
else
{
mPrinter
.
printFileResponse
(
TimeUnit
.
NANOSECONDS
.
toMillis
(
t2
-
t1
),
isSuccessful
,
code
,
header
,
segmentList
,
message
,
url
);
if
(
mRequestHandler
!=
null
)
mRequestHandler
.
onHttpResultResponse
(
bodyString
,
chain
,
originalResponse
);
if
(
mIsDebug
)
{
final
List
<
String
>
segmentList
=
request
.
url
().
encodedPathSegments
();
final
String
header
=
originalResponse
.
headers
().
toString
();
final
int
code
=
originalResponse
.
code
();
final
boolean
isSuccessful
=
originalResponse
.
isSuccessful
();
final
String
message
=
originalResponse
.
message
();
final
String
url
=
originalResponse
.
request
().
url
().
toString
();
if
(
responseBody
!=
null
&&
isParseable
(
responseBody
.
contentType
()))
{
mPrinter
.
printJsonResponse
(
TimeUnit
.
NANOSECONDS
.
toMillis
(
t2
-
t1
),
isSuccessful
,
code
,
header
,
responseBody
.
contentType
(),
bodyString
,
segmentList
,
message
,
url
);
}
else
{
mPrinter
.
printFileResponse
(
TimeUnit
.
NANOSECONDS
.
toMillis
(
t2
-
t1
),
isSuccessful
,
code
,
header
,
segmentList
,
message
,
url
);
}
}
return
originalResponse
;
...
...
ydl-platform/build.gradle
View file @
cfab77e2
...
...
@@ -83,7 +83,8 @@ dependencies {
api
rootProject
.
ext
.
dependencies
[
"ydl-utils"
]
api
rootProject
.
ext
.
dependencies
[
"ydl-js"
]
api
rootProject
.
ext
.
dependencies
[
"ydl-net"
]
// api rootProject.ext.dependencies["ydl-net"]
api
project
(
':ydl-net'
)
api
rootProject
.
ext
.
dependencies
[
"ydl-js"
]
api
rootProject
.
ext
.
dependencies
[
"ptr-lib-release"
]
api
(
rootProject
.
ext
.
dependencies
[
"ydl-device"
])
{
...
...
ydl-platform/src/main/java/com/ydl/ydlcommon/base/config/GlobalConfig.kt
View file @
cfab77e2
...
...
@@ -91,6 +91,7 @@ class GlobalConfig private constructor(var builder: Builder) {
}
apiFactory
.
setOkClient
(
okHttpClient
)
HttpConfig
.
getInstance
().
initAuth
()
}
}
...
...
ydl-platform/src/main/java/com/ydl/ydlcommon/base/config/HttpConfig.kt
View file @
cfab77e2
package
com.ydl.ydlcommon.base.config
import
android.annotation.SuppressLint
import
android.content.Context
import
android.text.TextUtils
import
com.facebook.stetho.okhttp3.StethoInterceptor
import
com.ydl.ydlcommon.base.BaseApp
import
com.ydl.ydlcommon.bean.AuthBean
import
com.ydl.ydlcommon.data.PlatformDataManager
import
com.ydl.ydlcommon.data.http.BaseAPIResponse
import
com.ydl.ydlcommon.data.http.EncryptUtils
import
com.ydl.ydlcommon.data.http.GsonProvider
import
com.ydl.ydlcommon.data.http.RxUtils
import
com.ydl.ydlcommon.data.http.api.ApiRequestUtil
import
com.ydl.ydlcommon.modular.ModularServiceManager
import
com.ydl.ydlcommon.utils.YDLCacheUtils
import
com.ydl.ydlnet.builder.config.OkHttpConfig
import
com.ydl.ydlnet.builder.interceptor.log.RequestHandler
import
com.yidianling.common.tools.LogUtil
import
com.yidianling.common.tools.RxAppTool
import
com.yidianling.common.tools.RxDeviceTool
import
okhttp3.FormBody
import
okhttp3.Interceptor
import
okhttp3.MultipartBody
import
okhttp3.OkHttpClient
import
com.yidianling.common.tools.ToastUtil
import
okhttp3.*
import
okio.Buffer
import
okio.BufferedSink
import
java.util.*
import
kotlin.collections.ArrayList
/**
...
...
@@ -37,7 +38,10 @@ class HttpConfig {
//====================应用默认配置====================
private
const
val
AUTHORIZATION_NAME
=
"Authorization"
private
const
val
AUTHORIZATION_JAVA_NAME
=
"AuthorizationJava"
private
const
val
SESSION_KEY
=
"dc59cf294f37d237c1f06240568ffe21"
private
var
DYNAMIC_SESSION_KEY
:
String
=
"dc59cf294f37d237c1f06240568ffe21"
private
const
val
YDL
=
"Ydl"
private
const
val
UID
=
"uid"
private
const
val
FFROM
=
"ffrom"
...
...
@@ -48,6 +52,8 @@ class HttpConfig {
private
const
val
TOKEN
=
"accessToken"
private
val
OS_TYPE
=
"osType"
// 1.ios 2.android
private
val
APP_NAME
=
"appName"
//用于标识 是哪个应用 yidianling:用户版 xinlizixun:心理咨询 haoshi:情感壹点灵 zhuanjia:专家版
//验证签名失败
private
val
AUTH_INEFFECTIVE_CODE
=
"-201"
//====================网络环境====================
...
...
@@ -80,6 +86,7 @@ class HttpConfig {
return
builder
.
setInterceptor
(
commonParams
(),
requestHead
(
appFrom
))
.
setRequestHandler
(
getRequestHandler
())
.
setReadTimeout
(
15
)
.
setWriteTimeout
(
15
)
.
setConnectTimeout
(
15
)
...
...
@@ -87,6 +94,35 @@ class HttpConfig {
.
build
()
}
private
fun
getRequestHandler
():
RequestHandler
{
return
object
:
RequestHandler
{
override
fun
onHttpResultResponse
(
httpResult
:
String
,
chain
:
Interceptor
.
Chain
,
response
:
Response
):
Response
{
val
gson
=
GsonProvider
.
getGson
()
val
resultData
=
gson
.
fromJson
(
httpResult
,
BaseAPIResponse
::
class
.
java
)
when
(
resultData
.
code
)
{
AUTH_INEFFECTIVE_CODE
->
{
//签证签名失败
ToastUtil
.
toastShort
(
resultData
.
msg
)
//更新动态密钥
if
(
resultData
.
data
!=
null
){
var
authBean
=
gson
.
fromJson
<
AuthBean
>(
gson
.
toJson
(
resultData
.
data
),
AuthBean
::
class
.
java
)
DYNAMIC_SESSION_KEY
=
authBean
?.
appKey
.
toString
()
}
}
}
return
response
}
override
fun
onHttpRequestBefore
(
chain
:
Interceptor
.
Chain
?,
request
:
Request
):
Request
{
return
request
}
}
}
// 添加公共参数
private
fun
commonParams
():
Interceptor
{
...
...
@@ -95,34 +131,25 @@ class HttpConfig {
//如果是POST请求,则再在Body中增加公共参数
if
(
"POST"
==
request
.
method
()){
var
body
=
request
.
body
()
if
(
body
is
FormBody
)
{
val
paramsName
=
mutableSetOf
<
String
>()
val
bodyBuild
=
FormBody
.
Builder
()
for
(
i
in
0
until
body
.
size
())
{
val
name
=
body
.
name
(
i
)
paramsName
.
add
(
name
)
val
value
=
body
.
value
(
i
)
// 去除假参数和值为空的参数
if
(
YDLConstants
.
HOLDER_PARAM
!=
name
&&
!
TextUtils
.
isEmpty
(
value
))
{
bodyBuild
.
addEncoded
(
name
,
value
)
}
}
bodyBuild
.
addEncoded
(
FFROM
,
PlatformDataManager
.
getRam
().
getChannelName
())
.
addEncoded
(
IS_FROM_APP
,
"1"
)
.
addEncoded
(
OS_BUILD
,
"""${RxDeviceTool.getBuildBrandModel()},${RxDeviceTool.getSDKVersionName()},${RxAppTool.getAppVersionName(
BaseApp.getApp()
)}"""
)
.
addEncoded
(
TS
,
(
System
.
currentTimeMillis
()
/
1000
).
toString
())
.
addEncoded
(
VERSION
,
RxAppTool
.
getAppVersionName
(
BaseApp
.
getApp
()
)
)
val
loginBean
=
ModularServiceManager
.
getPlatformUserService
()
?.
getUser
()
if
(
loginBean
!=
null
)
{
bodyBuild
.
addEncoded
(
UID
,
loginBean
.
userId
)
bodyBuild
.
addEncoded
(
TOKEN
,
loginBean
.
token
)
val
paramsValue
=
getCommonParams
(
paramsName
)
paramsValue
.
forEach
{
entry
->
bodyBuild
.
addEncoded
(
entry
.
key
,
entry
.
value
)
}
body
=
bodyBuild
.
build
()
...
...
@@ -132,34 +159,11 @@ class HttpConfig {
val
url
=
request
.
url
()
val
newBuilder
=
url
.
newBuilder
()
// for (i in 0 until url.querySize()) {
// //取出url中?后的参数
// val key = url.queryParameterName(i)
// val value = url.queryParameterValue(i)
// newBuilder.
// addQueryParameter(key, value)
// }
newBuilder
.
addQueryParameter
(
FFROM
,
PlatformDataManager
.
getRam
().
getChannelName
())
.
addQueryParameter
(
IS_FROM_APP
,
"1"
)
.
addQueryParameter
(
OS_BUILD
,
"""${RxDeviceTool.getBuildBrandModel()},${RxDeviceTool.getSDKVersionName()},${RxAppTool.getAppVersionName(
BaseApp.getApp()
)}"""
)
.
addQueryParameter
(
TS
,
(
System
.
currentTimeMillis
()
/
1000
).
toString
())
.
addQueryParameter
(
VERSION
,
RxAppTool
.
getAppVersionName
(
BaseApp
.
getApp
()
)
)
val
loginBean
=
ModularServiceManager
.
getPlatformUserService
()
?.
getUser
()
if
(
loginBean
!=
null
)
{
newBuilder
.
addQueryParameter
(
UID
,
loginBean
.
userId
)
.
addQueryParameter
(
TOKEN
,
loginBean
.
token
)
val
paramsName
=
url
.
queryParameterNames
()
val
paramsValue
=
getCommonParams
(
paramsName
)
paramsValue
.
forEach
{
entry
->
newBuilder
.
addQueryParameter
(
entry
.
key
,
entry
.
value
)
}
it
.
proceed
(
request
.
newBuilder
().
url
(
newBuilder
.
build
()).
build
())
...
...
@@ -170,6 +174,43 @@ class HttpConfig {
}
}
/**
* 获取公共参数
* 在原有请求中没有该参数的情况下才添加
*/
private
fun
getCommonParams
(
paramsName
:
MutableSet
<
String
>):
HashMap
<
String
,
String
>
{
val
paramsValue
=
hashMapOf
<
String
,
String
>()
if
(!
paramsName
.
contains
(
FFROM
))
{
paramsValue
[
FFROM
]
=
PlatformDataManager
.
getRam
().
getChannelName
()
}
if
(!
paramsName
.
contains
(
IS_FROM_APP
))
{
paramsValue
[
IS_FROM_APP
]
=
"1"
}
if
(!
paramsName
.
contains
(
OS_BUILD
))
{
paramsValue
[
OS_BUILD
]
=
"""${RxDeviceTool.getBuildBrandModel()},${RxDeviceTool.getSDKVersionName()},${RxAppTool.getAppVersionName(
BaseApp.getApp()
)}"""
}
if
(!
paramsName
.
contains
(
TS
))
{
paramsValue
[
TS
]
=
(
System
.
currentTimeMillis
()
/
1000
).
toString
()
}
if
(!
paramsName
.
contains
(
VERSION
))
{
paramsValue
[
VERSION
]
=
RxAppTool
.
getAppVersionName
(
BaseApp
.
getApp
()
)
}
val
loginBean
=
ModularServiceManager
.
getPlatformUserService
()
?.
getUser
()
if
(
loginBean
!=
null
&&
!
paramsName
.
contains
(
UID
))
{
paramsValue
[
UID
]
=
loginBean
.
userId
}
if
(
loginBean
!=
null
&&
!
paramsName
.
contains
(
TOKEN
))
{
paramsValue
[
TOKEN
]
=
loginBean
.
token
}
return
paramsValue
}
private
data class
Param
(
val
name
:
String
,
val
value
:
String
)
...
...
@@ -202,6 +243,7 @@ class HttpConfig {
}
}
}
params
.
sortWith
(
Comparator
{
o1
,
o2
->
val
res
=
o1
.
name
.
compareTo
(
o2
.
name
)
when
{
...
...
@@ -214,14 +256,14 @@ class HttpConfig {
if
(
index
!=
0
)
paramsString
.
append
(
"&"
)
paramsString
.
append
(
"${param.name}=${param.value}"
)
}
paramsString
.
append
(
SESSION_KEY
)
val
head
=
"$YDL ${EncryptUtils.encryptMD5ToString(
paramsString
.
toString
()
)}
"
val
oldAuth
=
getOldAuth
(
paramsString
)
val
newAuth
=
getNewAuth
(
paramsString
)
val
builder
=
it
.
request
()
.
newBuilder
()
.
header
(
AUTHORIZATION_NAME
,
head
)
.
header
(
AUTHORIZATION_NAME
,
oldAuth
)
.
header
(
AUTHORIZATION_JAVA_NAME
,
newAuth
)
.
addHeader
(
"Connection"
,
"close"
)
.
addHeader
(
FFROM
,
PlatformDataManager
.
getRam
().
getChannelName
())
.
addHeader
(
IS_FROM_APP
,
"1"
)
...
...
@@ -243,6 +285,18 @@ class HttpConfig {
}
}
private
fun
getOldAuth
(
paramsString
:
StringBuilder
):
String
{
paramsString
.
append
(
SESSION_KEY
)
return
"$YDL ${EncryptUtils.encryptMD5ToString(
paramsString
.
toString
()
)}
"
}
private
fun
getNewAuth
(
paramsString
:
StringBuilder
):
String
{
//md5({静态秘钥} + {参数} + md5{动态秘钥(明文)}
return
"$YDL ${EncryptUtils.encryptMD5ToString(SESSION_KEY+ paramsString.toString()+EncryptUtils.encryptMD5ToString(DYNAMIC_SESSION_KEY))}"
}
//初始化网络环境
fun
initEnv
(
c
:
Context
,
env
:
String
)
{
var
appEnv
=
env
...
...
@@ -271,6 +325,20 @@ class HttpConfig {
SERVER_COUPON_URL
=
properties
.
getProperty
(
"javacouponurl.$appEnv"
)
}
@SuppressLint
(
"CheckResult"
)
fun
initAuth
(){
ApiRequestUtil
.
getDynamicToken
()
.
compose
(
RxUtils
.
applySchedulers
())
.
compose
(
RxUtils
.
resultJavaData
())
.
subscribe
({
if
(!
TextUtils
.
isEmpty
(
it
.
appKey
)){
DYNAMIC_SESSION_KEY
=
it
?.
appKey
.
toString
()
}
})
{
LogUtil
.
i
(
"HttpConfig"
,
it
.
toString
())
}
}
private
object
Holder
{
val
INSTANCE
=
HttpConfig
()
}
...
...
ydl-platform/src/main/java/com/ydl/ydlcommon/bean/AuthBean.kt
0 → 100644
View file @
cfab77e2
package
com.ydl.ydlcommon.bean
/**
* Created by haorui on 2019-11-26.
* Des:
*/
class
AuthBean
{
/**
* id : 1
* appId : android_zhuzhan
* appKey : 123456
* version : 4.0.00
*/
var
id
:
Int
=
0
var
appId
:
String
?
=
null
var
appKey
:
String
?
=
null
var
version
:
String
?
=
null
}
ydl-platform/src/main/java/com/ydl/ydlcommon/data/http/api/ApiRequestUtil.java
View file @
cfab77e2
package
com
.
ydl
.
ydlcommon
.
data
.
http
.
api
;
import
com.google.gson.Gson
;
import
com.ydl.ydlcommon.bean.AuthBean
;
import
com.ydl.ydlcommon.bean.MustUP
;
import
com.ydl.ydlcommon.data.http.BaseAPIResponse
;
import
com.ydl.ydlcommon.data.http.BaseResponse
;
...
...
@@ -8,12 +9,13 @@ import com.ydl.ydlcommon.data.http.FormatText;
import
com.ydl.ydlcommon.data.http.params.ActionDataBean
;
import
com.ydl.ydlcommon.utils.NetworkParamsUtils
;
import
com.ydl.ydlnet.YDLHttpUtils
;
import
java.util.List
;
import
io.reactivex.Observable
;
import
okhttp3.MediaType
;
import
okhttp3.RequestBody
;
import
java.util.List
;
/**
* 模块请求工具类
* Created by hgw on 2018/1/23.
...
...
@@ -39,4 +41,12 @@ public class ApiRequestUtil {
RequestBody
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
new
Gson
().
toJson
(
actionDataParams
));
return
YDLHttpUtils
.
Companion
.
obtainApi
(
NetApiStore
.
class
).
actionDataCount
(
body
);
}
/**
* 获取动态密钥
* @return
*/
public
static
Observable
<
BaseAPIResponse
<
AuthBean
>>
getDynamicToken
()
{
return
YDLHttpUtils
.
Companion
.
obtainApi
(
NetApiStore
.
class
).
getDynamicToken
();
}
}
ydl-platform/src/main/java/com/ydl/ydlcommon/data/http/api/NetApiStore.java
View file @
cfab77e2
package
com
.
ydl
.
ydlcommon
.
data
.
http
.
api
;
import
com.ydl.ydlcommon.bean.AuthBean
;
import
com.ydl.ydlcommon.bean.MustUP
;
import
com.ydl.ydlcommon.data.http.BaseAPIResponse
;
import
com.ydl.ydlcommon.data.http.BaseResponse
;
import
io.reactivex.Observable
;
import
okhttp3.RequestBody
;
import
retrofit2.http.*
;
import
java.util.Map
;
import
io.reactivex.Observable
;
import
okhttp3.RequestBody
;
import
retrofit2.http.Body
;
import
retrofit2.http.FieldMap
;
import
retrofit2.http.FormUrlEncoded
;
import
retrofit2.http.Headers
;
import
retrofit2.http.POST
;
import
static
com
.
ydl
.
ydlcommon
.
base
.
config
.
AppConfigKt
.
YDL_DOMAIN
;
import
static
com
.
ydl
.
ydlcommon
.
base
.
config
.
AppConfigKt
.
YDL_DOMAIN_JAVA
;
...
...
@@ -32,4 +38,8 @@ interface NetApiStore {
@POST
(
"data/bigdata/maidian/writeMaiDianData"
)
Observable
<
BaseAPIResponse
<
String
>>
actionDataCount
(
@Body
RequestBody
body
);
@Headers
(
YDL_DOMAIN
+
YDL_DOMAIN_JAVA
)
@POST
(
"risk/key/info"
)
Observable
<
BaseAPIResponse
<
AuthBean
>>
getDynamicToken
();
}
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