Skip to content

Commit

Permalink
Merge pull request #17 from CofbroTeam/features/courseList_cofbro
Browse files Browse the repository at this point in the history
feat: 优化UI界面
  • Loading branch information
cofbro committed Oct 15, 2023
2 parents dddfb3c + 1095564 commit cbfcdf0
Show file tree
Hide file tree
Showing 28 changed files with 560 additions and 275 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- </intent-filter>-->
</activity>
<activity android:name=".profile.ProfileFragment"/>
<activity android:name=".mapsetting.InputTipsActivity" />
<activity android:name=".mapsetting.MapActivity" />

Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/com/cofbro/qian/friend/FriendFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.cofbro.qian.friend

import android.os.Bundle
import com.cofbro.hymvvmutils.base.BaseFragment
import com.cofbro.qian.databinding.FragmentFriendBinding

class FriendFragment : BaseFragment<FriendViewModel, FragmentFriendBinding>() {
override fun onAllViewCreated(savedInstanceState: Bundle?) {

}
}
7 changes: 7 additions & 0 deletions app/src/main/java/com/cofbro/qian/friend/FriendViewModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.cofbro.qian.friend

import com.cofbro.hymvvmutils.base.BaseViewModel
import com.cofbro.qian.utils.DefaultRepository

class FriendViewModel : BaseViewModel<DefaultRepository>() {
}
239 changes: 239 additions & 0 deletions app/src/main/java/com/cofbro/qian/home/HomeFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
package com.cofbro.qian.home

import android.content.Intent
import android.graphics.Rect
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.alibaba.fastjson.JSONObject
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.cofbro.hymvvmutils.base.BaseFragment
import com.cofbro.qian.data.URL
import com.cofbro.qian.databinding.FragmentHomeBinding
import com.cofbro.qian.main.CourseListAdapter
import com.cofbro.qian.utils.CacheUtils
import com.cofbro.qian.utils.Constants
import com.cofbro.qian.utils.dp2px
import com.cofbro.qian.utils.getStatusBarHeight
import com.cofbro.qian.utils.safeParseToJson
import com.cofbro.qian.wrapper.WrapperActivity
import com.hjq.toast.ToastUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class HomeFragment : BaseFragment<HomeViewModel, FragmentHomeBinding>() {
private var scrolledDx = 0
private var targetScrollDx = 0
private var mAdapter: CourseListAdapter? = null
private var data: JSONObject? = null

override fun onAllViewCreated(savedInstanceState: Bundle?) {
initView()
doNetwork()
initObserver()
}

// override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
// super.onActivityResult(requestCode, resultCode, data)
// if (resultCode == RESULT_OK) {
// val result = data?.getStringExtra("result")
// // SIGNIN:aid=402742574&source=15&Code=402742574&enc=548DF0246153AF088E756B59F33BF3F4
// val splitArray = result?.split("&")
// splitArray?.let {
// val aid = it[0].substringAfter("id")
// val enc = it[2].substringAfter("enc")
// signWithCamera(aid, enc)
// }
//
// }
// }

private fun initView() {
// toolBar
fitToolbar()

// 课程论列表
mAdapter = CourseListAdapter()
targetScrollDx = dp2px(requireContext(), 76)
binding?.rvCourseList?.apply {
// 滑动监听
addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
computeVerticalScrollOffset().let {
if (it > targetScrollDx) {
solidAppToolBar(255)
return
}
scrolledDx = it
}
solidAppToolBar(((scrolledDx.toFloat() / targetScrollDx.toFloat()) * 255).toInt())

Log.d(
"MainActivity",
"scrolledDx: $scrolledDx, dx: $dx, alpha: ${binding?.appToolBar?.background?.alpha}"
)
}
})

onFlingListener = object : RecyclerView.OnFlingListener() {
override fun onFling(velocityX: Int, velocityY: Int): Boolean {
Log.d("MainActivity", "onFling: $velocityY")
if (velocityY >= 1200) {
binding?.appToolBar?.background?.alpha = 255
}
return false
}

}

// 增加间距
addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
val defaultPadding = dp2px(requireContext(), 15)
val toolbarHeight = binding?.appToolBar?.height ?: 0
if (parent.layoutManager?.getPosition(view) == 0) {
return outRect.set(
defaultPadding,
toolbarHeight + dp2px(requireContext(), 5),
defaultPadding,
defaultPadding
)
} else if (parent.layoutManager?.getPosition(view) == getDataItemCount() - 1) {
return outRect.set(
defaultPadding,
0,
defaultPadding,
dp2px(requireContext(), 80)
)
}
return outRect.set(defaultPadding, 0, defaultPadding, defaultPadding)
}
})
}

/**
* ToolBar
*/
// 用户头像
val uid = CacheUtils.cache["uid"]
uid?.let {
val options = RequestOptions().transform(
CenterCrop(),
RoundedCorners(dp2px(requireContext(), 5))
)
Glide.with(this)
.load(URL.getAvtarImgPath(it))
.apply(options)
.into(binding!!.ivUserAvtar)
}

// 导航栏扫码签到
binding?.ivScanBtn?.setOnClickListener {
// TODO: 扫码之前需要预签到,预签到时机?

}
}

private fun fitToolbar() {
// 设置toolbar高度
val params = binding?.appToolBar?.layoutParams
params?.height = getStatusBarHeight(requireContext()) + dp2px(requireContext(), 45)
binding?.appToolBar?.layoutParams = params

// 设置toolbar透明度
solidAppToolBar(0)
}

private fun initObserver() {
// 课程列表
viewModel.loadCourseListLiveData.observe(this) {
lifecycleScope.launch(Dispatchers.IO) {
val s = it.data?.body?.string()
withContext(Dispatchers.Main) {
s?.let {
val jsonObject = it.safeParseToJson()
mAdapter?.setData(jsonObject)
data = jsonObject
binding?.rvCourseList?.adapter = mAdapter
binding?.rvCourseList?.layoutManager =
LinearLayoutManager(
requireContext(),
LinearLayoutManager.VERTICAL,
false
)
mAdapter?.setOnItemClickListener(object :
CourseListAdapter.AdapterListener {
override fun onItemClick(
courseId: String,
classId: String,
cpi: String
) {
toWrapperActivity(courseId, classId, cpi)
}
})
}
}
}
}

// 签到
viewModel.signLiveData.observe(this) {
lifecycleScope.launch(Dispatchers.IO) {
val data = it.data?.body?.string()
Log.d("MainActivity", "initObserver: $data")
}
ToastUtils.show("签到成功!")
}
}

private fun doNetwork() {
// 加载课程列表
viewModel.loadCourseList(URL.getAllCourseListPath())
}

private fun getDataItemCount(): Int {
data?.getJSONArray(Constants.CourseList.CHANNEL_LIST)?.let { array ->
return (array.size - 1).takeIf { it >= 0 } ?: 0
}
return 0
}

private fun solidAppToolBar(alpha: Int) {
binding?.appToolBar?.background?.alpha = alpha
}


private fun signWithCamera(aid: String, enc: String) {
val uid = CacheUtils.cache["uid"] ?: ""
// val url = "https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId=2000072435046&uid=$uid&enc=BC9662672047A2F2E4A607CC59762973&c=2000072435046&DB_STRATEGY=PRIMARY_KEY&STRATEGY_PARA=2000072435046"
val url =
"https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId=2000072435046&enc=BC9662672047A2F2E4A607CC59762973&fid=0"
Log.d("MainActivity", "url: $url")
//viewModel.signWithCamera(URL.getSignWithCameraPath(aid, uid, enc))
viewModel.signWithCamera(url)
//191970813
// https://mobilelearn.chaoxing.com/widget/sign/e?id=2000072435046&c=2000072435046&enc=BC9662672047A2F2E4A607CC59762973&DB_STRATEGY=PRIMARY_KEY&STRATEGY_PARA=id
}

private fun toWrapperActivity(courseId: String, classId: String, cpi: String) {
val intent = Intent(requireActivity(), WrapperActivity::class.java)
intent.apply {
putExtra("courseId", courseId)
putExtra("classId", classId)
putExtra("cpi", cpi)
}
startActivity(intent)
}
}
34 changes: 34 additions & 0 deletions app/src/main/java/com/cofbro/qian/home/HomeViewModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.cofbro.qian.home

import androidx.lifecycle.viewModelScope
import com.cofbro.hymvvmutils.base.BaseViewModel
import com.cofbro.hymvvmutils.base.ResponseMutableLiveData
import com.cofbro.qian.utils.DefaultRepository
import com.cofbro.qian.utils.NetworkUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import okhttp3.Response

class HomeViewModel : BaseViewModel<DefaultRepository>() {
val loadCourseListLiveData = ResponseMutableLiveData<Response>()
val signLiveData = ResponseMutableLiveData<Response>()


fun loadCourseList(url: String) {
viewModelScope.launch(Dispatchers.IO) {
repository.request(loadCourseListLiveData, false) {
val request = NetworkUtils.buildClientRequest(url)
NetworkUtils.request(request)
}
}
}

fun signWithCamera(url: String) {
viewModelScope.launch(Dispatchers.IO) {
repository.request(signLiveData, false) {
val request = NetworkUtils.buildClientRequest(url)
NetworkUtils.request(request)
}
}
}
}
7 changes: 1 addition & 6 deletions app/src/main/java/com/cofbro/qian/main/CourseListAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class CourseListAdapter : RecyclerView.Adapter<CourseListAdapter.CourseListViewH
}

override fun getItemCount(): Int {
data?.getJSONArray("channelList")?.let { array ->
data?.getJSONArray(Constants.CourseList.CHANNEL_LIST)?.let { array ->
return (array.size - 1).takeIf { it >= 0 } ?: 0
}
return 0
Expand Down Expand Up @@ -80,11 +80,6 @@ class CourseListAdapter : RecyclerView.Adapter<CourseListAdapter.CourseListViewH
.load(item?.getStringExt(Constants.CourseList.IMG_URL))
.apply(options)
.into(binding.ivClassAvtar)

// // 存储重要参数
// CacheUtils.cache["courseId"] = courseId ?: ""
// CacheUtils.cache["classId"] = classId ?: ""
// CacheUtils.cache["cpi"] = cpi ?: ""
itemView.setOnClickListener {
listener?.onItemClick(courseId, classId, cpi)
}
Expand Down
Loading

0 comments on commit cbfcdf0

Please sign in to comment.