Skip to content

Commit daf69b1

Browse files
committed
详情页面新增浏览器打开、复制链接、分享功能
1 parent 2330198 commit daf69b1

File tree

21 files changed

+389
-176
lines changed

21 files changed

+389
-176
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@
5353
</activity>
5454
<activity
5555
android:name=".home.activity.HomeActivity"
56-
android:screenOrientation="portrait"
57-
android:theme="@style/ToolBarTheme" />
56+
android:screenOrientation="portrait" />
5857
<activity
5958
android:name=".home.activity.CommonSearchActivity"
6059
android:screenOrientation="portrait" />
@@ -70,7 +69,7 @@
7069
<activity
7170
android:name=".user.activity.PhotoPreviewActivity"
7271
android:screenOrientation="portrait"
73-
android:theme="@style/FullScreenTheme" /> <!-- Android 7.0以上 照片、APK等下载保存路径 -->
72+
android:theme="@style/FullScreenTheme" />
7473
<activity
7574
android:name=".FlutterAppActivity"
7675
android:screenOrientation="portrait" />
@@ -80,6 +79,7 @@
8079
android:hardwareAccelerated="true"
8180
android:windowSoftInputMode="adjustResize"
8281
/>
82+
<!-- Android 7.0以上 照片、APK等下载保存路径 -->
8383
<provider
8484
android:name="androidx.core.content.FileProvider"
8585
android:authorities="${applicationId}.provider"

app/src/main/java/com/fmt/github/ext/DataBindExt.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ import androidx.databinding.BindingAdapter
1111
import androidx.databinding.BindingConversion
1212
import com.fmt.github.AppContext
1313
import com.fmt.github.R
14-
import com.fmt.github.common.image.ImageLoader
14+
import com.fmt.github.common.image.ImageLoaderOptions
1515
import com.fmt.github.home.model.ReceivedEventModel
1616
import com.fmt.github.repos.model.ReposItemModel
1717

1818
//DataBinding自定义属性
1919
@BindingAdapter("url")
2020
fun loadImage(imageView: ImageView, url: String) {
21-
ImageLoader.LoaderOptions().setImageUrl(url).setPlaceholderId(R.mipmap.ic_github)
22-
.setTargetView(imageView).build().load()
21+
ImageLoaderOptions().setImageUrl(url).setPlaceholderId(R.mipmap.ic_github)
22+
.setTargetView(imageView).load()
2323
}
2424

2525
//DataBinding类型转换

app/src/main/java/com/fmt/github/home/activity/HomeActivity.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import android.view.Menu
66
import android.view.MenuItem
77
import androidx.appcompat.app.ActionBarDrawerToggle
88
import androidx.core.content.ContextCompat
9-
import androidx.lifecycle.Observer
109
import androidx.lifecycle.lifecycleScope
1110
import androidx.navigation.Navigation
1211
import com.fmt.github.FlutterAppActivity
@@ -120,7 +119,7 @@ class HomeActivity : BaseVMActivity(), NavigationView.OnNavigationItemSelectedLi
120119
}
121120

122121
override fun onCreateOptionsMenu(menu: Menu): Boolean {
123-
menuInflater.inflate(R.menu.menu_toolbar, menu)//ToolBar设置菜单按钮
122+
menuInflater.inflate(R.menu.menu_home_toolbar, menu)//ToolBar设置菜单按钮
124123
return true
125124
}
126125

app/src/main/java/com/fmt/github/repos/activity/ReposDetailActivity.kt

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@ package com.fmt.github.repos.activity
33
import android.app.Activity
44
import android.os.Bundle
55
import android.view.KeyEvent
6+
import android.view.Menu
7+
import android.view.MenuItem
68
import android.view.View
7-
import androidx.lifecycle.Observer
89
import com.fmt.github.R
910
import com.fmt.github.base.activity.BaseVMActivity
1011
import com.fmt.github.base.viewmodel.BaseViewModel
1112
import com.fmt.github.constant.Constant
1213
import com.fmt.github.ext.*
1314
import com.fmt.github.ext.startActivity
1415
import com.fmt.github.home.event.ReposStarEvent
16+
import com.fmt.github.repos.delegate.AgentWebContainer
1517
import com.fmt.github.repos.delegate.WebDelegate
1618
import com.fmt.github.repos.viewmodel.ReposViewModel
19+
import com.fmt.github.utils.ShareUtils
1720
import com.jeremyliao.liveeventbus.LiveEventBus
1821
import com.like.LikeButton
1922
import com.like.OnLikeListener
@@ -40,15 +43,21 @@ class ReposDetailActivity : BaseVMActivity() {
4043
mOwner = intent.getStringExtra(OWNER)
4144
mRepos = intent.getStringExtra(REPO)
4245
mWebUrl = intent.getStringExtra(WEB_URL)
43-
mWebDelegate = WebDelegate.create(this, mRootView, mWebUrl)
46+
mWebDelegate = WebDelegate.create(AgentWebContainer(), this, mRootView, mWebUrl)
4447
mWebDelegate.onCreate()
48+
setSupportActionBar(mToolbar)
49+
supportActionBar?.let { actionBar ->
50+
actionBar.setDisplayHomeAsUpEnabled(true)//添加默认的返回图标
51+
actionBar.setHomeButtonEnabled(true)//设置返回键可用
52+
actionBar.title = mRepos//设置标题
53+
}
4554
initListener()
4655
}
4756

4857
override fun getViewModel(): BaseViewModel = mViewModel
4958

5059
private fun initListener() {
51-
mBackIB.setOnClickListener {
60+
mToolbar.setNavigationOnClickListener {
5261
mWebDelegate.back().no {
5362
finish()
5463
}
@@ -64,15 +73,28 @@ class ReposDetailActivity : BaseVMActivity() {
6473
})
6574
}
6675

76+
override fun onCreateOptionsMenu(menu: Menu): Boolean {
77+
menuInflater.inflate(R.menu.menu_repos_detail_toolbar, menu)
78+
return true
79+
}
80+
81+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
82+
when (item.itemId) {
83+
R.id.item_browser_open -> ShareUtils.openUrl(this, mWebUrl)
84+
R.id.item_copy_link -> ShareUtils.copyClipboard(this, mWebUrl)
85+
R.id.item_share -> ShareUtils.shareText(this, mWebUrl)
86+
}
87+
return true
88+
}
89+
6790
override fun initData() {
68-
mReposNameTv.text = mRepos
6991
checkRepoStarred()
7092
}
7193

7294
private fun checkRepoStarred() {
7395
mViewModel.checkRepoStarred(mOwner, mRepos)
74-
.observe(this, Observer {
75-
mFavorIb.visibility = View.VISIBLE
96+
.observe(this, {
97+
fl_favor.visibility = View.VISIBLE
7698
mFavorIb.isLiked = it
7799
})
78100
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.fmt.github.repos.delegate
2+
3+
import android.app.Activity
4+
import android.view.KeyEvent
5+
import android.view.ViewGroup
6+
import android.widget.LinearLayout
7+
import androidx.core.content.ContextCompat
8+
import com.fmt.github.R
9+
import com.just.agentweb.AgentWeb
10+
11+
/**
12+
* 基于AgentWeb实现
13+
*/
14+
class AgentWebContainer : WebContainer {
15+
16+
private lateinit var mAgentWeb: AgentWeb
17+
18+
override fun onCreate(activity: Activity, viewGroup: ViewGroup, webUrl: String) {
19+
mAgentWeb = AgentWeb.with(activity)
20+
.setAgentWebParent(viewGroup, LinearLayout.LayoutParams(-1, -1))
21+
.useDefaultIndicator(ContextCompat.getColor(activity, R.color.indicator_color))
22+
.createAgentWeb()
23+
.ready()
24+
.go(webUrl)
25+
}
26+
27+
override fun onPause() {
28+
mAgentWeb.webLifeCycle.onPause()
29+
}
30+
31+
override fun onResume() {
32+
mAgentWeb.webLifeCycle.onResume()
33+
}
34+
35+
override fun onDestroy() {
36+
mAgentWeb.webLifeCycle.onDestroy()
37+
}
38+
39+
override fun back() = mAgentWeb.back()
40+
41+
override fun handleKeyEvent(keyCode: Int, event: KeyEvent) =
42+
mAgentWeb.handleKeyEvent(keyCode, event)
43+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.fmt.github.repos.delegate
2+
import android.app.Activity
3+
import android.view.KeyEvent
4+
import android.view.ViewGroup
5+
6+
/**
7+
* WebView通用接口,方便后续切换
8+
*/
9+
interface WebContainer {
10+
11+
fun onCreate(activity: Activity, viewGroup: ViewGroup, webUrl: String)
12+
13+
fun onPause()
14+
15+
fun onResume()
16+
17+
fun onDestroy()
18+
19+
fun back():Boolean
20+
21+
fun handleKeyEvent(keyCode: Int, event: KeyEvent):Boolean
22+
}

app/src/main/java/com/fmt/github/repos/delegate/WebDelegate.kt

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,42 @@ package com.fmt.github.repos.delegate
33
import android.app.Activity
44
import android.view.KeyEvent
55
import android.view.ViewGroup
6-
import android.widget.LinearLayout
7-
import androidx.core.content.ContextCompat
8-
import com.fmt.github.R
9-
import com.just.agentweb.AgentWeb
106

117
class WebDelegate(
8+
private val webContainer: WebContainer,
129
private val mActivity: Activity,
1310
private val mViewGroup: ViewGroup,
1411
private val mWebUrl: String
1512
) {
1613

17-
private lateinit var mAgentWeb: AgentWeb
18-
1914
companion object {
20-
fun create(activity: Activity, viewGroup: ViewGroup, webUrl: String): WebDelegate =
21-
WebDelegate(activity, viewGroup, webUrl)
15+
fun create(
16+
webContainer: WebContainer,
17+
activity: Activity,
18+
viewGroup: ViewGroup,
19+
webUrl: String
20+
): WebDelegate =
21+
WebDelegate(webContainer, activity, viewGroup, webUrl)
2222
}
2323

2424
fun onCreate() {
25-
mAgentWeb = AgentWeb.with(mActivity)
26-
.setAgentWebParent(mViewGroup, LinearLayout.LayoutParams(-1, -1))
27-
.useDefaultIndicator(ContextCompat.getColor(mActivity, R.color.indicator_color))
28-
.createAgentWeb()
29-
.ready()
30-
.go(mWebUrl)
25+
webContainer.onCreate(mActivity, mViewGroup, mWebUrl)
3126
}
3227

3328
fun onPause() {
34-
mAgentWeb.webLifeCycle.onPause()
29+
webContainer.onPause()
3530
}
3631

3732
fun onResume() {
38-
mAgentWeb.webLifeCycle.onResume()
33+
webContainer.onResume()
3934
}
4035

4136
fun onDestroy() {
42-
mAgentWeb.webLifeCycle.onDestroy()
37+
webContainer.onDestroy()
4338
}
4439

45-
fun back() = mAgentWeb.back()
40+
fun back() = webContainer.back()
4641

47-
fun handleKeyEvent(keyCode: Int, event: KeyEvent) = mAgentWeb.handleKeyEvent(keyCode, event)
42+
fun handleKeyEvent(keyCode: Int, event: KeyEvent) = webContainer.handleKeyEvent(keyCode, event)
4843

4944
}

app/src/main/java/com/fmt/github/tasks/InitImageLoaderTask.kt

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package com.fmt.github.tasks
22

3+
import android.graphics.Bitmap
34
import android.graphics.drawable.Drawable
45
import android.view.View
56
import android.widget.ImageView
67
import com.bumptech.glide.Glide
78
import com.bumptech.glide.request.RequestOptions
9+
import com.bumptech.glide.request.target.CustomTarget
810
import com.bumptech.glide.request.target.CustomViewTarget
911
import com.bumptech.glide.request.transition.Transition
12+
import com.fmt.github.AppContext
13+
import com.fmt.github.R
1014
import com.fmt.github.common.image.ImageLoadStrategyManager
11-
import com.fmt.github.common.image.ImageLoader
15+
import com.fmt.github.common.image.ImageLoaderOptions
1216
import com.fmt.launch.starter.task.MainTask
1317

1418
class InitImageLoaderTask : MainTask() {
@@ -17,9 +21,12 @@ class InitImageLoaderTask : MainTask() {
1721
ImageLoadStrategyManager.init(GlideLoadStrategy())
1822
}
1923

24+
/**
25+
* Glide加载图片策略
26+
*/
2027
class GlideLoadStrategy : ImageLoadStrategyManager.ILoaderStrategy {
2128

22-
override fun loadImage(options: ImageLoader.LoaderOptions) {
29+
override fun loadImage(options: ImageLoaderOptions) {
2330

2431
var requestOptions = RequestOptions()
2532
if (options.placeholderId != null) {
@@ -49,5 +56,31 @@ class InitImageLoaderTask : MainTask() {
4956
}
5057
}
5158
}
59+
60+
override fun getImageBitMap(
61+
options: ImageLoaderOptions,
62+
callBack: ImageLoadStrategyManager.ILoadBitmapCallBack
63+
) {
64+
require(options.context != null) {
65+
AppContext.getString(R.string.context_not_null_tip)
66+
}
67+
68+
require(options.url != null) {
69+
AppContext.getString(R.string.url_not_null_tips)
70+
}
71+
72+
Glide.with(options.context!!).asBitmap().load(options.url)
73+
.into(object : CustomTarget<Bitmap>() {
74+
override fun onResourceReady(
75+
resource: Bitmap,
76+
transition: Transition<in Bitmap>?
77+
) {
78+
callBack.loaderBitmapSuccess(resource)
79+
}
80+
81+
override fun onLoadCleared(placeholder: Drawable?) {
82+
}
83+
})
84+
}
5285
}
5386
}

0 commit comments

Comments
 (0)