Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
beyond-clouds-android
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
云深项目组
beyond-clouds-android
Commits
dc262836
Commit
dc262836
authored
Mar 21, 2020
by
段启岩
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
项目详情完成
parent
adf2e66b
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
623 additions
and
5 deletions
+623
-5
app/src/main/AndroidManifest.xml
+1
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/model/Project.java
+114
-3
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IProjectRepository.java
+2
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/ProjectRepositoryImpl.java
+5
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/remote/ProjectApiStore.java
+4
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/AppComponent.java
+3
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/ViewModuleBinds.java
+6
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/main/ProjectFragment.java
+17
-1
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/project/ProjectDetailActivity.java
+138
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/ProjectDetailViewModel.java
+88
-0
app/src/main/res/layout/activity_project_detail.xml
+245
-0
app/src/main/res/layout/project_item.xml
+0
-1
No files found.
app/src/main/AndroidManifest.xml
View file @
dc262836
...
@@ -29,6 +29,7 @@
...
@@ -29,6 +29,7 @@
<activity
android:name=
".MainActivity"
/>
<activity
android:name=
".MainActivity"
/>
<activity
android:name=
".ui.login.LoginActivity"
/>
<activity
android:name=
".ui.login.LoginActivity"
/>
<activity
android:name=
".ui.blog.BlogDetailActivity"
/>
<activity
android:name=
".ui.blog.BlogDetailActivity"
/>
<activity
android:name=
".ui.project.ProjectDetailActivity"
/>
<activity
android:name=
".ui.settings.SettingsActivity"
/>
<activity
android:name=
".ui.settings.SettingsActivity"
/>
</application>
</application>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
...
...
app/src/main/java/cn/yunliyunwai/beyondclouds/data/model/Project.java
View file @
dc262836
...
@@ -2,9 +2,6 @@ package cn.yunliyunwai.beyondclouds.data.model;
...
@@ -2,9 +2,6 @@ package cn.yunliyunwai.beyondclouds.data.model;
import
java.util.Date
;
import
java.util.Date
;
import
lombok.Data
;
@Data
public
class
Project
{
public
class
Project
{
private
String
projectId
;
private
String
projectId
;
...
@@ -17,6 +14,120 @@ public class Project {
...
@@ -17,6 +14,120 @@ public class Project {
private
Integer
commentNumber
;
private
Integer
commentNumber
;
private
Integer
praiseNum
;
private
Integer
praiseNum
;
private
Integer
viewNumber
;
private
Integer
viewNumber
;
private
String
projectDescription
;
private
boolean
followedAuthor
;
private
String
contentHtml
;
private
Date
createTime
;
private
Date
createTime
;
public
String
getProjectId
()
{
return
projectId
;
}
public
void
setProjectId
(
String
projectId
)
{
this
.
projectId
=
projectId
;
}
public
String
getUserId
()
{
return
userId
;
}
public
void
setUserId
(
String
userId
)
{
this
.
userId
=
userId
;
}
public
String
getCategoryId
()
{
return
categoryId
;
}
public
void
setCategoryId
(
String
categoryId
)
{
this
.
categoryId
=
categoryId
;
}
public
String
getCategory
()
{
return
category
;
}
public
void
setCategory
(
String
category
)
{
this
.
category
=
category
;
}
public
String
getCover
()
{
return
cover
;
}
public
void
setCover
(
String
cover
)
{
this
.
cover
=
cover
;
}
public
String
getProjectName
()
{
return
projectName
;
}
public
void
setProjectName
(
String
projectName
)
{
this
.
projectName
=
projectName
;
}
public
String
getUserNick
()
{
return
userNick
;
}
public
void
setUserNick
(
String
userNick
)
{
this
.
userNick
=
userNick
;
}
public
Integer
getCommentNumber
()
{
return
commentNumber
;
}
public
void
setCommentNumber
(
Integer
commentNumber
)
{
this
.
commentNumber
=
commentNumber
;
}
public
Integer
getPraiseNum
()
{
return
praiseNum
;
}
public
void
setPraiseNum
(
Integer
praiseNum
)
{
this
.
praiseNum
=
praiseNum
;
}
public
Integer
getViewNumber
()
{
return
viewNumber
;
}
public
void
setViewNumber
(
Integer
viewNumber
)
{
this
.
viewNumber
=
viewNumber
;
}
public
String
getProjectDescription
()
{
return
projectDescription
;
}
public
void
setProjectDescription
(
String
projectDescription
)
{
this
.
projectDescription
=
projectDescription
;
}
public
boolean
isFollowedAuthor
()
{
return
followedAuthor
;
}
public
void
setFollowedAuthor
(
boolean
followedAuthor
)
{
this
.
followedAuthor
=
followedAuthor
;
}
public
String
getContentHtml
()
{
return
contentHtml
;
}
public
void
setContentHtml
(
String
contentHtml
)
{
this
.
contentHtml
=
contentHtml
;
}
public
Date
getCreateTime
()
{
return
createTime
;
}
public
void
setCreateTime
(
Date
createTime
)
{
this
.
createTime
=
createTime
;
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IProjectRepository.java
View file @
dc262836
...
@@ -24,4 +24,6 @@ public interface IProjectRepository {
...
@@ -24,4 +24,6 @@ public interface IProjectRepository {
void
makeCategoriesCache
(
List
<
ProjectCategory
>
categories
);
void
makeCategoriesCache
(
List
<
ProjectCategory
>
categories
);
LiveData
<
Result
<
Page
<
Project
>>>
fetchHotProjectList
(
Integer
page
,
int
pageSize
);
LiveData
<
Result
<
Page
<
Project
>>>
fetchHotProjectList
(
Integer
page
,
int
pageSize
);
LiveData
<
Result
<
Project
>>
getProject
(
String
projectId
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/ProjectRepositoryImpl.java
View file @
dc262836
...
@@ -53,4 +53,9 @@ public class ProjectRepositoryImpl implements IProjectRepository {
...
@@ -53,4 +53,9 @@ public class ProjectRepositoryImpl implements IProjectRepository {
public
LiveData
<
Result
<
Page
<
Project
>>>
fetchHotProjectList
(
Integer
page
,
int
pageSize
)
{
public
LiveData
<
Result
<
Page
<
Project
>>>
fetchHotProjectList
(
Integer
page
,
int
pageSize
)
{
return
projectApiStore
.
getHotProjectList
(
page
,
pageSize
);
return
projectApiStore
.
getHotProjectList
(
page
,
pageSize
);
}
}
@Override
public
LiveData
<
Result
<
Project
>>
getProject
(
String
projectId
)
{
return
projectApiStore
.
getProject
(
projectId
);
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/remote/ProjectApiStore.java
View file @
dc262836
...
@@ -9,6 +9,7 @@ import cn.yunliyunwai.beyondclouds.data.model.Project;
...
@@ -9,6 +9,7 @@ import cn.yunliyunwai.beyondclouds.data.model.Project;
import
cn.yunliyunwai.beyondclouds.data.model.ProjectCategory
;
import
cn.yunliyunwai.beyondclouds.data.model.ProjectCategory
;
import
cn.yunliyunwai.beyondclouds.data.model.Result
;
import
cn.yunliyunwai.beyondclouds.data.model.Result
;
import
retrofit2.http.GET
;
import
retrofit2.http.GET
;
import
retrofit2.http.Path
;
import
retrofit2.http.Query
;
import
retrofit2.http.Query
;
public
interface
ProjectApiStore
{
public
interface
ProjectApiStore
{
...
@@ -23,4 +24,7 @@ public interface ProjectApiStore {
...
@@ -23,4 +24,7 @@ public interface ProjectApiStore {
@GET
(
"project/hots"
)
@GET
(
"project/hots"
)
LiveData
<
Result
<
Page
<
Project
>>>
getHotProjectList
(
@Query
(
"page"
)
Integer
page
,
LiveData
<
Result
<
Page
<
Project
>>>
getHotProjectList
(
@Query
(
"page"
)
Integer
page
,
@Query
(
"size"
)
int
pageSize
);
@Query
(
"size"
)
int
pageSize
);
@GET
(
"project/{projectId}"
)
LiveData
<
Result
<
Project
>>
getProject
(
@Path
(
"projectId"
)
String
projectId
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/AppComponent.java
View file @
dc262836
...
@@ -17,6 +17,7 @@ import cn.yunliyunwai.beyondclouds.ui.main.HomeFragment;
...
@@ -17,6 +17,7 @@ import cn.yunliyunwai.beyondclouds.ui.main.HomeFragment;
import
cn.yunliyunwai.beyondclouds.ui.main.MyFragment
;
import
cn.yunliyunwai.beyondclouds.ui.main.MyFragment
;
import
cn.yunliyunwai.beyondclouds.ui.main.ProjectFragment
;
import
cn.yunliyunwai.beyondclouds.ui.main.ProjectFragment
;
import
cn.yunliyunwai.beyondclouds.ui.main.QAFragment
;
import
cn.yunliyunwai.beyondclouds.ui.main.QAFragment
;
import
cn.yunliyunwai.beyondclouds.ui.project.ProjectDetailActivity
;
import
cn.yunliyunwai.beyondclouds.ui.settings.SettingsActivity
;
import
cn.yunliyunwai.beyondclouds.ui.settings.SettingsActivity
;
import
dagger.BindsInstance
;
import
dagger.BindsInstance
;
import
dagger.Component
;
import
dagger.Component
;
...
@@ -43,6 +44,8 @@ public interface AppComponent {
...
@@ -43,6 +44,8 @@ public interface AppComponent {
void
inject
(
SettingsActivity
settingsActivity
);
void
inject
(
SettingsActivity
settingsActivity
);
void
inject
(
ProjectDetailActivity
projectDetailActivity
);
void
inject
(
HomeFragment
homeFragment
);
void
inject
(
HomeFragment
homeFragment
);
void
inject
(
DynamicFragment
dynamicFragment
);
void
inject
(
DynamicFragment
dynamicFragment
);
...
...
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/ViewModuleBinds.java
View file @
dc262836
...
@@ -8,6 +8,7 @@ import cn.yunliyunwai.beyondclouds.viewmodel.DynamicFragmentViewModel;
...
@@ -8,6 +8,7 @@ import cn.yunliyunwai.beyondclouds.viewmodel.DynamicFragmentViewModel;
import
cn.yunliyunwai.beyondclouds.viewmodel.DynamicListFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.DynamicListFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.HomeFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.HomeFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectDetailViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel
;
...
@@ -78,6 +79,11 @@ public interface ViewModuleBinds {
...
@@ -78,6 +79,11 @@ public interface ViewModuleBinds {
@Binds
@Binds
@IntoMap
@IntoMap
@ViewModelFactory
.
ViewModelKey
(
ProjectDetailViewModel
.
class
)
ViewModel
bindProjectDetailViewModel
(
ProjectDetailViewModel
projectDetailViewModel
);
@Binds
@IntoMap
@ViewModelFactory
.
ViewModelKey
(
SettingsActivityViewModel
.
class
)
@ViewModelFactory
.
ViewModelKey
(
SettingsActivityViewModel
.
class
)
ViewModel
bindSettingsActivityViewModel
(
SettingsActivityViewModel
settingsActivityViewModel
);
ViewModel
bindSettingsActivityViewModel
(
SettingsActivityViewModel
settingsActivityViewModel
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/main/ProjectFragment.java
View file @
dc262836
package
cn
.
yunliyunwai
.
beyondclouds
.
ui
.
main
;
package
cn
.
yunliyunwai
.
beyondclouds
.
ui
.
main
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.os.Bundle
;
import
android.os.Bundle
;
import
android.text.InputType
;
import
android.text.InputType
;
import
android.view.LayoutInflater
;
import
android.view.LayoutInflater
;
...
@@ -27,12 +29,15 @@ import cn.yunliyunwai.beyondclouds.databinding.FragmentProjectBinding;
...
@@ -27,12 +29,15 @@ import cn.yunliyunwai.beyondclouds.databinding.FragmentProjectBinding;
import
cn.yunliyunwai.beyondclouds.ui.common.FragmentFactory
;
import
cn.yunliyunwai.beyondclouds.ui.common.FragmentFactory
;
import
cn.yunliyunwai.beyondclouds.ui.common.RefreshableFragment
;
import
cn.yunliyunwai.beyondclouds.ui.common.RefreshableFragment
;
import
cn.yunliyunwai.beyondclouds.ui.common.listener.OnNavigationReselectedListener
;
import
cn.yunliyunwai.beyondclouds.ui.common.listener.OnNavigationReselectedListener
;
import
cn.yunliyunwai.beyondclouds.ui.project.ProjectDetailActivity
;
import
cn.yunliyunwai.beyondclouds.util.CategoryViewpagerUtils
;
import
cn.yunliyunwai.beyondclouds.util.CategoryViewpagerUtils
;
import
cn.yunliyunwai.beyondclouds.util.ContextUtils
;
import
cn.yunliyunwai.beyondclouds.util.ContextUtils
;
import
cn.yunliyunwai.beyondclouds.viewmodel.AuthenticationViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.AuthenticationViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel
;
import
static
cn
.
yunliyunwai
.
beyondclouds
.
ui
.
project
.
ProjectDetailActivity
.
ARG_PROJECT_ID
;
public
class
ProjectFragment
extends
BaseFragment
<
ProjectFragmentViewModel
,
FragmentProjectBinding
>
implements
OnNavigationReselectedListener
{
public
class
ProjectFragment
extends
BaseFragment
<
ProjectFragmentViewModel
,
FragmentProjectBinding
>
implements
OnNavigationReselectedListener
{
...
@@ -104,7 +109,18 @@ public class ProjectFragment extends BaseFragment<ProjectFragmentViewModel, Frag
...
@@ -104,7 +109,18 @@ public class ProjectFragment extends BaseFragment<ProjectFragmentViewModel, Frag
@Override
@Override
protected
BaseQuickAdapter
<
Project
,
BaseViewHolder
>
createAdapter
(
CommonCategory
category
)
{
protected
BaseQuickAdapter
<
Project
,
BaseViewHolder
>
createAdapter
(
CommonCategory
category
)
{
return
new
ProjectListRecyclerViewAdapter
(
R
.
layout
.
project_item
,
category
);
ProjectListRecyclerViewAdapter
adapter
=
new
ProjectListRecyclerViewAdapter
(
R
.
layout
.
project_item
,
category
);
adapter
.
setOnItemClickListener
(
new
BaseQuickAdapter
.
OnItemClickListener
()
{
@Override
public
void
onItemClick
(
BaseQuickAdapter
baseQuickAdapter
,
View
view
,
int
i
)
{
String
projectId
=
adapter
.
getData
().
get
(
i
).
getProjectId
();
Context
context
=
requireActivity
();
Intent
intent
=
new
Intent
(
context
,
ProjectDetailActivity
.
class
);
intent
.
putExtra
(
ARG_PROJECT_ID
,
projectId
);
context
.
startActivity
(
intent
);
}
});
return
adapter
;
}
}
}
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/project/ProjectDetailActivity.java
0 → 100644
View file @
dc262836
package
cn
.
yunliyunwai
.
beyondclouds
.
ui
.
project
;
import
android.os.Build
;
import
android.os.Bundle
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.webkit.WebSettings
;
import
android.webkit.WebView
;
import
android.webkit.WebViewClient
;
import
androidx.annotation.Nullable
;
import
androidx.lifecycle.Observer
;
import
androidx.lifecycle.ViewModelProvider
;
import
com.bumptech.glide.Glide
;
import
com.bumptech.glide.Priority
;
import
com.bumptech.glide.load.engine.DiskCacheStrategy
;
import
com.bumptech.glide.request.RequestOptions
;
import
javax.inject.Inject
;
import
cn.yunliyunwai.beyondclouds.R
;
import
cn.yunliyunwai.beyondclouds.base.BaseActivity
;
import
cn.yunliyunwai.beyondclouds.data.model.UserInfo
;
import
cn.yunliyunwai.beyondclouds.databinding.ActivityProjectDetailBinding
;
import
cn.yunliyunwai.beyondclouds.util.ContextUtils
;
import
cn.yunliyunwai.beyondclouds.util.GlideRoundTransform
;
import
cn.yunliyunwai.beyondclouds.util.HtmlUtils
;
import
cn.yunliyunwai.beyondclouds.util.StatusBarUtils
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectDetailViewModel
;
public
class
ProjectDetailActivity
extends
BaseActivity
<
ProjectDetailViewModel
,
ActivityProjectDetailBinding
>
{
private
static
final
RequestOptions
glideRequestOptions
=
new
RequestOptions
()
.
centerCrop
()
.
placeholder
(
R
.
drawable
.
placeholder_circle
)
.
error
(
R
.
drawable
.
placeholder_circle
)
.
priority
(
Priority
.
HIGH
)
.
diskCacheStrategy
(
DiskCacheStrategy
.
AUTOMATIC
)
.
transform
(
new
GlideRoundTransform
(
19
));
public
static
final
String
ARG_PROJECT_ID
=
"PROJECT_ID"
;
private
String
blogId
;
@Inject
ViewModelProvider
.
Factory
factory
;
@Override
protected
void
initInject
()
{
ContextUtils
.
getAppComponent
(
this
).
inject
(
this
);
}
@Override
protected
ProjectDetailViewModel
initViewModel
()
{
return
new
ViewModelProvider
(
this
,
factory
).
get
(
ProjectDetailViewModel
.
class
);
}
@Override
protected
ActivityProjectDetailBinding
initDataBinding
(
LayoutInflater
inflater
)
{
ActivityProjectDetailBinding
binding
=
ActivityProjectDetailBinding
.
inflate
(
inflater
);
binding
.
setLifecycleOwner
(
this
);
return
binding
;
}
@Override
protected
void
onCreate
(
@Nullable
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
StatusBarUtils
.
setWindowStatusBarColor
(
this
,
R
.
color
.
colorStatusBar
);
blogId
=
getIntent
().
getStringExtra
(
ARG_PROJECT_ID
);
initEventListenersAndObservers
();
}
private
void
initEventListenersAndObservers
()
{
binding
.
toolBar
.
setOnLeftIconClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
finish
();
}
});
WebView
webView
=
binding
.
webViewArticle
;
webView
.
loadUrl
(
"file:///android_asset/pages/article.html"
);
WebSettings
settings
=
webView
.
getSettings
();
settings
.
setJavaScriptEnabled
(
true
);
settings
.
setJavaScriptCanOpenWindowsAutomatically
(
true
);
webView
.
setWebViewClient
(
new
WebViewClient
()
{
@Override
public
void
onPageFinished
(
WebView
view
,
String
url
)
{
super
.
onPageFinished
(
view
,
url
);
viewModel
.
webViewPageFinished
();
}
});
viewModel
.
getLoadState
().
observe
(
this
,
new
Observer
<
ProjectDetailViewModel
.
LoadState
>()
{
@Override
public
void
onChanged
(
ProjectDetailViewModel
.
LoadState
loadState
)
{
if
(
loadState
.
isLoadComplete
())
{
String
contentHtml
=
viewModel
.
getProject
().
getValue
().
getContentHtml
();
contentHtml
=
HtmlUtils
.
enCode
(
contentHtml
);
webView
.
evaluateJavascript
(
"javascript:loadArticleContent('"
+
contentHtml
+
"')"
,
null
);
}
}
});
viewModel
.
getUserInfo
().
observe
(
this
,
new
Observer
<
UserInfo
>()
{
@Override
public
void
onChanged
(
UserInfo
userInfo
)
{
if
(
null
!=
userInfo
)
{
Glide
.
with
(
ProjectDetailActivity
.
this
).
load
(
userInfo
.
getUserAvatar
()).
apply
(
glideRequestOptions
).
into
(
binding
.
imageUserAvatar
);
}
}
});
viewModel
.
fetchBlog
(
blogId
);
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
M
)
{
binding
.
scrollView
.
setOnScrollChangeListener
(
new
View
.
OnScrollChangeListener
()
{
@Override
public
void
onScrollChange
(
View
v
,
int
scrollX
,
int
scrollY
,
int
oldScrollX
,
int
oldScrollY
)
{
int
articleInfoWrapperHeight
=
binding
.
articleInfoWrapper
.
getHeight
();
if
(
scrollY
>=
articleInfoWrapperHeight
)
{
if
(
viewModel
.
getProject
().
getValue
()
!=
null
)
{
binding
.
toolBar
.
setTitle
(
viewModel
.
getProject
().
getValue
().
getProjectName
());
}
}
else
{
binding
.
toolBar
.
setTitle
(
""
);
}
}
});
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/ProjectDetailViewModel.java
0 → 100644
View file @
dc262836
package
cn
.
yunliyunwai
.
beyondclouds
.
viewmodel
;
import
androidx.lifecycle.LiveData
;
import
androidx.lifecycle.MutableLiveData
;
import
androidx.lifecycle.Observer
;
import
androidx.lifecycle.ViewModel
;
import
javax.inject.Inject
;
import
cn.yunliyunwai.beyondclouds.data.model.Project
;
import
cn.yunliyunwai.beyondclouds.data.model.Result
;
import
cn.yunliyunwai.beyondclouds.data.model.UserInfo
;
import
cn.yunliyunwai.beyondclouds.data.source.IProjectRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IUserRepository
;
import
lombok.Data
;
public
class
ProjectDetailViewModel
extends
ViewModel
{
@Data
public
static
class
LoadState
{
private
boolean
dataLoadComplete
;
private
boolean
webViewPageLoadComplete
;
public
boolean
isLoadComplete
()
{
return
dataLoadComplete
&&
webViewPageLoadComplete
;
}
}
private
IProjectRepository
projectRepository
;
private
IUserRepository
userRepository
;
private
MutableLiveData
<
Project
>
project
=
new
MutableLiveData
<>();
private
MutableLiveData
<
UserInfo
>
userInfo
=
new
MutableLiveData
<>();
private
MutableLiveData
<
LoadState
>
loadState
=
new
MutableLiveData
<>();
@Inject
public
ProjectDetailViewModel
(
IProjectRepository
projectRepository
,
IUserRepository
userRepository
)
{
this
.
projectRepository
=
projectRepository
;
this
.
userRepository
=
userRepository
;
loadState
.
setValue
(
new
LoadState
());
}
public
LiveData
<
Project
>
getProject
()
{
return
project
;
}
public
LiveData
<
LoadState
>
getLoadState
()
{
return
loadState
;
}
public
LiveData
<
UserInfo
>
getUserInfo
()
{
return
userInfo
;
}
public
void
fetchBlog
(
String
projectId
)
{
projectRepository
.
getProject
(
projectId
).
observeForever
(
new
Observer
<
Result
<
Project
>>()
{
@Override
public
void
onChanged
(
Result
<
Project
>
projectResult
)
{
if
(
projectResult
.
getCode
()
==
0
)
{
fetchUserInfo
(
projectResult
.
getData
().
getUserId
());
project
.
setValue
(
projectResult
.
getData
());
LoadState
state
=
loadState
.
getValue
();
state
.
setDataLoadComplete
(
true
);
loadState
.
setValue
(
state
);
}
}
});
}
private
void
fetchUserInfo
(
String
userId
)
{
userRepository
.
getUserInfo
(
userId
).
observeForever
(
new
Observer
<
Result
<
UserInfo
>>()
{
@Override
public
void
onChanged
(
Result
<
UserInfo
>
userInfoResult
)
{
if
(
userInfoResult
.
getCode
()
==
0
)
{
userInfo
.
setValue
(
userInfoResult
.
getData
());
}
}
});
}
public
void
webViewPageFinished
()
{
LoadState
state
=
loadState
.
getValue
();
state
.
setWebViewPageLoadComplete
(
true
);
loadState
.
setValue
(
state
);
}
}
app/src/main/res/layout/activity_project_detail.xml
0 → 100644
View file @
dc262836
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<data>
<import
type=
"android.view.View"
/>
<variable
name=
"viewModel"
type=
"cn.yunliyunwai.beyondclouds.viewmodel.ProjectDetailViewModel"
/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"@color/colorWhite"
tools:context=
".ui.login.LoginActivity"
>
<cn.yunliyunwai.beyondclouds.view.BeyondToolBar
android:id=
"@+id/tool_bar"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:leftIcon=
"@string/icon_back"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
/>
<ScrollView
android:id=
"@+id/scroll_view"
app:layout_constraintTop_toBottomOf=
"@id/tool_bar"
app:layout_constraintBottom_toBottomOf=
"parent"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:paddingStart=
"12dp"
android:paddingLeft=
"12dp"
android:paddingEnd=
"12dp"
android:paddingRight=
"12dp"
android:paddingBottom=
"20dp"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<LinearLayout
android:id=
"@+id/article_info_wrapper"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
>
<!-- 博客基本信息 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id=
"@+id/user_info_wrapper"
app:layout_constraintTop_toTopOf=
"parent"
android:layout_marginTop=
"20dp"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<ImageView
android:id=
"@+id/image_user_avatar"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
android:src=
"@drawable/placeholder_circle"
android:layout_width=
"36dp"
android:layout_height=
"36dp"
/>
<TextView
android:id=
"@+id/txt_user_nick"
android:text=
'@{viewModel.project == null ? "作者" : viewModel.project.userNick}'
app:layout_constraintStart_toEndOf=
"@id/image_user_avatar"
app:layout_constraintTop_toTopOf=
"parent"
android:layout_marginStart=
"6dp"
android:layout_marginLeft=
"6dp"
android:textColor=
"#333333"
android:textSize=
"14sp"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
<TextView
android:id=
"@+id/txt_user_visit_num"
android:text=
'@{viewModel.userInfo == null ? "人气0·粉丝0" : "人气" + viewModel.userInfo.statistics.visitedNum + ".粉丝" + viewModel.userInfo.statistics.fansNum}'
app:layout_constraintStart_toEndOf=
"@id/image_user_avatar"
app:layout_constraintBottom_toBottomOf=
"parent"
android:layout_marginStart=
"6dp"
android:layout_marginLeft=
"6dp"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textColor=
"#999999"
android:textSize=
"10sp"
/>
<TextView
android:id=
"@+id/btn_follow_user"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
android:text=
'@{viewModel.project == null ? "关注" : (viewModel.project.followedAuthor ? "已关注" : "关注")}'
android:clickable=
"true"
android:background=
"@drawable/background_white_touchable"
android:textColor=
'@{viewModel.project == null ? @color/colorUnFollowed : (viewModel.project.followedAuthor ? @color/colorFollowed : @color/colorUnFollowed)}'
android:textSize=
"13sp"
android:paddingTop=
"5dp"
android:paddingBottom=
"5dp"
android:paddingStart=
"10dp"
android:paddingLeft=
"10dp"
android:paddingEnd=
"10dp"
android:paddingRight=
"10dp"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id=
"@+id/txt_title"
android:text=
'@{viewModel.project == null ? "标题" : viewModel.project.projectName}'
android:textColor=
"#333333"
android:textSize=
"21sp"
app:layout_constraintTop_toBottomOf=
"@id/user_info_wrapper"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"15dp"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id=
"@+id/article_extra_info"
app:layout_constraintTop_toBottomOf=
"@id/txt_title"
android:layout_marginTop=
"6dp"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<TextView
android:id=
"@+id/txt_create_time"
android:text=
"2020-2-17 19:53:0"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
android:textColor=
"#999999"
android:textSize=
"10sp"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
<LinearLayout
android:id=
"@+id/article_collect_info"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
android:orientation=
"horizontal"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
>
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:layout_gravity=
"center_vertical"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textSize=
"10dp"
android:textColor=
"#cccccc"
android:text=
"@string/icon_message"
/>
<TextView
android:id=
"@+id/txt_comment_number"
android:text=
'@{viewModel.project == null ? "0" : viewModel.project.commentNumber.toString()}'
android:layout_marginStart=
"2dp"
android:layout_marginLeft=
"2dp"
android:textSize=
"10dp"
android:textColor=
"#cccccc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:layout_marginStart=
"12dp"
android:layout_marginLeft=
"12dp"
android:layout_gravity=
"center_vertical"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textSize=
"10dp"
android:textColor=
"#cccccc"
android:text=
"@string/icon_heart"
/>
<TextView
android:id=
"@+id/txt_praise_number"
android:text=
'@{viewModel.project == null ? "0" : viewModel.project.praiseNum.toString()}'
android:layout_marginStart=
"2dp"
android:layout_marginLeft=
"2dp"
android:textSize=
"10dp"
android:textColor=
"#cccccc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:layout_marginStart=
"12dp"
android:layout_marginLeft=
"12dp"
android:layout_gravity=
"center_vertical"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textSize=
"10dp"
android:textColor=
"#cccccc"
android:text=
"@string/icon_eye"
/>
<TextView
android:id=
"@+id/txt_view_number"
android:text=
'@{viewModel.project == null ? "0" : viewModel.project.viewNumber.toString()}'
android:layout_marginStart=
"2dp"
android:layout_marginLeft=
"2dp"
android:textSize=
"10dp"
android:textColor=
"#cccccc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<TextView
android:id=
"@+id/txt_article_category"
android:text=
'@{viewModel.project == null ? "项目类别" : viewModel.project.category}'
android:background=
"@drawable/background_article_abstract"
android:layout_marginTop=
"10dp"
android:paddingTop=
"4dp"
android:paddingBottom=
"4dp"
android:paddingStart=
"10dp"
android:paddingLeft=
"10dp"
android:paddingEnd=
"10dp"
android:paddingRight=
"10dp"
android:textColor=
"#666666"
android:textSize=
"12sp"
app:layout_constraintTop_toBottomOf=
"@id/article_info_wrapper"
app:layout_constraintStart_toStartOf=
"parent"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
<TextView
android:id=
"@+id/txt_article_abstract"
android:text=
'@{viewModel.project == null ? "" : viewModel.project.projectDescription}'
android:visibility=
'@{(viewModel.project != null) && (viewModel.project.projectDescription != null) ? View.VISIBLE : View.GONE}'
android:textColor=
"#666666"
android:textSize=
"12sp"
android:background=
"@drawable/background_article_abstract"
android:layout_marginTop=
"16dp"
android:paddingTop=
"8dp"
android:paddingBottom=
"8dp"
android:paddingStart=
"10dp"
android:paddingLeft=
"10dp"
android:paddingEnd=
"10dp"
android:paddingRight=
"10dp"
app:layout_constraintTop_toBottomOf=
"@id/txt_article_category"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
/>
<WebView
android:id=
"@+id/web_view_article"
android:layout_marginTop=
"25dp"
android:overScrollMode=
"never"
app:layout_constraintTop_toBottomOf=
"@id/txt_article_abstract"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/project_item.xml
View file @
dc262836
...
@@ -5,7 +5,6 @@
...
@@ -5,7 +5,6 @@
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:background=
"@drawable/background_white_touchable"
android:background=
"@drawable/background_white_touchable"
android:clickable=
"true"
android:paddingStart=
"12dp"
android:paddingStart=
"12dp"
android:paddingLeft=
"12dp"
android:paddingLeft=
"12dp"
android:paddingTop=
"16dp"
android:paddingTop=
"16dp"
...
...
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