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
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
378 additions
and
5 deletions
+378
-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
+0
-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 @@
<activity
android:name=
".MainActivity"
/>
<activity
android:name=
".ui.login.LoginActivity"
/>
<activity
android:name=
".ui.blog.BlogDetailActivity"
/>
<activity
android:name=
".ui.project.ProjectDetailActivity"
/>
<activity
android:name=
".ui.settings.SettingsActivity"
/>
</application>
<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;
import
java.util.Date
;
import
lombok.Data
;
@Data
public
class
Project
{
private
String
projectId
;
...
...
@@ -17,6 +14,120 @@ public class Project {
private
Integer
commentNumber
;
private
Integer
praiseNum
;
private
Integer
viewNumber
;
private
String
projectDescription
;
private
boolean
followedAuthor
;
private
String
contentHtml
;
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 {
void
makeCategoriesCache
(
List
<
ProjectCategory
>
categories
);
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 {
public
LiveData
<
Result
<
Page
<
Project
>>>
fetchHotProjectList
(
Integer
page
,
int
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;
import
cn.yunliyunwai.beyondclouds.data.model.ProjectCategory
;
import
cn.yunliyunwai.beyondclouds.data.model.Result
;
import
retrofit2.http.GET
;
import
retrofit2.http.Path
;
import
retrofit2.http.Query
;
public
interface
ProjectApiStore
{
...
...
@@ -23,4 +24,7 @@ public interface ProjectApiStore {
@GET
(
"project/hots"
)
LiveData
<
Result
<
Page
<
Project
>>>
getHotProjectList
(
@Query
(
"page"
)
Integer
page
,
@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;
import
cn.yunliyunwai.beyondclouds.ui.main.MyFragment
;
import
cn.yunliyunwai.beyondclouds.ui.main.ProjectFragment
;
import
cn.yunliyunwai.beyondclouds.ui.main.QAFragment
;
import
cn.yunliyunwai.beyondclouds.ui.project.ProjectDetailActivity
;
import
cn.yunliyunwai.beyondclouds.ui.settings.SettingsActivity
;
import
dagger.BindsInstance
;
import
dagger.Component
;
...
...
@@ -43,6 +44,8 @@ public interface AppComponent {
void
inject
(
SettingsActivity
settingsActivity
);
void
inject
(
ProjectDetailActivity
projectDetailActivity
);
void
inject
(
HomeFragment
homeFragment
);
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;
import
cn.yunliyunwai.beyondclouds.viewmodel.DynamicListFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.HomeFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectDetailViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel
;
...
...
@@ -78,6 +79,11 @@ public interface ViewModuleBinds {
@Binds
@IntoMap
@ViewModelFactory
.
ViewModelKey
(
ProjectDetailViewModel
.
class
)
ViewModel
bindProjectDetailViewModel
(
ProjectDetailViewModel
projectDetailViewModel
);
@Binds
@IntoMap
@ViewModelFactory
.
ViewModelKey
(
SettingsActivityViewModel
.
class
)
ViewModel
bindSettingsActivityViewModel
(
SettingsActivityViewModel
settingsActivityViewModel
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/main/ProjectFragment.java
View file @
dc262836
package
cn
.
yunliyunwai
.
beyondclouds
.
ui
.
main
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.os.Bundle
;
import
android.text.InputType
;
import
android.view.LayoutInflater
;
...
...
@@ -27,12 +29,15 @@ import cn.yunliyunwai.beyondclouds.databinding.FragmentProjectBinding;
import
cn.yunliyunwai.beyondclouds.ui.common.FragmentFactory
;
import
cn.yunliyunwai.beyondclouds.ui.common.RefreshableFragment
;
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.ContextUtils
;
import
cn.yunliyunwai.beyondclouds.viewmodel.AuthenticationViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel
;
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
{
...
...
@@ -104,7 +109,18 @@ public class ProjectFragment extends BaseFragment<ProjectFragmentViewModel, Frag
@Override
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
This diff is collapsed.
Click to expand it.
app/src/main/res/layout/project_item.xml
View file @
dc262836
...
...
@@ -5,7 +5,6 @@
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@drawable/background_white_touchable"
android:clickable=
"true"
android:paddingStart=
"12dp"
android:paddingLeft=
"12dp"
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