diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c40aecd..8bbc36b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,6 +33,7 @@ + (FragmentMyBinding::inflat binding.ivEdit.setOnClickListener {} - binding.tvTotalCoin.setOnClickListener {} + binding.llTotalCoin.setOnClickListener { + startActivity( + Intent( + requireActivity(), + CanStatusActivity::class.java + ) + ) + } binding.tvChargeCoin.setOnClickListener {} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanApi.kt new file mode 100644 index 0000000..83f1d4b --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanApi.kt @@ -0,0 +1,36 @@ +package kr.co.vividnext.sodalive.mypage.can + +import io.reactivex.rxjava3.core.Single +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.mypage.can.status.GetCanStatusResponse +import kr.co.vividnext.sodalive.mypage.can.status.charge.GetCanChargeStatusResponseItem +import kr.co.vividnext.sodalive.mypage.can.status.use.GetCanUseStatusResponseItem +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface CanApi { + @GET("/can/status") + fun getCanStatus( + @Query("container") container: String = "aos", + @Header("Authorization") authHeader: String + ): Single> + + @GET("/can/status/use") + fun getCanUseStatus( + @Query("timezone") timezone: String, + @Query("page") page: Int, + @Query("size") size: Int, + @Query("container") container: String = "aos", + @Header("Authorization") authHeader: String + ): Single>> + + @GET("/can/status/charge") + fun getCanChargeStatus( + @Query("timezone") timezone: String, + @Query("page") page: Int, + @Query("size") size: Int, + @Query("container") container: String = "aos", + @Header("Authorization") authHeader: String + ): Single>> +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanRepository.kt new file mode 100644 index 0000000..a8f939b --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanRepository.kt @@ -0,0 +1,29 @@ +package kr.co.vividnext.sodalive.mypage.can + +import java.util.TimeZone + +class CanRepository(private val api: CanApi) { + fun getCanStatus(token: String) = api.getCanStatus(authHeader = token) + + fun getCanUseStatus( + page: Int, + pageSize: Int, + token: String + ) = api.getCanUseStatus( + timezone = TimeZone.getDefault().id, + page = page - 1, + size = pageSize, + authHeader = token + ) + + fun getCanChargeStatus( + page: Int, + pageSize: Int, + token: String + ) = api.getCanChargeStatus( + timezone = TimeZone.getDefault().id, + page = page - 1, + size = pageSize, + authHeader = token + ) +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/CanStatusActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/CanStatusActivity.kt new file mode 100644 index 0000000..2a82c9f --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/CanStatusActivity.kt @@ -0,0 +1,128 @@ +package kr.co.vividnext.sodalive.mypage.can.status + +import android.annotation.SuppressLint +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.activity.OnBackPressedCallback +import com.google.android.material.tabs.TabLayout +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.base.BaseActivity +import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.databinding.ActivityCanStatusBinding +import kr.co.vividnext.sodalive.extensions.moneyFormat +import kr.co.vividnext.sodalive.main.MainActivity +import kr.co.vividnext.sodalive.mypage.can.status.charge.CanChargeStatusFragment +import kr.co.vividnext.sodalive.mypage.can.status.use.CanUseStatusFragment +import org.koin.android.ext.android.inject + +class CanStatusActivity : BaseActivity( + ActivityCanStatusBinding::inflate +) { + + private val viewModel: CanStatusViewModel by inject() + private val onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + onClickBackButton() + } + } + + private lateinit var loadingDialog: LoadingDialog + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + + bindData() + viewModel.getCanStatus() + } + + override fun setupView() { + binding.toolbar.tvBack.text = "코인내역" + binding.toolbar.tvBack.setOnClickListener { onClickBackButton() } + binding.llChargeCoin.setOnClickListener {} + + loadingDialog = LoadingDialog(this, layoutInflater) + + val tabs = binding.tabs + tabs.addTab(tabs.newTab().setText("충전내역").setTag("charge_status")) + tabs.addTab(tabs.newTab().setText("사용내역").setTag("use_status")) + + changeFragment("charge_status") + + tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + val tag = tab.tag as String + changeFragment(tag) + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + } + + override fun onTabReselected(tab: TabLayout.Tab) { + } + }) + } + + private fun changeFragment(tag: String) { + val fragmentManager = supportFragmentManager + val fragmentTransaction = fragmentManager.beginTransaction() + + val currentFragment = fragmentManager.primaryNavigationFragment + if (currentFragment != null) { + fragmentTransaction.hide(currentFragment) + } + + var fragment = fragmentManager.findFragmentByTag(tag) + if (fragment == null) { + fragment = if (tag == "charge_status") { + CanChargeStatusFragment(viewModel) + } else { + CanUseStatusFragment(viewModel) + } + + fragmentTransaction.add(R.id.container, fragment, tag) + } else { + fragmentTransaction.show(fragment) + } + + fragmentTransaction.setPrimaryNavigationFragment(fragment) + fragmentTransaction.setReorderingAllowed(true) + fragmentTransaction.commitNow() + } + + @SuppressLint("SetTextI18n") + private fun bindData() { + viewModel.totalCoinLiveData.observe(this) { + binding.tvTotalCoin.text = it.moneyFormat() + } + + viewModel.paidCoinLiveData.observe(this) { + binding.tvPaidCoin.text = it.moneyFormat() + } + + viewModel.rewardCoinLiveData.observe(this) { + binding.tvRewardCoin.text = it.moneyFormat() + } + + viewModel.toastLiveData.observe(this) { + it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() } + } + + viewModel.isLoading.observe(this) { + if (it) { + loadingDialog.show(screenWidth) + } else { + loadingDialog.dismiss() + } + } + } + + private fun onClickBackButton() { + val intent = Intent(applicationContext, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + startActivity(intent) + finish() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/CanStatusViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/CanStatusViewModel.kt new file mode 100644 index 0000000..557d19f --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/CanStatusViewModel.kt @@ -0,0 +1,145 @@ +package kr.co.vividnext.sodalive.mypage.can.status + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.orhanobut.logger.Logger +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers +import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.mypage.can.CanRepository +import kr.co.vividnext.sodalive.mypage.can.status.charge.GetCanChargeStatusResponseItem +import kr.co.vividnext.sodalive.mypage.can.status.use.GetCanUseStatusResponseItem + +class CanStatusViewModel(private val repository: CanRepository) : BaseViewModel() { + private val _totalCoinLiveData = MutableLiveData() + val totalCoinLiveData: LiveData + get() = _totalCoinLiveData + + private val _paidCoinLiveData = MutableLiveData() + val paidCoinLiveData: LiveData + get() = _paidCoinLiveData + + private val _rewardCoinLiveData = MutableLiveData() + val rewardCoinLiveData: LiveData + get() = _rewardCoinLiveData + + private val _coinUseStatusLiveData = MutableLiveData>() + val coinUseStatusLiveData: LiveData> + get() = _coinUseStatusLiveData + + private val _coinChargeStatusLiveData = MutableLiveData>() + val coinChargeStatusLiveData: LiveData> + get() = _coinChargeStatusLiveData + + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData + get() = _toastLiveData + + private var _isLoading = MutableLiveData(false) + val isLoading: LiveData + get() = _isLoading + + private val pageSize = 20 + private var canUsesPage = 1 + + fun getCanStatus() { + _isLoading.value = true + compositeDisposable.add( + repository.getCanStatus("Bearer ${SharedPreferenceManager.token}") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _isLoading.value = false + if (it.success && it.data != null) { + _totalCoinLiveData.postValue(it.data.chargeCan + it.data.rewardCan) + _paidCoinLiveData.postValue(it.data.chargeCan) + _rewardCoinLiveData.postValue(it.data.rewardCan) + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } + + fun getCoinUseStatus() { + _isLoading.value = true + compositeDisposable.add( + repository.getCanUseStatus( + canUsesPage, + pageSize, + "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _isLoading.value = false + if (it.success && it.data != null) { + _coinUseStatusLiveData.postValue(it.data!!) + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } + + fun getCanChargeStatus() { + _isLoading.value = true + compositeDisposable.add( + repository.getCanChargeStatus( + canUsesPage, + pageSize, + "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _isLoading.value = false + if (it.success && it.data != null) { + _coinChargeStatusLiveData.postValue(it.data!!) + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/GetCanStatusResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/GetCanStatusResponse.kt new file mode 100644 index 0000000..ca18cf4 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/GetCanStatusResponse.kt @@ -0,0 +1,10 @@ +package kr.co.vividnext.sodalive.mypage.can.status + +import com.google.gson.annotations.SerializedName + +data class GetCanStatusResponse( + @SerializedName("chargeCan") + val chargeCan: Int, + @SerializedName("rewardCan") + val rewardCan: Int +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusAdapter.kt new file mode 100644 index 0000000..29f0da0 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusAdapter.kt @@ -0,0 +1,37 @@ +package kr.co.vividnext.sodalive.mypage.can.status.charge + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.databinding.ItemCanChargeStatusBinding + +class CanChargeStatusAdapter : RecyclerView.Adapter() { + + val items = mutableListOf() + + inner class ViewHolder( + private val binding: ItemCanChargeStatusBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: GetCanChargeStatusResponseItem) { + binding.tvTitle.text = item.coinTitle + binding.tvDate.text = item.date + binding.tvChargeMethod.text = item.chargeMethod + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ItemCanChargeStatusBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: CanChargeStatusAdapter.ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount() = items.count() +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusFragment.kt new file mode 100644 index 0000000..76eedd4 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusFragment.kt @@ -0,0 +1,84 @@ +package kr.co.vividnext.sodalive.mypage.can.status.charge + +import android.annotation.SuppressLint +import android.graphics.Rect +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.databinding.FragmentCanStatusBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.mypage.can.status.CanStatusViewModel + +class CanChargeStatusFragment( + private val viewModel: CanStatusViewModel +) : BaseFragment( + FragmentCanStatusBinding::inflate +) { + + private lateinit var adapter: CanChargeStatusAdapter + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupView() + bindData() + viewModel.getCanChargeStatus() + } + + @SuppressLint("NotifyDataSetChanged") + private fun setupView() { + val recyclerView = binding.rvCoinStatus + adapter = CanChargeStatusAdapter() + + recyclerView.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.VERTICAL, + false + ) + + recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.top = 13.3f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + + adapter.itemCount - 1 -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 13.3f.dpToPx().toInt() + } + + else -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + } + } + }) + + recyclerView.adapter = adapter + } + + @SuppressLint("NotifyDataSetChanged") + private fun bindData() { + viewModel.coinChargeStatusLiveData.observe(viewLifecycleOwner) { + adapter.items.addAll(it) + adapter.notifyDataSetChanged() + } + + viewModel.toastLiveData.observe(viewLifecycleOwner) { + it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/GetCanChargeStatusResponseItem.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/GetCanChargeStatusResponseItem.kt new file mode 100644 index 0000000..c36596e --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/GetCanChargeStatusResponseItem.kt @@ -0,0 +1,12 @@ +package kr.co.vividnext.sodalive.mypage.can.status.charge + +import com.google.gson.annotations.SerializedName + +data class GetCanChargeStatusResponseItem( + @SerializedName("coinTitle") + val coinTitle: String, + @SerializedName("date") + val date: String, + @SerializedName("chargeMethod") + val chargeMethod: String +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusAdapter.kt new file mode 100644 index 0000000..8f76d36 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusAdapter.kt @@ -0,0 +1,37 @@ +package kr.co.vividnext.sodalive.mypage.can.status.use + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.databinding.ItemCanUseStatusBinding + +class CanUseStatusAdapter : RecyclerView.Adapter() { + + val items = mutableListOf() + + inner class ViewHolder( + private val binding: ItemCanUseStatusBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: GetCanUseStatusResponseItem) { + binding.tvTitle.text = item.title + binding.tvDate.text = item.date + binding.tvCoin.text = "${item.can}" + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ItemCanUseStatusBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount() = items.count() +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusFragment.kt new file mode 100644 index 0000000..d1fa376 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusFragment.kt @@ -0,0 +1,83 @@ +package kr.co.vividnext.sodalive.mypage.can.status.use + +import android.annotation.SuppressLint +import android.graphics.Rect +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.databinding.FragmentCanStatusBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.mypage.can.status.CanStatusViewModel + +class CanUseStatusFragment( + private val viewModel: CanStatusViewModel +) : BaseFragment( + FragmentCanStatusBinding::inflate +) { + + private lateinit var adapter: CanUseStatusAdapter + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupView() + bindData() + viewModel.getCoinUseStatus() + } + + private fun setupView() { + val recyclerView = binding.rvCoinStatus + adapter = CanUseStatusAdapter() + + recyclerView.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.VERTICAL, + false + ) + + recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.top = 13.3f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + + adapter.itemCount - 1 -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 13.3f.dpToPx().toInt() + } + + else -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + } + } + }) + + recyclerView.adapter = adapter + } + + @SuppressLint("NotifyDataSetChanged") + private fun bindData() { + viewModel.coinUseStatusLiveData.observe(viewLifecycleOwner) { + adapter.items.addAll(it) + adapter.notifyDataSetChanged() + } + + viewModel.toastLiveData.observe(viewLifecycleOwner) { + it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/GetCanUseStatusResponseItem.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/GetCanUseStatusResponseItem.kt new file mode 100644 index 0000000..acae61c --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/GetCanUseStatusResponseItem.kt @@ -0,0 +1,12 @@ +package kr.co.vividnext.sodalive.mypage.can.status.use + +import com.google.gson.annotations.SerializedName + +data class GetCanUseStatusResponseItem( + @SerializedName("title") + val title: String, + @SerializedName("date") + val date: String, + @SerializedName("can") + val can: Int +) diff --git a/app/src/main/res/drawable/bg_round_corner_10_80d8ff.xml b/app/src/main/res/drawable/bg_round_corner_10_80d8ff.xml new file mode 100644 index 0000000..3164383 --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_10_80d8ff.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_16_7_111111.xml b/app/src/main/res/drawable/bg_round_corner_16_7_111111.xml new file mode 100644 index 0000000..62d0755 --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_16_7_111111.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_top_round_corner_16_7_222222.xml b/app/src/main/res/drawable/bg_top_round_corner_16_7_222222.xml new file mode 100644 index 0000000..90e9f20 --- /dev/null +++ b/app/src/main/res/drawable/bg_top_round_corner_16_7_222222.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_can_status.xml b/app/src/main/res/layout/activity_can_status.xml new file mode 100644 index 0000000..41ae6b0 --- /dev/null +++ b/app/src/main/res/layout/activity_can_status.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_can_status.xml b/app/src/main/res/layout/fragment_can_status.xml new file mode 100644 index 0000000..3dd3189 --- /dev/null +++ b/app/src/main/res/layout/fragment_can_status.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_my.xml b/app/src/main/res/layout/fragment_my.xml index 346dd69..13f8d31 100644 --- a/app/src/main/res/layout/fragment_my.xml +++ b/app/src/main/res/layout/fragment_my.xml @@ -166,6 +166,7 @@ android:padding="13.3dp"> + + + + + + + + + diff --git a/app/src/main/res/layout/item_can_use_status.xml b/app/src/main/res/layout/item_can_use_status.xml new file mode 100644 index 0000000..421879a --- /dev/null +++ b/app/src/main/res/layout/item_can_use_status.xml @@ -0,0 +1,50 @@ + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 16423fe..bfa1e17 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -29,4 +29,6 @@ #88909090 #339970FF #7FE2E2E2 + #80DFFF + #1313BC diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 322502a..c742e17 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -22,4 +22,8 @@ @color/color_9970ff @color/color_9970ff + +