From 0886fe19cb4b8b56ef3582592332c46ff412f53f Mon Sep 17 00:00:00 2001 From: leiyun Date: Thu, 12 May 2022 19:14:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E7=B1=8D=E5=BC=82=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 11 +- app/build.gradle | 9 +- .../main/java/com/yzx/escreen/MainActivity.kt | 211 ++++++-- .../com/yzx/escreen/activity/WebActivity.kt | 1 + .../yzx/escreen/activity/base/BaseActivity.kt | 26 +- .../adapter/ChangeDialogStepAdapter.kt | 94 ++++ .../yzx/escreen/adapter/ChangeListAdapter.kt | 80 +++ .../java/com/yzx/escreen/config/Config.kt | 26 + .../com/yzx/escreen/config/RefreshToken.kt | 53 ++ .../com/yzx/escreen/config/YzxInterface.kt | 47 +- .../yzx/escreen/fragment/ChangeFragment.kt | 484 +++++++++++++++++ .../com/yzx/escreen/fragment/HomeFragment.kt | 105 ++-- .../com/yzx/escreen/fragment/MyFragment.kt | 25 +- .../yzx/escreen/fragment/base/BaseFragment.kt | 11 + .../com/yzx/escreen/model/MessageEvent.kt | 38 ++ .../java/com/yzx/escreen/model/ReToken.kt | 5 + .../java/com/yzx/escreen/model/StuChange.kt | 209 ++++++++ .../java/com/yzx/escreen/model/StuLeave.kt | 23 +- .../yzx/escreen/presenter/ChangePresenter.kt | 77 +++ .../yzx/escreen/presenter/MainPresenter.kt | 46 ++ .../java/com/yzx/escreen/utils/KotlinX.kt | 29 +- .../java/com/yzx/escreen/widget/BaseDialog.kt | 14 + .../com/yzx/escreen/widget/ChangeDialog.kt | 122 +++++ .../com/yzx/escreen/widget/LeaveDialog.kt | 95 ++++ .../java/com/yzx/escreen/widget/TimeView.kt | 28 + app/src/main/res/layout/activity_main.xml | 61 ++- app/src/main/res/layout/dialog_change.xml | 196 +++++++ app/src/main/res/layout/dialog_leave.xml | 4 +- app/src/main/res/layout/fragment_change.xml | 269 ++++++++++ app/src/main/res/layout/fragment_home.xml | 487 +++++++++--------- app/src/main/res/layout/fragment_my.xml | 7 +- .../main/res/layout/layout_change_table.xml | 95 ++++ app/src/main/res/layout/view_time.xml | 48 ++ .../main/res/mipmap-mdpi/change_select.png | Bin 0 -> 827 bytes .../main/res/mipmap-mdpi/change_unselect.png | Bin 0 -> 1201 bytes app/src/main/res/mipmap-mdpi/leave_select.png | Bin 0 -> 1270 bytes .../main/res/mipmap-mdpi/leave_unselect.png | Bin 0 -> 1579 bytes app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/ids.xml | 5 + app/src/main/res/values/styles.xml | 18 + 40 files changed, 2646 insertions(+), 415 deletions(-) create mode 100644 app/src/main/java/com/yzx/escreen/adapter/ChangeDialogStepAdapter.kt create mode 100644 app/src/main/java/com/yzx/escreen/adapter/ChangeListAdapter.kt create mode 100644 app/src/main/java/com/yzx/escreen/config/RefreshToken.kt create mode 100644 app/src/main/java/com/yzx/escreen/fragment/ChangeFragment.kt create mode 100644 app/src/main/java/com/yzx/escreen/model/MessageEvent.kt create mode 100644 app/src/main/java/com/yzx/escreen/model/ReToken.kt create mode 100644 app/src/main/java/com/yzx/escreen/model/StuChange.kt create mode 100644 app/src/main/java/com/yzx/escreen/presenter/ChangePresenter.kt create mode 100644 app/src/main/java/com/yzx/escreen/presenter/MainPresenter.kt create mode 100644 app/src/main/java/com/yzx/escreen/widget/ChangeDialog.kt create mode 100644 app/src/main/java/com/yzx/escreen/widget/LeaveDialog.kt create mode 100644 app/src/main/java/com/yzx/escreen/widget/TimeView.kt create mode 100644 app/src/main/res/layout/dialog_change.xml create mode 100644 app/src/main/res/layout/fragment_change.xml create mode 100644 app/src/main/res/layout/layout_change_table.xml create mode 100644 app/src/main/res/layout/view_time.xml create mode 100644 app/src/main/res/mipmap-mdpi/change_select.png create mode 100644 app/src/main/res/mipmap-mdpi/change_unselect.png create mode 100644 app/src/main/res/mipmap-mdpi/leave_select.png create mode 100644 app/src/main/res/mipmap-mdpi/leave_unselect.png create mode 100644 app/src/main/res/values/ids.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 6a960de..1dc7814 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,23 +13,28 @@ - + + - - + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 6fe19b3..5096c89 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,6 +8,9 @@ apply plugin: 'kotlin-android-extensions' //apply plugin: 'org.greenrobot.greendao' +androidExtensions { + experimental = true +} android { compileSdkVersion 30 buildToolsVersion "30.0.3" @@ -16,8 +19,8 @@ android { // minSdkVersion 26 minSdkVersion 21 targetSdkVersion 25 - versionCode 9 - versionName "2.0.7" + versionCode 10 + versionName "2.0.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // ndk { @@ -187,4 +190,6 @@ dependencies { api 'com.tencent.tbs:tbssdk:44181' implementation 'com.github.HuanTanSheng:EasyPhotos:3.1.5' + + implementation("org.greenrobot:eventbus:3.3.1") } diff --git a/app/src/main/java/com/yzx/escreen/MainActivity.kt b/app/src/main/java/com/yzx/escreen/MainActivity.kt index a1dc9ce..0355f61 100644 --- a/app/src/main/java/com/yzx/escreen/MainActivity.kt +++ b/app/src/main/java/com/yzx/escreen/MainActivity.kt @@ -4,12 +4,15 @@ import android.annotation.SuppressLint import android.app.Dialog import android.content.Context import android.content.Intent -import android.text.InputType +import android.os.Handler +import android.os.Looper import android.util.Log import android.view.KeyEvent import android.view.View +import android.view.ViewGroup import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.widget.ContentLoadingProgressBar import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter @@ -30,33 +33,41 @@ import com.qmuiteam.qmui.widget.dialog.QMUIDialog import com.yzx.escreen.activity.WebActivity import com.yzx.escreen.activity.base.BaseActivity import com.yzx.escreen.config.Config +import com.yzx.escreen.config.RefreshToken +import com.yzx.escreen.fragment.ChangeFragment import com.yzx.escreen.fragment.HomeFragment import com.yzx.escreen.fragment.MyFragment -import com.yzx.escreen.model.BaseBean -import com.yzx.escreen.model.TabEntity -import com.yzx.escreen.model.User -import com.yzx.escreen.model.Version -import com.yzx.escreen.presenter.base.BasePresenter +import com.yzx.escreen.model.* +import com.yzx.escreen.presenter.MainPresenter +import com.yzx.escreen.presenter.MainView +import com.yzx.escreen.presenter.base.JsonCallBack +import com.yzx.escreen.presenter.base.YzxResponse import com.yzx.escreen.utils.hideNavigationBar import com.yzx.escreen.widget.BaseDialog +import com.yzx.escreen.widget.ChangeDialog +import com.yzx.escreen.widget.LeaveDialog +import com.yzx.webebook.config.YzxInterface import kotlinx.android.synthetic.main.activity_main.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode import org.jetbrains.anko.find import org.jetbrains.anko.toast import java.util.* -import kotlin.system.exitProcess /** * Yun.Lei * 2020年5月6日14:49:10 */ -class MainActivity : BaseActivity>(), NetworkUtils.OnNetworkStatusChangedListener { +class MainActivity : BaseActivity(), NetworkUtils.OnNetworkStatusChangedListener, + MainView { override val inflateId: Int get() = R.layout.activity_main - var netLoadingDialog:QMUIDialog? = null - var netErrorDialog:QMUIDialog? = null + var netLoadingDialog: QMUIDialog? = null + var netErrorDialog: QMUIDialog? = null private val netLoadingRun = Runnable { netLoadingDialog?.apply { dismiss() @@ -64,23 +75,56 @@ class MainActivity : BaseActivity>(), NetworkUtils.OnNetworkSta showNetworkError() } - override fun initView() { + private val mHandler = Handler(Looper.getMainLooper()) + private val runnable = object : Runnable { + override fun run() { + mPresenter?.getLeaveShowIds() + mHandler.postDelayed(this, 2000) + } + } + + private val mTimeHandler = Handler(Looper.getMainLooper()) + private val timeRunnable = object : Runnable { + override fun run() { + EventBus.getDefault().post(TimeShow().getNowObj()) + mTimeHandler.postDelayed(this, 1000) + } + } + + private val dialogList = mutableListOf() - if(NetworkUtils.isConnected()){ - if (!User.isLogin()) { + override fun initView() { + if (NetworkUtils.isConnected()) { + if (!User.isLogin() && User.getUser().token.isEmpty()) { WebActivity.active(this, "${Config.OA_URL}/login") finish() } - checkVersion() - }else{ + if(!User.isLogin()){ + RefreshToken.refresh(object :RefreshToken.RefreshCallback{ + override fun onSuccess() { + checkVersion() + checkAuto() + } + }) + }else{ + checkVersion() + checkAuto() + RefreshToken.refresh(object :RefreshToken.RefreshCallback{ + override fun onSuccess() { + } + }) + } + } else { showNetworkLoading() //显示网络检查中 } val tabData = arrayListOf() - tabData.add(TabEntity("首页", R.mipmap.home_select, R.mipmap.home_unselect)) + tabData.add(TabEntity("学生请假", R.mipmap.leave_select, R.mipmap.leave_unselect)) + tabData.add(TabEntity("学籍异动", R.mipmap.change_select, R.mipmap.change_unselect)) tabData.add(TabEntity("我的", R.mipmap.my_select, R.mipmap.my_unselect)) tabLayout.setTabData(tabData) viewPager2.adapter = HomePagerAdapter(this) + viewPager2.offscreenPageLimit = 2 viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position) @@ -89,14 +133,85 @@ class MainActivity : BaseActivity>(), NetworkUtils.OnNetworkSta }) tabLayout.setOnTabSelectListener(object : OnTabSelectListener { override fun onTabSelect(position: Int) { - viewPager2.currentItem = position - KeyboardUtils.hideSoftInput( viewPager2) +// viewPager2.currentItem = position + viewPager2.setCurrentItem(position,false) + KeyboardUtils.hideSoftInput(viewPager2) } override fun onTabReselect(position: Int) { } }) + + mTimeHandler.post(timeRunnable) + } + + private fun checkAuto() { + val isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_leave", false) + val isAutoShowChange = SPUtils.getInstance().getBoolean("auto_show_change", false) + if (isAutoShowLeave || isAutoShowChange) { + mHandler.postDelayed(runnable, 2000) + } else { + mHandler.removeCallbacks(runnable) + } + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: AutoSwitchChange) { + checkAuto() + } + + //接收请假消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(detail: StuLeave) { + removeOld(detail.id,0) + val dialog = LeaveDialog(this) + dialog.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + dialog.setData(detail) + dialog.setTag(R.id.tag_dialog_name,detail.id) + dialog.setTag(R.id.tag_dialog_type,0) + dialog.onCloseClick = { + dialogLayout.removeView(it) + dialogList.remove(it) + } + dialogLayout.addView(dialog) + dialogList.add(dialog) + } + + //接收异动消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(detail: StuChange) { + removeOld(detail.id,1) + val dialog = ChangeDialog(this) + dialog.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + dialog.setData(detail) + dialog.setTag(R.id.tag_dialog_name,detail.id) + dialog.setTag(R.id.tag_dialog_type,1) + dialog.onCloseClick = { + dialogLayout.removeView(it) + dialogList.remove(it) + } + dialogLayout.addView(dialog,0) //请假权限更高,异动插入到最底层 + dialogList.add(dialog) + } + + private fun removeOld(id:Int, type:Int){ + val view = dialogList.find { + val tagId: Int = it.getTag(R.id.tag_dialog_name) as Int + val tagType: Int = it.getTag(R.id.tag_dialog_type) as Int + return@find id == tagId && type == tagType + } + view?.apply { + dialogList.remove(this) + dialogLayout.removeView(this) + } } override fun initData() { @@ -121,39 +236,38 @@ class MainActivity : BaseActivity>(), NetworkUtils.OnNetworkSta } - private fun showNetworkError(){ - if(!NetworkUtils.isConnected()){ //无网提示 + private fun showNetworkError() { + if (!NetworkUtils.isConnected()) { //无网提示 val builder = QMUIDialog.MessageDialogBuilder(this) builder.setMessage("你还没有连接网络,请先连接网络!") .setTitle("温馨提示") - .addAction("去设置" + .addAction( + "去设置" ) { dialog, index -> NetworkUtils.openWirelessSettings() } .setCancelable(false) .setCanceledOnTouchOutside(false) - netErrorDialog = builder.show() + netErrorDialog = builder.show() netErrorDialog?.hideNavigationBar() } } - private fun showNetworkLoading(){ + private fun showNetworkLoading() { val builder = QMUIDialog.MessageDialogBuilder(this) builder.setMessage("网络检查中,请稍后...") .setTitle("温馨提示") .setCancelable(false) .setCanceledOnTouchOutside(false) - netLoadingDialog = builder.show() + netLoadingDialog = builder.show() netLoadingDialog?.hideNavigationBar() - viewPager2.postDelayed(netLoadingRun,5000) + viewPager2.postDelayed(netLoadingRun, 5000) } - override fun initPresenter(): BasePresenter<*>? { - return null - } + override fun initPresenter(): MainPresenter = MainPresenter(this) @SuppressLint("SetTextI18n") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -177,12 +291,12 @@ class MainActivity : BaseActivity>(), NetworkUtils.OnNetworkSta override fun onConnected(networkType: NetworkUtils.NetworkType?) { netLoadingDialog?.apply { - if(isShowing){ + if (isShowing) { dismiss() } } netErrorDialog?.apply { - if(isShowing){ + if (isShowing) { dismiss() } } @@ -192,13 +306,14 @@ class MainActivity : BaseActivity>(), NetworkUtils.OnNetworkSta finish() } checkVersion() + checkAuto() } private fun checkVersion(userCheck: Boolean = false): Unit { val BASE_URL = Config.BASE_URL OkGo.post("$BASE_URL/parent/common/getInkBottleMaxVersion") .tag(this) - .params("app_id",Config.APP_ID) + .params("app_id", Config.APP_ID) .execute(object : StringCallback() { override fun onSuccess(response: Response) { @@ -294,10 +409,39 @@ class MainActivity : BaseActivity>(), NetworkUtils.OnNetworkSta }) .executeMission(this) } + + override fun onLeaveIDsSuccess(list: MutableList) { + val listLeave = list.filter { it.type == 0 }.toMutableList() + val listChange = list.filter { it.type == 1 }.toMutableList() + var type =0 + if(listLeave.isNotEmpty()){ + viewPager2.currentItem = 0 + type =0 + }else if(listChange.isNotEmpty()){ + viewPager2.currentItem = 1 + type =1 + } + if(list.isNotEmpty()){ + viewPager2.postDelayed({ + EventBus.getDefault().post(MessageEventAuto(list,type)) + },500) + } + } + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + override fun onStop() { + mHandler.removeCallbacks(runnable) + super.onStop() + EventBus.getDefault().unregister(this) + } } class HomePagerAdapter(act: AppCompatActivity) : FragmentStateAdapter(act) { - override fun getItemCount(): Int = 2 + override fun getItemCount(): Int = 3 override fun createFragment(position: Int): Fragment { when (position) { @@ -305,6 +449,9 @@ class HomePagerAdapter(act: AppCompatActivity) : FragmentStateAdapter(act) { return HomeFragment.getNewInstance() } 1 -> { + return ChangeFragment.getNewInstance() + } + 2 -> { return MyFragment.getNewInstance() } } diff --git a/app/src/main/java/com/yzx/escreen/activity/WebActivity.kt b/app/src/main/java/com/yzx/escreen/activity/WebActivity.kt index 10c7b45..5b86c8b 100644 --- a/app/src/main/java/com/yzx/escreen/activity/WebActivity.kt +++ b/app/src/main/java/com/yzx/escreen/activity/WebActivity.kt @@ -398,6 +398,7 @@ class YzxJavascriptInterface(var ctx: Activity) { @JavascriptInterface fun toHome() { ctx.startActivity() + ctx.finish() } @JavascriptInterface diff --git a/app/src/main/java/com/yzx/escreen/activity/base/BaseActivity.kt b/app/src/main/java/com/yzx/escreen/activity/base/BaseActivity.kt index a1d6184..0e23f6a 100644 --- a/app/src/main/java/com/yzx/escreen/activity/base/BaseActivity.kt +++ b/app/src/main/java/com/yzx/escreen/activity/base/BaseActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity +import com.blankj.utilcode.util.BarUtils import com.gyf.immersionbar.ktx.immersionBar import com.yzx.escreen.R import com.yzx.escreen.presenter.base.BasePresenter @@ -44,6 +45,8 @@ abstract class BaseActivity> : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) hideBottomUIMenu() + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN + actionBar?.hide() setContentView(inflateId) initView() initData() @@ -52,13 +55,13 @@ abstract class BaseActivity> : AppCompatActivity() { } open fun setStatusBar() { - immersionBar { - statusBarColor(R.color.white) - fitsSystemWindows(true) - statusBarDarkFont(true, 0.2f) - keyboardEnable(true) - init() - } +// immersionBar { +// statusBarColor(R.color.white) +// fitsSystemWindows(false) +// statusBarDarkFont(true, 0.2f) +// keyboardEnable(true) +// init() +// } } @@ -67,15 +70,6 @@ abstract class BaseActivity> : AppCompatActivity() { params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE window.attributes = params - -// window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION -// window.decorView.setOnSystemUiVisibilityChangeListener { -// val uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or -// View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or -// View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or -// View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN -// window.decorView.systemUiVisibility = uiOptions -// } } diff --git a/app/src/main/java/com/yzx/escreen/adapter/ChangeDialogStepAdapter.kt b/app/src/main/java/com/yzx/escreen/adapter/ChangeDialogStepAdapter.kt new file mode 100644 index 0000000..a513872 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/adapter/ChangeDialogStepAdapter.kt @@ -0,0 +1,94 @@ +package com.yzx.escreen.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.escreen.R +import com.yzx.escreen.model.ChangeActivity +import com.yzx.escreen.utils.setSrc +import com.yzx.escreen.utils.toTime +import kotlinx.android.synthetic.main.layout_leave_step.view.* +import org.jetbrains.anko.dip + +class ChangeDialogStepAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_leave_step, list) { + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: ChangeActivity) { + holder.itemView.inImg.visibility = View.GONE + holder.itemView.visibility = View.VISIBLE + holder.itemView.addUserTypeName.visibility = View.GONE + holder.itemView.activityName.visibility = View.GONE + holder.itemView.addUserName.visibility = View.VISIBLE + when (item.is_approve) { + 0 -> { + + holder.itemView.addUserTypeName.visibility = View.GONE + holder.itemView.addUserName.text = "${item.add_user_name}发起异动申请${ + if (item.is_auto_pass == 1) { + "(直接通过)" + } else { + "" + } + }" + holder.itemView.approvalComments.visibility = View.GONE + } + 1 -> { + holder.itemView.addUserName.text = "班主任审批" + holder.itemView.statusName.text = when (item.approval_status) { + 0,1 -> "(待审批)" + 2 -> "(通过)" + 3 -> "(拒绝)" + else -> "" + } + holder.itemView.statusName.setTextColor(when (item.approval_status) { + 0,1 -> Color.parseColor("#3c7ef6") + 2 -> Color.parseColor("#07c160") + 3 -> Color.parseColor("#ff4040") + else -> 0 + }) + holder.itemView.approvalComments.visibility = View.VISIBLE + var str = "审批人:${item.add_user_name}" + if (item.approval_comments.isNotEmpty()) { + str += "。${item.approval_comments}" + } + holder.itemView.approvalComments.text = str + } + 2->{ + holder.itemView.addUserName.text = "提前结束" + holder.itemView.approvalComments.visibility = View.VISIBLE + var str = "操作人:${item.add_user_name}" + if (item.approval_comments.isNotEmpty()) { + str += "。${item.approval_comments}" + } + holder.itemView.approvalComments.text = str + } + else -> { + holder.itemView.visibility = View.GONE + } + } + + holder.itemView.signImg.visibility = if(item.sign_key?.isNotEmpty() == true){ + holder.itemView.signImg.setSrc(item.sign_identity,item.sign_key) + View.VISIBLE + }else{ + View.GONE + } + + holder.itemView.stepTime.text = item.add_time.toTime() + + if (holder.adapterPosition == 0) { + holder.itemView.line1.setBackgroundResource(R.color.transparent) + } else { + holder.itemView.line1.setBackgroundResource(R.color.gray_1) + } + + if (holder.adapterPosition == data.size - 1) { + holder.itemView.contentLayout.setPadding(0, 0, 0, 0) + } else { + holder.itemView.contentLayout.setPadding(0, 0, 0, holder.itemView.contentLayout.dip(20)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/adapter/ChangeListAdapter.kt b/app/src/main/java/com/yzx/escreen/adapter/ChangeListAdapter.kt new file mode 100644 index 0000000..b5cd395 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/adapter/ChangeListAdapter.kt @@ -0,0 +1,80 @@ +package com.yzx.escreen.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.escreen.R +import com.yzx.escreen.model.StuChange +import com.yzx.escreen.utils.setSrc +import com.yzx.escreen.utils.toDay +import com.yzx.escreen.utils.toTime +import kotlinx.android.synthetic.main.layout_change_table.view.* +import org.jetbrains.anko.textColor + +class ChangeListAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_change_table, list) { + + init { + addChildClickViewIds(R.id.cancelBtn) + } + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: StuChange) { + holder.itemView.studentName.text = item.status_change_student_name + if (item.face_key.isNullOrBlank()) { + holder.itemView.faceEmpty.visibility = View.VISIBLE + holder.itemView.faceImg.visibility = View.GONE + } else { + holder.itemView.faceImg.visibility = View.VISIBLE + holder.itemView.faceEmpty.visibility = View.GONE + holder.itemView.faceImg.setSrc(item.face_identity, item.face_key) + } + holder.itemView.className.text = "${item.grade_name}${item.class_name}" + holder.itemView.typeName.text = item.status_change_type_name + + var time = "--" + if (item.start_time > 0) { + time = item.start_time.toDay() + } + if (item.end_time > 0) { + time = "$time -- ${item.end_time.toDay()}" + } + holder.itemView.leaveTime.text = time + + holder.itemView.statusName.text = when (item.status) { + 1 -> "待处理" + 2 -> "已确认" + 3 -> "已拒绝" + else -> "--" + } + holder.itemView.statusName.textColor = when (item.status) { + 1 -> Color.parseColor("#333333") + 2 -> Color.parseColor("#3c7ef6") + 3 -> Color.parseColor("#ff4040") + 4 -> Color.parseColor("#3c7ef6") + 5 -> Color.parseColor("#ff4040") + else -> Color.parseColor("#333333") + } + if (item.getSubStatusName().isNotEmpty()) { + holder.itemView.subStatusName.text = "(${item.getSubStatusName()})" + holder.itemView.subStatusName.textColor = when (item.sub_status) { + 0, 2 -> Color.parseColor("#ff4040") + 1, 3 -> Color.parseColor("#07c160") + else -> Color.parseColor("#333333") + } + } else { + holder.itemView.subStatusName.text = "" + } + + holder.itemView.applyTime.text = item.add_time.toTime() + + holder.itemView.bottomLine.visibility = if (holder.adapterPosition == data.size - 1) { + View.GONE + } else { + View.VISIBLE + } + holder.itemView.addUser.text = item.add_user_name + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/config/Config.kt b/app/src/main/java/com/yzx/escreen/config/Config.kt index 495ec40..01a2308 100644 --- a/app/src/main/java/com/yzx/escreen/config/Config.kt +++ b/app/src/main/java/com/yzx/escreen/config/Config.kt @@ -1,6 +1,7 @@ package com.yzx.escreen.config import com.yzx.escreen.BuildConfig +import com.yzx.escreen.model.StuChangeType object Config { var BASE_URL = BuildConfig.BASE_URL @@ -8,4 +9,29 @@ object Config { var M_URL = BuildConfig.M_URL var OA_URL = BuildConfig.OA_URL val APP_ID = 602 + + + const val STU_CHANGE_STATUS_DROP_OUT = 42001 + const val STU_CHANGE_STATUS_LEAVE_SCHOOL = 42002 + const val STU_CHANGE_STATUS_RETURN_SCHOOL = 42003 + const val STU_CHANGE_STATUS_OUT_SCHOOL = 42004 + const val STU_CHANGE_STATUS_TRANSFER_SCHOOL = 42005 + const val STU_CHANGE_STATUS_REPEAT = 42006 + const val STU_CHANGE_STATUS_DOWNGRADE = 42007 + const val STU_CHANGE_STATUS_TRANSFER_OUT = 42008 + const val STU_CHANGE_STATUS_INTROSPECTION = 42009 + const val STU_CHANGE_STATUS_INTERNSHIP = 42010 + + val STU_CHANGE_STATUS_LIST = mutableListOf( + StuChangeType(STU_CHANGE_STATUS_DROP_OUT,"辍学",""), + StuChangeType(STU_CHANGE_STATUS_LEAVE_SCHOOL,"休学",""), + StuChangeType(STU_CHANGE_STATUS_RETURN_SCHOOL,"复学",""), + StuChangeType(STU_CHANGE_STATUS_OUT_SCHOOL,"退学",""), + StuChangeType(STU_CHANGE_STATUS_TRANSFER_SCHOOL,"转学",""), + StuChangeType(STU_CHANGE_STATUS_REPEAT,"留级",""), + StuChangeType(STU_CHANGE_STATUS_TRANSFER_OUT,"转出",""), + StuChangeType(STU_CHANGE_STATUS_DOWNGRADE,"降级",""), + StuChangeType(STU_CHANGE_STATUS_INTROSPECTION,"回家反省","反省"), + StuChangeType(STU_CHANGE_STATUS_INTERNSHIP,"实习","反省") + ) } \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/config/RefreshToken.kt b/app/src/main/java/com/yzx/escreen/config/RefreshToken.kt new file mode 100644 index 0000000..d581f7a --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/config/RefreshToken.kt @@ -0,0 +1,53 @@ +package com.yzx.escreen.config + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.escreen.model.ReToken +import com.yzx.escreen.model.RefreshTokenEvent +import com.yzx.escreen.model.User +import com.yzx.escreen.presenter.base.JsonCallBack +import com.yzx.escreen.presenter.base.YzxResponse +import com.yzx.webebook.config.YzxInterface +import org.greenrobot.eventbus.EventBus +import java.util.* + +object RefreshToken { + fun refresh(callBack:RefreshCallback) { + val user = User.getUser() + val lastLoginTime = user.loginTime + val currTime = Date().time + if (currTime - lastLoginTime > 12L * 60 * 60 * 1000 && currTime - lastLoginTime < 365L * 24 * 60 * 60 * 1000) { + if (user.user_id > 0) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_REFRESH_TOKEN + OkGo.post>(url) + .tag(this) + .params("old_token", User.getUser().token) + .params("type", 1) + .params("source", "201") + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + val token = response?.body()?.data?.token ?: "" + if (token.isNotBlank()) { + user.token = token + user.loginTime = Date().time + user.save() + callBack.onSuccess() + EventBus.getDefault().post(RefreshTokenEvent(token)) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } + } + } + + interface RefreshCallback{ + fun onSuccess() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/config/YzxInterface.kt b/app/src/main/java/com/yzx/escreen/config/YzxInterface.kt index 0c22c9c..6dc67c0 100644 --- a/app/src/main/java/com/yzx/escreen/config/YzxInterface.kt +++ b/app/src/main/java/com/yzx/escreen/config/YzxInterface.kt @@ -5,48 +5,19 @@ object YzxInterface { const val FILE_UPLOAD_URL = "https://fileupload.oa.qbjjyyun.net/edufile/fileUpload" const val INTERFACE_REFRESH_TOKEN = "/login/user2/refreshToken"// 刷新token - const val INTERFACE_GET_HOMEWORK_LIST = "/parent/weixin/getwxHomeworksByme"//获取家庭作业列表 - - const val INTERFACE_EBOOK_NOTEBOOK_GET_LIST = "/parent/notebook/getMyNotebookList"//获取笔记本列表 - const val INTERFACE_EBOOK_NOTEBOOK_RESET_NAME = "/parent/notebook/renameMyNotebook"//重命名笔记本 - const val INTERFACE_EBOOK_NOTEBOOK_DEL_NOTEBOOK = "/parent/notebook/deleteMyNotebook"//删除笔记本 - const val INTERFACE_EBOOK_NOTEBOOK_INSET_NOTEBOOK = "/parent/notebook/createMyNotebook"//新建笔记本 - const val INTERFACE_EBOOK_NOTEBOOK_UPDATE_NOTEBOOK = "/parent/notebook/updateMyNotebook"//编辑笔记本 - const val INTERFACE_EBOOK_NOTEBOOK_TAG_LIST = "/parent/notebook/getNoteTagList"//笔记标签 - const val INTERFACE_EBOOK_NOTEBOOK_TAG_ADD = "/parent/notebook/insertNoteTag"//添加笔记标签 - - const val INTERFACE_PREPARE_TEAM_COMMENT = "/parent/teacherPrePareLesson/getCommentDetailsByTeamId" - const val INTERFACE_PREPARE_TEAM_INPUT = "/parent/teacherPrePareLesson/inputContent" - const val INTERFACE_PREPARE_STU_RUSH = "/parent/teacherPrePareLesson/studentRush" - const val INTERFACE_PREPARE_RECORD_LIST = "/parent/teacherPrePareLesson/getInteractiveRecordList" - const val INTERFACE_PREPARE_MY_TEAMS = "/parent/teacherPrePareLesson/getMyTeams" - const val INTERFACE_PREPARE_MY_NEW_TEAM = "/parent/teacherPrePareLesson/getMyNewTeam" - - - const val INTERFACE_EXERCISES_LIST = "/parent/teacherPrePareLesson/issueExercisesListByStudent" // 练习题列表 - const val INTERFACE_QUESTION_GET_RESOURCE_CATEGORY_LIST= "/parent/questionBank/getResourceCategoryAllListBySuperId"//获取公共资源层级 - const val INTERFACE_QUESTION_REAL_GRADE= "/parent/common/getGradesByPeriodType"//根据学段(type:1小学,2初中,3高中 resource_category_id)获取对应年级接口 - const val INTERFACE_QUESTION_GET_INFO = "/parent/studentAfterClassPractice/getQuestionBankById"//获取试题信息 - const val INTERFACE_QUESTION_GET_LAST_PRACTICE = "/parent/studentAfterClassPractice/getLastPractice"//获取上次练习到第几题 - const val INTERFACE_QUESTION_GET_PRACTICE_CURR_NUM = "/parent/studentAfterClassPractice/getPracticeCurrNum"//获取当前练习次数 - const val INTERFACE_QUESTION_GET_PRACTICE_BY_TYPE = "/parent/studentAfterClassPractice/getCurrPracticeCorrectRate"//获取本次练习的正确率 - const val INTERFACE_QUESTION_POST_PRACTICE = "/parent/studentAfterClassPractice/insertStudentAfterClassPractice"//插入一条学生课后练习题 - const val INTERFACE_QUESTION_GET_PRACTICE_IDS = "/parent/studentAfterClassPractice/getQuestionBankIdsByType"//按练习类型获取试题Ids - const val INTERFACE_QUESTION_POST_COLLECT = "/parent/studentAfterClassPractice/collectQuestionBankById"//收藏(取消)试题 - const val INTERFACE_QUESTION_GET_PRACTICE_STAT = "/parent/studentAfterClassPractice/getPracticeStat"//获取练习统计 - const val INTERFACE_QUESTION_GET_KNOWLEDGE_POINT = "/parent/questionBank/getKnowledgePoint"//获取知识点 - - const val INTERFACE_NEW_WORD_GET_BOOK_LIST = "/parent/learningNewWords/getBooksList"//教材列表 - const val INTERFACE_NEW_WORD_GET_BOOK_RES_CATE_LIST = "/parent/learningNewWords/getBooksResourceCatalogList"//获取课本资源目录 - const val INTERFACE_INTERFACE_NEW_WORD_LIST= "/parent/learningNewWords/getNewWordsList" // 生字-列表 - const val INTERFACE_NEW_WORD_ADD_RECORD= "/parent/learningNewWords/insertPracticeRecord" // 生字-提交记录 - const val INTERFACE_NEW_WORD_GET_RECORD= "/parent/learningNewWords/getPracticeRecordsList" // 练习记录 - + /** + * 学生请假 + */ const val INTERFACE_GET_STU_LEAVE_LIST= "/edu/attendance/teacher/listStudentLeaveRequest"//获取学生请假列表 const val INTERFACE_GET_STU_LEAVE_INFO_DETAIL= "/edu/attendance/getStudentLeaveRequestDetail" //获取学生的请假信息详情 const val INTERFACE_GET_TEACHER_INFO= "/rights/teacherWork/getTeacherByUserId"//获取人员信息 const val INTERFACE_STUDENT_GET_SHOW_BOX_LIST= "/edu/attendance/student/getStudentLeaveIds" //获取需要弹出的数据 const val INTERFACE_STUDENT_POST_LEAVE_VACATION= "/edu/attendance/student/studentLeaveVacation"//人工销假操作 + /** + * 学籍异动 + */ -} \ No newline at end of file + const val INTERFACE_STUDENT_GET_CHANGE_LIST= "/edu/attendance/teacher/listStudentStatusChange"//学籍异动列表 + const val INTERFACE_STUDENT_GET_CHANGE_DETAIL= "/edu/attendance/getStudentStatusChangeDetail"//学籍异动详情 +} diff --git a/app/src/main/java/com/yzx/escreen/fragment/ChangeFragment.kt b/app/src/main/java/com/yzx/escreen/fragment/ChangeFragment.kt new file mode 100644 index 0000000..11f7730 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/fragment/ChangeFragment.kt @@ -0,0 +1,484 @@ +package com.yzx.escreen.fragment + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.content.res.ColorStateList +import android.graphics.Color +import android.text.Editable +import android.text.TextWatcher +import android.view.KeyEvent +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.blankj.utilcode.util.* +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import com.yzx.escreen.R +import com.yzx.escreen.adapter.ChangeDialogStepAdapter +import com.yzx.escreen.adapter.ChangeListAdapter +import com.yzx.escreen.fragment.base.BaseFragment +import com.yzx.escreen.model.* +import com.yzx.escreen.presenter.ChangePresenter +import com.yzx.escreen.presenter.ChangeView +import com.yzx.escreen.utils.FileUploadCallBack +import com.yzx.escreen.utils.hideNavigationBar +import com.yzx.escreen.utils.setSrc +import com.yzx.escreen.utils.toDay +import com.yzx.escreen.widget.BaseDialog +import kotlinx.android.synthetic.main.fragment_change.* +import kotlinx.android.synthetic.main.layout_loading.view.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.jetbrains.anko.find +import org.jetbrains.anko.support.v4.act +import org.jetbrains.anko.support.v4.ctx +import org.jetbrains.anko.textColor + + +class ChangeFragment : BaseFragment(), ChangeView, + NetworkUtils.OnNetworkStatusChangedListener, FileUploadCallBack { + + companion object { + + val CAMER_REQUEST_CODE = 0x01 + + @JvmStatic + fun getNewInstance() = + ChangeFragment() + } + + private val mAdapter: ChangeListAdapter by lazy { + val list = mutableListOf() + ChangeListAdapter(list) + } + + private var mPager = Pager() + var list = mutableListOf() + private val statusBtnList = mutableListOf() + var keyword: String = "" + var status: String = "" + private var isLoading = false + private val mShowList = mutableListOf() + private val mShowDialogList = mutableListOf() + + private val refreshRun = Runnable { + refreshData() + } + + override val inflateId: Int + get() = R.layout.fragment_change + + override fun initView() { + NetworkUtils.registerNetworkStatusChangedListener(this) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = mAdapter + + preTxtBtn.setOnClickListener { pre() } + nextTxtBtn.setOnClickListener { next() } + allBtn.setOnClickListener { changeStatus(0) } + status1Btn.setOnClickListener { changeStatus(1) } + status2Btn.setOnClickListener { changeStatus(2) } + status3Btn.setOnClickListener { changeStatus(3) } + statusBtnList.add(allBtn) + statusBtnList.add(status1Btn) + statusBtnList.add(status2Btn) + statusBtnList.add(status3Btn) + keywordInput.setOnKeyListener { _, keyCode, _ -> + if (!isLoading) { + if (keyCode == KeyEvent.KEYCODE_ENTER) { + keyword = keywordInput.text.toString() + initData() + KeyboardUtils.hideSoftInput(keywordInput) + } + } + false + } + clearBtn.setOnClickListener { + keyword = "" + keywordInput.setText("") + KeyboardUtils.hideSoftInput(keywordInput) + initData() + } + var lastClickTime = TimeUtils.getNowMills() + mAdapter.setOnItemClickListener { adapter, view, position -> + val curr = TimeUtils.getNowMills() + if(curr - lastClickTime > 500){ + lastClickTime = curr + mPresenter?.getDetail(mAdapter.getItem(position).id) + } + } + + mAdapter.setOnItemChildClickListener { adapter, view, position -> + LogUtils.d("setOnItemChildClickListener", position) + when (view.id) { + R.id.cancelBtn -> { + + } + } + } + + + switchBtn.setOnCheckedChangeListener { buttonView, isChecked -> + SPUtils.getInstance().put("auto_show_change", isChecked) + changeSwitchBtnTxt(isChecked) + EventBus.getDefault().post(AutoSwitchChange(2)) + } + val isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_change", false) + switchBtn.isChecked = isAutoShowLeave + changeSwitchBtnTxt(isAutoShowLeave) + + switchBtnTxt.setOnClickListener { + switchBtn.isChecked = !switchBtn.isChecked + } + keywordInput.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + if (s != null && s.isNotEmpty()) { + clearBtn.visibility = View.VISIBLE + } else { + clearBtn.visibility = View.INVISIBLE + } + } + + override fun afterTextChanged(s: Editable?) { + + } + + }) + filterLayout.setOnClickListener { + KeyboardUtils.hideSoftInput(keywordInput) + } + } + + + private fun changeSwitchBtnTxt(isChecked: Boolean) { + if (isChecked) { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.green2)) + } else { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.black_3)) + } + } + + @SuppressLint("SetTextI18n") + private fun showLeaveDialog(detail: StuChange) { + EventBus.getDefault().post(detail) + return + val adapter = ChangeDialogStepAdapter(mutableListOf()) + val dialog = BaseDialog(act, R.style.BaseDialog, R.layout.dialog_change) + //处理弹窗显示 + dialog.find(R.id.leave_student_name).text = detail.status_change_student_name + if (detail.face_key.isNotEmpty()) { + val img = dialog.find(R.id.face_img) + img.setSrc(detail.face_identity, detail.face_key) + img.visibility = View.VISIBLE + dialog.find(R.id.face_empty).visibility = View.GONE + } else { + dialog.find(R.id.face_empty).visibility = View.VISIBLE + dialog.find(R.id.face_img).visibility = View.GONE + } + dialog.find(R.id.class_name).text = "${detail.grade_name}${detail.class_name}" + dialog.find(R.id.leave_request_type_name).text = detail.status_change_type_name + dialog.find(R.id.statusName).text = when (detail.status) { + 1 -> "待处理" + 2 -> "已确认" + 3 -> "已拒绝" + else -> "--" + } + dialog.find(R.id.statusName).textColor = when (detail.status) { + 1 -> Color.parseColor("#333333") + 2 -> Color.parseColor("#3c7ef6") + 3 -> Color.parseColor("#ff4040") + else -> Color.parseColor("#333333") + } + if (detail.getSubStatusName().isNotEmpty()) { + dialog.find(R.id.subStatusName).text = "(${detail.getSubStatusName()})" + dialog.find(R.id.subStatusName).textColor = when (detail.sub_status) { + 0, 2 -> Color.parseColor("#ff4040") + 1, 3 -> Color.parseColor("#07c160") + else -> Color.parseColor("#333333") + } + } else { + dialog.find(R.id.subStatusName).text = "" + } + var time = "--" + if (detail.start_time > 0) { + time = detail.start_time.toDay() + } + if (detail.end_time > 0) { + time = "$time -- ${detail.end_time.toDay()}" + } + dialog.find(R.id.add_time).text = time + if (detail.status_change_reason.isNotEmpty()) { + dialog.find(R.id.remarkLayout).visibility = View.VISIBLE + dialog.find(R.id.leave_request_reason).text = detail.status_change_reason + } else { + dialog.find(R.id.remarkLayout).visibility = View.GONE + } + dialog.find(R.id.statusImg).setSrc(detail.getStatusImg()) + + dialog.find(R.id.stepRecycler) + val recyclerView = dialog.find(R.id.stepRecycler) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = adapter + adapter.setList(detail.getStep()) + + dialog.find(R.id.closeBtn).setOnClickListener { + dialog.hide() + val index = mShowList.indexOfFirst { it.id == detail.id } + if (index >= 0) { + mShowList.removeAt(index) + } + val dialogIndex = mShowDialogList.indexOfFirst { it.getLeaveId() == detail.id } + if (index >= 0) { + mShowDialogList.removeAt(dialogIndex) + } + val showItem = mShowDialogList.find { !it.showed } + showItem?.apply { + show() + } + + } + val showList = mShowDialogList.filter { it.showed } + if (showList.isEmpty()) { + dialog.show() + dialog.showed = true + } + dialog.hideNavigationBar() + dialog.setLeaveId(detail.id) + mShowDialogList.add(dialog) + } + + private fun changeStatusBtn(idx: Int) { + statusBtnList.forEachIndexed { index, button -> + if (index == idx) { + button.textColor = Color.parseColor("#ffffff") + button.setBackgroundColor(Color.parseColor("#3ca0e9")) + button.setStrokeColors(ColorStateList.valueOf(Color.parseColor("#3ca0e9"))) + } else { + button.textColor = Color.parseColor("#808080") + button.setBackgroundColor(Color.parseColor("#ffffff")) + button.setStrokeColors(ColorStateList.valueOf(Color.parseColor("#dcdee0"))) + } + } + } + + private fun changeStatus(status: Int) { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + changeStatusBtn(status) + this.status = if (status == 0) { + "" + } else { + "${status}" + } + initData() + } + + override fun initData() { + + mPager.page_no = 1 + if (NetworkUtils.isConnected()) { + showEmpty(1) + isLoading = true + mPresenter?.getList(mPager.page_no, keyword, status) + } else { + showEmpty(2) + } + + } + + /** + * type 1 loading 2 neterror 3 empty + */ + private fun showEmpty(type: Int) { + when (type) { + 1 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.setLoadingShowing(true) + this.QMUIEmptyView.setTitleText("数据加载中") + } + } + 2 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.show(false, null, "网络连接异常,请检查", "去设置") { + NetworkUtils.openWirelessSettings() + } + } + } + 3 -> { + mAdapter.setEmptyView(R.layout.layout_empty) + } + } + + } + + private fun refreshData() { + if (isLoading) { + return + } + isLoading = true + mPresenter?.getList(mPager.page_no, keyword, status) + } + + private fun pre() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no <= 1) { + } else { + isLoading = true + mPresenter?.getList(mPager.page_no - 1, keyword, status) + } + } + + private fun next() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no >= mPager.total_pages) { + } else { + isLoading = true + mPresenter?.getList(mPager.page_no + 1, keyword, status) + } + } + + override fun initPresenter(): ChangePresenter = ChangePresenter(this) + + @SuppressLint("SetTextI18n") + override fun onListSuccess(list: MutableList, pager: Pager) { + pageTv?.apply { + mAdapter.setList(list) + mPager = pager + pageTv.text = "${pager.page_no} / ${pager.total_pages}" + totalTv.text = "共${pager.total_count}条" + + val disabledColor = Color.parseColor("#666666") + val color = Color.parseColor("#3ca0e9") + if (pager.page_no <= 1) { + preTxtBtn.textColor = disabledColor + } else { + preTxtBtn.textColor = color + } + + if (pager.page_no >= pager.total_pages) { + nextTxtBtn.textColor = disabledColor + } else { + nextTxtBtn.textColor = color + } + isLoading = false + showEmpty(3) + pageTv.postDelayed({ + refreshData() + }, 30 * 1000) + } + } + + override fun onStop() { + pageTv.removeCallbacks(refreshRun) + super.onStop() + EventBus.getDefault().unregister(this) + } + + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + override fun onListError(error: String) { + isLoading = false + } + + override fun onDetailSuccess(detail: StuChange) { + pageTv?.apply { + val item = mShowList.find { it.id == detail.id } + if (item != null) { + //替换新的数据 + val index = mShowList.indexOf(item) + mShowList[index] = detail + + //移除原本的dialog + val dialogIndex = mShowDialogList.indexOfFirst { it.getLeaveId() == item.id } + if (dialogIndex > -1) { + mShowDialogList[dialogIndex].hide() + mShowDialogList.removeAt(dialogIndex) + } + + } else { + mShowList.add(detail) + } + showLeaveDialog(detail) + } + } + + override fun onDetailError(error: String) { + + } + + override fun onDisconnected() { + + } + + override fun onConnected(networkType: NetworkUtils.NetworkType?) { + refreshData() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK) { + + + } + super.onActivityResult(requestCode, resultCode, data) + } + + override fun onSuccess(identity: String, key: String) { + LogUtils.d(identity, key) + + } + + override fun onError(msg: String) { + LogUtils.d(msg) + + + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: MessageEventAuto) { + val list = event.list.filter { it.type == 1 }.toMutableList() + if (list.isNotEmpty() && switchBtn.isChecked) { + list.forEachIndexed { index, leaveID -> + pageTv.postDelayed({ + mPresenter?.getDetail(leaveID.id) + }, 500L * index) + } + } + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageRefreshEvent(event: RefreshTokenEvent) { + refreshData() + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { + timeView.setTime(event) + } +} + diff --git a/app/src/main/java/com/yzx/escreen/fragment/HomeFragment.kt b/app/src/main/java/com/yzx/escreen/fragment/HomeFragment.kt index 8022c62..aea1006 100644 --- a/app/src/main/java/com/yzx/escreen/fragment/HomeFragment.kt +++ b/app/src/main/java/com/yzx/escreen/fragment/HomeFragment.kt @@ -6,8 +6,6 @@ import android.app.Activity import android.content.Intent import android.content.res.ColorStateList import android.graphics.Color -import android.os.Handler -import android.os.Looper import android.text.Editable import android.text.TextWatcher import android.view.KeyEvent @@ -34,6 +32,9 @@ import com.yzx.escreen.utils.* import com.yzx.escreen.widget.BaseDialog import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.layout_loading.view.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode import org.jetbrains.anko.find import org.jetbrains.anko.support.v4.act import org.jetbrains.anko.support.v4.ctx @@ -69,15 +70,9 @@ class HomeFragment : BaseFragment(), HomeView, private var mCancelFaceImg: ImageView? = null private var mDialogVacation: BaseDialog? = null private val mVacation = Vacation() - private val mVacationAttachment = Attachment("","","") + private val mVacationAttachment = Attachment("", "", "") + - private val mHandler = Handler(Looper.getMainLooper()) - private val runnable = object : Runnable { - override fun run() { - mPresenter?.getLeaveShowIds() - mHandler.postDelayed(this, 2000) - } - } private val refreshRun = Runnable { refreshData() } @@ -121,17 +116,25 @@ class HomeFragment : BaseFragment(), HomeView, KeyboardUtils.hideSoftInput(keywordInput) initData() } - + var lastClickTime = TimeUtils.getNowMills() mAdapter.setOnItemClickListener { adapter, view, position -> - mPresenter?.getDetail(mAdapter.getItem(position).id) + val curr = TimeUtils.getNowMills() + if(curr - lastClickTime > 500){ + lastClickTime = curr + mPresenter?.getDetail(mAdapter.getItem(position).id) + } } mAdapter.setOnItemChildClickListener { adapter, view, position -> LogUtils.d("setOnItemChildClickListener", position) - when (view.id) { - R.id.cancelBtn -> { - mCancelItem = mAdapter.getItem(position) - showCancelDialog() + val curr = TimeUtils.getNowMills() + if(curr - lastClickTime > 500){ + lastClickTime = curr + when (view.id) { + R.id.cancelBtn -> { + mCancelItem = mAdapter.getItem(position) + showCancelDialog() + } } } } @@ -140,20 +143,16 @@ class HomeFragment : BaseFragment(), HomeView, switchBtn.setOnCheckedChangeListener { buttonView, isChecked -> SPUtils.getInstance().put("auto_show_leave", isChecked) changeSwitchBtnTxt(isChecked) - if (!isChecked) { - mHandler.removeCallbacks(runnable) - } else { - mHandler.postDelayed(runnable, 2000) - } + } val isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_leave", false) switchBtn.isChecked = isAutoShowLeave changeSwitchBtnTxt(isAutoShowLeave) - if (isAutoShowLeave) { - mHandler.postDelayed(runnable, 2000) - } + switchBtnTxt.setOnClickListener { switchBtn.isChecked = !switchBtn.isChecked + + EventBus.getDefault().post(AutoSwitchChange(1)) } keywordInput.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -176,6 +175,8 @@ class HomeFragment : BaseFragment(), HomeView, filterLayout.setOnClickListener { KeyboardUtils.hideSoftInput(keywordInput) } + + } @SuppressLint("SetTextI18n") @@ -210,8 +211,8 @@ class HomeFragment : BaseFragment(), HomeView, mDialogVacation = dialogVacation } - private fun postVacation(){ - if(mVacationAttachment.id.isNotEmpty()){ + private fun postVacation() { + if (mVacationAttachment.id.isNotEmpty()) { mVacation.vacation_attachment = GsonUtils.toJson(mutableListOf(mVacationAttachment)) } showLoading("销假中") @@ -262,6 +263,8 @@ class HomeFragment : BaseFragment(), HomeView, @SuppressLint("SetTextI18n") private fun showLeaveDialog(detail: StuLeave) { + EventBus.getDefault().post(detail) + return val adapter = HomeDialogStepAdapter(mutableListOf()) val dialog = BaseDialog(act, R.style.BaseDialog, R.layout.dialog_leave) //处理弹窗显示 @@ -295,11 +298,13 @@ class HomeFragment : BaseFragment(), HomeView, dialog.find(R.id.stepRecycler) val recyclerView = dialog.find(R.id.stepRecycler) - recyclerView.layoutManager = - LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) +// layoutManager.stackFromEnd = true + recyclerView.layoutManager = layoutManager + recyclerView.adapter = adapter adapter.setList(detail.getStep()) - + recyclerView.scrollToPosition(adapter.itemCount - 1) dialog.find(R.id.closeBtn).setOnClickListener { dialog.hide() val index = mShowList.indexOfFirst { it.id == detail.id } @@ -316,12 +321,12 @@ class HomeFragment : BaseFragment(), HomeView, } } - val showList = mShowDialogList.filter { it.showed } - if(showList.isEmpty()){ + dialog.hideNavigationBar() + val showList = mShowDialogList.filter { it.showed } + if (showList.isEmpty()) { dialog.show() dialog.showed = true } - dialog.hideNavigationBar() dialog.setLeaveId(detail.id) mShowDialogList.add(dialog) } @@ -458,9 +463,9 @@ class HomeFragment : BaseFragment(), HomeView, } override fun onStop() { - super.onStop() pageTv.removeCallbacks(refreshRun) - mHandler.removeCallbacks(runnable) + super.onStop() + EventBus.getDefault().unregister(this) } override fun onLeaveListError(error: String) { @@ -493,17 +498,43 @@ class HomeFragment : BaseFragment(), HomeView, } + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: MessageEventAuto) { + val list = event.list.filter { it.type == 0 }.toMutableList() + if (list.isNotEmpty() && switchBtn.isChecked) { + onLeaveIDsSuccess(list) + } + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageRefreshEvent(event: RefreshTokenEvent) { + refreshData() + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { + timeView.setTime(event) + } + override fun onLeaveIDsSuccess(list: MutableList) { list.forEachIndexed { index, leaveID -> pageTv.postDelayed({ mPresenter?.getDetail(leaveID.id) - },500L*index) + }, 500L * index) } } override fun postVacationSuccess(msg: String) { - showDialogToast(msg,2000L) + showDialogToast(msg, 2000L) hideLoading() mDialogVacation?.apply { dismiss() @@ -513,7 +544,7 @@ class HomeFragment : BaseFragment(), HomeView, override fun postVacationError(msg: String) { hideLoading() - showDialogToast(msg,2000L,QMUITipDialog.Builder.ICON_TYPE_FAIL) + showDialogToast(msg, 2000L, QMUITipDialog.Builder.ICON_TYPE_FAIL) } override fun onDisconnected() { diff --git a/app/src/main/java/com/yzx/escreen/fragment/MyFragment.kt b/app/src/main/java/com/yzx/escreen/fragment/MyFragment.kt index 65945a1..885c4e5 100644 --- a/app/src/main/java/com/yzx/escreen/fragment/MyFragment.kt +++ b/app/src/main/java/com/yzx/escreen/fragment/MyFragment.kt @@ -1,7 +1,6 @@ package com.yzx.escreen.fragment import android.text.InputType -import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.KeyboardUtils import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.ScreenUtils @@ -12,11 +11,17 @@ import com.yzx.escreen.activity.WebActivity import com.yzx.escreen.config.Config import com.yzx.escreen.fragment.base.BaseFragment import com.yzx.escreen.model.TeacherInfo +import com.yzx.escreen.model.TimeShow import com.yzx.escreen.model.User import com.yzx.escreen.presenter.MyPresenter import com.yzx.escreen.presenter.MyView import com.yzx.escreen.utils.hideNavigationBar +import kotlinx.android.synthetic.main.fragment_change.* import kotlinx.android.synthetic.main.fragment_my.* +import kotlinx.android.synthetic.main.fragment_my.timeView +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode import kotlin.system.exitProcess class MyFragment : BaseFragment(), MyView { @@ -145,4 +150,22 @@ class MyFragment : BaseFragment(), MyView { } + + override fun onStop() { + super.onStop() + EventBus.getDefault().unregister(this) + } + + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { + timeView.setTime(event) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/fragment/base/BaseFragment.kt b/app/src/main/java/com/yzx/escreen/fragment/base/BaseFragment.kt index 4a91ade..aed0751 100644 --- a/app/src/main/java/com/yzx/escreen/fragment/base/BaseFragment.kt +++ b/app/src/main/java/com/yzx/escreen/fragment/base/BaseFragment.kt @@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment import com.qmuiteam.qmui.widget.dialog.QMUITipDialog import com.yzx.escreen.presenter.base.BasePresenter import com.yzx.escreen.utils.hideNavigationBar +import org.greenrobot.eventbus.EventBus /** * fragment 基类 @@ -54,6 +55,16 @@ abstract class BaseFragment> : Fragment() { initData() } + override fun onStart() { + super.onStart() + + } + + override fun onStop() { + super.onStop() + + } + override fun onDestroy() { super.onDestroy() diff --git a/app/src/main/java/com/yzx/escreen/model/MessageEvent.kt b/app/src/main/java/com/yzx/escreen/model/MessageEvent.kt new file mode 100644 index 0000000..c9212e1 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/model/MessageEvent.kt @@ -0,0 +1,38 @@ +package com.yzx.escreen.model + +import com.blankj.utilcode.util.TimeUtils +import com.yzx.escreen.utils.zhCn +import java.util.* + +data class MessageEventAuto( + var list: MutableList, + val type: Int = 0 +) + +data class AutoSwitchChange(val type: Int) + +data class RefreshTokenEvent(val token: String) + + +data class TimeShow( + var year: String = "", + var month: String = "", + var day: String = "", + var hour: String = "", + var min: String = "", + var sec: String = "", + var week: String = "" +) { + fun getNowObj(): TimeShow { + //yyyy-MM-dd HH:mm:ss + year = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("yyyy").zhCn()) + month = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("MM").zhCn()) + day = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("dd").zhCn()) + hour = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("HH").zhCn()) + min = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("mm").zhCn()) + sec = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("ss").zhCn()) + week = TimeUtils.getChineseWeek(System.currentTimeMillis()).replace("周","星期") + return this + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/model/ReToken.kt b/app/src/main/java/com/yzx/escreen/model/ReToken.kt new file mode 100644 index 0000000..2a649e3 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/model/ReToken.kt @@ -0,0 +1,5 @@ +package com.yzx.escreen.model + +class ReToken ( + val token:String +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/model/StuChange.kt b/app/src/main/java/com/yzx/escreen/model/StuChange.kt new file mode 100644 index 0000000..9b89ba9 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/model/StuChange.kt @@ -0,0 +1,209 @@ +package com.yzx.escreen.model + +import com.yzx.escreen.config.Config + +data class StuChangeType( + val id: Int = 0, + val label: String = "", + val shortLabel: String = "" +) { + fun getShortLabelVal(): String { + if (shortLabel.isNotEmpty()) { + return shortLabel + } + return label + } +} + +data class StuChange( + val activities: List = mutableListOf(), + val add_time: Int = 0, + val add_user_id: Int = 0, + val add_user_name: String = "", + val attachment: String = "", + val attachments: List = listOf(), + val can_reviewed: Int = 0, + val class_id: Int = 0, + val class_name: String = "", + val end_time: Int = 0, + val face_identity: String = "", + val face_key: String = "", + val grade_id: Int = 0, + val grade_name: String = "", + val headteacher_id: Int = 0, + val id: Int = 0, + val is_cancel_change: Int = 0, + val is_delete: Int = 0, + val is_resume_school: Int = 0, + val new_todo_list_id: Int = 0, + val school_id: Int = 0, + val school_name: String = "", + val sign_identity: String = "", + val sign_key: String = "", + val start_time: Int = 0, + val status: Int = 0, + val status_change_reason: String = "", + val status_change_student_id: Int = 0, + val status_change_student_name: String = "", + val status_change_type: Int = 0, + val status_change_type_name: String = "", + val sub_status: Int = 0, + val target_class_id: Int = 0, + val target_class_name: String = "", + val target_grade_id: Int = 0, + val target_grade_name: String = "", + val target_headteacher_id: Int = 0, + val target_school_id: Int = 0, + val target_school_name: String = "", + val target_status: Int = 0, + val todo_list_id: Int = 0, + val type: Int = 0 +) { + fun getStatusImg(): String { + return when { + getSubStatusName().isNotEmpty() -> { + "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/statuschange/${getSubStatusIcon()}.png" + } + status == 1 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_wait.png" + status == 2 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_pass.png" + status == 3 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_nopass.png" + else -> "" + } + } + + fun getSubStatusIcon( + changeType: Int = status_change_type, + subStatus: Int = sub_status + ): String { + if (is_resume_school == 1) { + return "resume_school" + } + return when (subStatus) { + 0 -> "change0" + else -> { + "${changeType}_${subStatus}" + } + } + } + + fun getSubStatusName( + changeType: Int = status_change_type, + subStatus: Int = sub_status + ): String { + if (status != 2) { + return "" + } + if (is_resume_school == 1) { + return "恢复上学" + } + //其他type 无子状态 + when (changeType) { + Config.STU_CHANGE_STATUS_LEAVE_SCHOOL -> { + return when (subStatus) { + 0 -> { + "未开始" + } + 1 -> { + "休学中" + } + else -> { + "休学结束" + } + } + } + Config.STU_CHANGE_STATUS_OUT_SCHOOL -> { + return when (subStatus) { + 0 -> { + "未开始" + } + else -> { + "已退学" + } + } + } + Config.STU_CHANGE_STATUS_INTROSPECTION -> { + return when (subStatus) { + 0 -> { + "未开始" + } + 1 -> { + "反省中" + } + else -> { + "反省结束" + } + } + } + Config.STU_CHANGE_STATUS_INTERNSHIP -> { + return when (subStatus) { + 0 -> { + "未开始" + } + 1 -> { + "实习中" + } + else -> { + "实习结束" + } + } + } + Config.STU_CHANGE_STATUS_DROP_OUT -> { + return when (subStatus) { + 0 -> { + "未开始" + } + else -> { + "已辍学" + } + } + } + Config.STU_CHANGE_STATUS_TRANSFER_OUT -> { + return when (subStatus) { + 0 -> { + "未开始" + } + else -> { + "已转出" + } + } + } + } + return "" + } + + fun getStep(): List { + return activities.reversed() + } + +} + +data class ChangeActivity( + val activity_name: String = "", + val add_time: Int = 0, + val add_user_id: Int = 0, + val add_user_name: String = "", + val add_user_type: Int = 0, + val approval_comments: String = "", + val approval_status: Int = 0, + val approve_node: Int = 0, + val approve_sort: Int = 0, + val approve_user_type: Int = 0, + val approve_way: Int = 0, + val id: Int = 0, + val is_approve: Int = 0, + val is_auto_pass: Int = 0, + val related_id: Int = 0, + val relation_id: Int = 0, + val report_end_date: Int = 0, + val report_start_date: Int = 0, + val role_type: Int = 0, + val school_name: String = "", + val sign_identity: String = "", + val sign_key: String? = "", + val status: Int = 0, + val sub_type: String = "", + val type: Int = 0, + val unit_id: Int = 0, + val unit_name: String = "", + val vacation_type: Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/model/StuLeave.kt b/app/src/main/java/com/yzx/escreen/model/StuLeave.kt index adb35b0..9ea8b08 100644 --- a/app/src/main/java/com/yzx/escreen/model/StuLeave.kt +++ b/app/src/main/java/com/yzx/escreen/model/StuLeave.kt @@ -1,9 +1,10 @@ package com.yzx.escreen.model -import android.app.Dialog -import com.blankj.utilcode.util.LogUtils +import android.os.Parcelable import com.yzx.escreen.utils.durationStr +import kotlinx.android.parcel.Parcelize +@Parcelize data class StuLeave( val activities: MutableList = mutableListOf(), val add_time: Int = 0, @@ -11,7 +12,6 @@ data class StuLeave( val add_user_name: String = "", val add_user_type: Int = 0, val approve_time: Int = 0, - val attachments: List = listOf(), val can_reviewed: Int = 0, val class_id: Int = 0, val class_name: String = "", @@ -32,14 +32,13 @@ data class StuLeave( val leave_student_id: Int = 0, val leave_student_name: String = "", val relation_id: Int = 0, - val request_status: Any = Any(), val school_id: Int = 0, val school_name: String = "", val start_time: Int = 0, val status: Int = 0, val todo_list_id: Int = 0, val todo_status: Int = 0 -) { +) : Parcelable { fun getStep(): MutableList { val logList = mutableListOf() @@ -135,9 +134,9 @@ data class StuLeave( } } - -data class LeaveID(var id: Int) - +@Parcelize +data class LeaveID(var id: Int,var type:Int) : Parcelable +@Parcelize data class LeaveActivity( var activity_name: String = "", var add_time: Int = 0, @@ -162,7 +161,7 @@ data class LeaveActivity( var sign_identity: String = "", var sign_key: String = "", var status: Int = 0, - var sub_type: Any = Any(), + var sub_type: Int = 0, var type: Int = 0, var unit_id: Int = 0, var unit_name: String = "", @@ -171,7 +170,7 @@ data class LeaveActivity( var vacation_type: Int = 0, var color: String = "", val face_infos: MutableList = mutableListOf() -) { +) : Parcelable { fun getInImg(): FaceInfo? { val imgList = face_infos.filter { it.isImg() } if (imgList.isNotEmpty()) { @@ -180,12 +179,12 @@ data class LeaveActivity( return null } } - +@Parcelize data class FaceInfo( var attachment_name: String = "", var attachment_id: String = "", var identity: String = "" -) { +) : Parcelable { fun isImg(): Boolean { if (attachment_name.isNullOrBlank()) { return false diff --git a/app/src/main/java/com/yzx/escreen/presenter/ChangePresenter.kt b/app/src/main/java/com/yzx/escreen/presenter/ChangePresenter.kt new file mode 100644 index 0000000..6243cdc --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/presenter/ChangePresenter.kt @@ -0,0 +1,77 @@ +package com.yzx.escreen.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.escreen.config.Config +import com.yzx.escreen.model.* +import com.yzx.escreen.presenter.base.* +import com.yzx.webebook.config.YzxInterface + +class ChangePresenter(view: ChangeView) : BasePresenter(view) { + + + fun getList(pageNo: Int, keyword: String, status: String) { + if(!User.isLogin()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_GET_CHANGE_LIST}" + OkGo.post>(url) + .tag(this) + .params("keyword", keyword) + .params("status", status) + .params("page_size", 6) + .params("page_no", pageNo) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onListSuccess(response.body().list, response.body().pager) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onListError(response?.body()?.msg ?: "") + } + }) + } + fun getDetail(id: Int) { + if(!User.isLogin()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_GET_CHANGE_DETAIL}" + OkGo.post>(url) + .tag(this) + .params("id", id) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onDetailSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onDetailError(response?.body()?.msg ?: "") + } + }) + } + + + +} + +interface ChangeView : IView { + fun onListSuccess(list: MutableList, pager: Pager) + fun onListError(error: String) + fun onDetailSuccess(detail: StuChange) + fun onDetailError(error: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/presenter/MainPresenter.kt b/app/src/main/java/com/yzx/escreen/presenter/MainPresenter.kt new file mode 100644 index 0000000..ecd44be --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/presenter/MainPresenter.kt @@ -0,0 +1,46 @@ +package com.yzx.escreen.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.escreen.config.Config +import com.yzx.escreen.model.LeaveID +import com.yzx.escreen.model.User +import com.yzx.escreen.presenter.base.BasePresenter +import com.yzx.escreen.presenter.base.IView +import com.yzx.escreen.presenter.base.JsonCallBack +import com.yzx.escreen.presenter.base.YzxResponse +import com.yzx.webebook.config.YzxInterface + +class MainPresenter(view: MainView) : BasePresenter(view) { + + + + fun getLeaveShowIds() { + if(!User.isLogin()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_GET_SHOW_BOX_LIST}" + OkGo.post>(url) + .tag(this) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + mView?.onLeaveIDsSuccess(response.body().list) + LogUtils.d("getLeaveShowIds",response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } + + +} + +interface MainView : IView { + fun onLeaveIDsSuccess(list: MutableList) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/utils/KotlinX.kt b/app/src/main/java/com/yzx/escreen/utils/KotlinX.kt index 2a40730..c1a78d9 100644 --- a/app/src/main/java/com/yzx/escreen/utils/KotlinX.kt +++ b/app/src/main/java/com/yzx/escreen/utils/KotlinX.kt @@ -2,9 +2,11 @@ package com.yzx.escreen.utils import android.app.Dialog import android.view.View +import android.view.WindowManager import android.widget.ImageView import com.blankj.utilcode.util.TimeUtils import com.bumptech.glide.Glide +import java.text.SimpleDateFormat import java.util.* fun ImageView.setSrc(identity: String, key: String) { @@ -20,12 +22,16 @@ fun ImageView.setSrc(url: String) { .into(this) } -fun Int.toTime(): String { - val format = TimeUtils.getSafeDateFormat("yyyy-MM-dd HH:mm") +fun Int.toTime(format:String = "yyyy-MM-dd HH:mm"): String { + val format = TimeUtils.getSafeDateFormat(format) format.timeZone = TimeZone.getTimeZone("GMT+8:00") return TimeUtils.millis2String(this * 1000L, format) } +fun Int.toDay(): String { + return toTime("yyyy-MM-dd") +} + fun Int.durationStr(): String { val value = this if (value <= 60) { @@ -61,19 +67,24 @@ fun Int.durationStr(): String { fun Dialog.hideNavigationBar(){ val window = this.window window?.apply { - window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + val uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_FULLSCREEN or + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + window.decorView.systemUiVisibility = uiOptions window.decorView.setOnSystemUiVisibilityChangeListener { - val uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_FULLSCREEN or - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY window.decorView.systemUiVisibility = uiOptions } } } +fun SimpleDateFormat.zhCn():SimpleDateFormat{ + timeZone = TimeZone.getTimeZone("GMT+8:00") + return this +} + diff --git a/app/src/main/java/com/yzx/escreen/widget/BaseDialog.kt b/app/src/main/java/com/yzx/escreen/widget/BaseDialog.kt index 30e1524..b946534 100644 --- a/app/src/main/java/com/yzx/escreen/widget/BaseDialog.kt +++ b/app/src/main/java/com/yzx/escreen/widget/BaseDialog.kt @@ -2,6 +2,8 @@ package com.yzx.escreen.widget import android.app.Dialog import android.content.Context +import android.view.Window +import com.yzx.escreen.utils.hideNavigationBar class BaseDialog(context: Context, themeResId: Int, res: Int) : Dialog(context, themeResId) { private var res: Int = 0 @@ -9,6 +11,8 @@ class BaseDialog(context: Context, themeResId: Int, res: Int) : Dialog(context, var showed = false init { + hideNavigationBar() + requestWindowFeature(Window.FEATURE_NO_TITLE) setContentView(res) this.res = res setCanceledOnTouchOutside(false) @@ -22,4 +26,14 @@ class BaseDialog(context: Context, themeResId: Int, res: Int) : Dialog(context, fun getLeaveId():Int{ return leaveId } + + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + hideNavigationBar() + } + + override fun show() { + hideNavigationBar() + super.show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/widget/ChangeDialog.kt b/app/src/main/java/com/yzx/escreen/widget/ChangeDialog.kt new file mode 100644 index 0000000..d26ba5e --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/widget/ChangeDialog.kt @@ -0,0 +1,122 @@ +package com.yzx.escreen.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.yzx.escreen.R +import com.yzx.escreen.adapter.ChangeDialogStepAdapter +import com.yzx.escreen.adapter.HomeDialogStepAdapter +import com.yzx.escreen.model.StuChange +import com.yzx.escreen.model.StuLeave +import com.yzx.escreen.utils.durationStr +import com.yzx.escreen.utils.setSrc +import com.yzx.escreen.utils.toDay +import com.yzx.escreen.utils.toTime +import kotlinx.android.synthetic.main.dialog_leave.view.* +import org.jetbrains.anko.find +import org.jetbrains.anko.textColor + +/** + * 展示学生请假 + */ +class ChangeDialog( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : + ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { + + val adapter: ChangeDialogStepAdapter by lazy { + ChangeDialogStepAdapter(mutableListOf()) + } + var onCloseClick: (view:View) -> Unit = {} + + init { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_change, null) + val layoutParams = LayoutParams(0, LayoutParams.WRAP_CONTENT) + layoutParams.matchConstraintPercentWidth = 0.8f + layoutParams.topToTop = LayoutParams.PARENT_ID + layoutParams.startToStart = LayoutParams.PARENT_ID + layoutParams.endToEnd = LayoutParams.PARENT_ID + layoutParams.bottomToBottom = LayoutParams.PARENT_ID + view.layoutParams = layoutParams + addView(view) + background = ContextCompat.getDrawable(context, R.color.dialog_bg) + setOnClickListener { } //阻止事件冒泡 + } + + @SuppressLint("SetTextI18n") + fun setData(detail: StuChange) { + //处理弹窗显示 + find(R.id.leave_student_name).text = detail.status_change_student_name + if (detail.face_key.isNotEmpty()) { + val img = find(R.id.face_img) + img.setSrc(detail.face_identity, detail.face_key) + img.visibility = View.VISIBLE + find(R.id.face_empty).visibility = View.GONE + } else { + find(R.id.face_empty).visibility = View.VISIBLE + find(R.id.face_img).visibility = View.GONE + } + find(R.id.class_name).text = "${detail.grade_name}${detail.class_name}" + find(R.id.leave_request_type_name).text = detail.status_change_type_name + find(R.id.statusName).text = when (detail.status) { + 1 -> "待处理" + 2 -> "已确认" + 3 -> "已拒绝" + else -> "--" + } + find(R.id.statusName).textColor = when (detail.status) { + 1 -> Color.parseColor("#333333") + 2 -> Color.parseColor("#3c7ef6") + 3 -> Color.parseColor("#ff4040") + else -> Color.parseColor("#333333") + } + if (detail.getSubStatusName().isNotEmpty()) { + find(R.id.subStatusName).text = "(${detail.getSubStatusName()})" + find(R.id.subStatusName).textColor = when (detail.sub_status) { + 0, 2 -> Color.parseColor("#ff4040") + 1, 3 -> Color.parseColor("#07c160") + else -> Color.parseColor("#333333") + } + } else { + find(R.id.subStatusName).text = "" + } + var time = "--" + if (detail.start_time > 0) { + time = detail.start_time.toDay() + } + if (detail.end_time > 0) { + time = "$time -- ${detail.end_time.toDay()}" + } + find(R.id.add_time).text = time + if(detail.status_change_reason.isNotEmpty()){ + find(R.id.remarkLayout).visibility = View.VISIBLE + find(R.id.leave_request_reason).text = detail.status_change_reason + }else{ + find(R.id.remarkLayout).visibility = View.GONE + } + find(R.id.statusImg).setSrc(detail.getStatusImg()) + + find(R.id.stepRecycler) + val recyclerView = find(R.id.stepRecycler) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = adapter + adapter.setList(detail.getStep()) + + find(R.id.closeBtn).setOnClickListener { + onCloseClick(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/widget/LeaveDialog.kt b/app/src/main/java/com/yzx/escreen/widget/LeaveDialog.kt new file mode 100644 index 0000000..11bf0ed --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/widget/LeaveDialog.kt @@ -0,0 +1,95 @@ +package com.yzx.escreen.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.yzx.escreen.R +import com.yzx.escreen.adapter.HomeDialogStepAdapter +import com.yzx.escreen.model.StuLeave +import com.yzx.escreen.utils.durationStr +import com.yzx.escreen.utils.setSrc +import com.yzx.escreen.utils.toTime +import kotlinx.android.synthetic.main.dialog_leave.view.* +import org.jetbrains.anko.find + +/** + * 展示学生请假 + */ +class LeaveDialog( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : + ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { + + val adapter: HomeDialogStepAdapter by lazy { + HomeDialogStepAdapter(mutableListOf()) + } + var onCloseClick: (view:View) -> Unit = {} + + init { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_leave, null) + val layoutParams = LayoutParams(0, LayoutParams.WRAP_CONTENT) + layoutParams.matchConstraintPercentWidth = 0.8f + layoutParams.topToTop = LayoutParams.PARENT_ID + layoutParams.startToStart = LayoutParams.PARENT_ID + layoutParams.endToEnd = LayoutParams.PARENT_ID + layoutParams.bottomToBottom = LayoutParams.PARENT_ID + view.layoutParams = layoutParams + addView(view) + background = ContextCompat.getDrawable(context, R.color.dialog_bg) + setOnClickListener { } //阻止事件冒泡 + } + + @SuppressLint("SetTextI18n") + fun setData(detail: StuLeave) { + leave_student_name.text = detail.leave_student_name + if (detail.face_key.isNotEmpty()) { + val img = find(R.id.face_img) + img.setSrc(detail.face_identity, detail.face_key) + img.visibility = View.VISIBLE + find(R.id.face_empty).visibility = View.GONE + } else { + find(R.id.face_empty).visibility = View.VISIBLE + find(R.id.face_img).visibility = View.GONE + } + find(R.id.class_name).text = "${detail.grade_name}${detail.class_name}" + find(R.id.leave_request_type_name).text = detail.leave_request_type_name + find(R.id.leave_duration_str).text = + (detail.end_time - detail.start_time).durationStr() + find(R.id.add_time).text = + "${detail.start_time.toTime()} - ${detail.end_time.toTime()}" + find(R.id.leave_request_reason).text = detail.leave_request_reason + find(R.id.statusImg).setSrc( + when (detail.status) { + 1 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_wait.png" + 2 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_pass.png" + 3 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_nopass.png" + 4 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/cancellation.png" + 5 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/cancellation_overtime.png" + else -> "" + } + ) + + find(R.id.stepRecycler) + val recyclerView = find(R.id.stepRecycler) + val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.layoutManager = layoutManager + + recyclerView.adapter = adapter + adapter.setList(detail.getStep()) + recyclerView.scrollToPosition(adapter.itemCount - 1) + find(R.id.closeBtn).setOnClickListener { + onCloseClick(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/escreen/widget/TimeView.kt b/app/src/main/java/com/yzx/escreen/widget/TimeView.kt new file mode 100644 index 0000000..dd618fb --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/widget/TimeView.kt @@ -0,0 +1,28 @@ +package com.yzx.escreen.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import com.yzx.escreen.R +import com.yzx.escreen.model.TimeShow +import kotlinx.android.synthetic.main.view_time.view.* + +class TimeView(context: Context, attrs: AttributeSet) : + FrameLayout(context, attrs) { + + init { + val view = LayoutInflater.from(context).inflate(R.layout.view_time, null) + addView(view) + } + + @SuppressLint("SetTextI18n") + fun setTime(timeShow: TimeShow) { + hour.text = timeShow.hour + min.text = timeShow.min + sec.text = timeShow.sec + week.text = timeShow.week + year.text = "${timeShow.year}年${timeShow.month}月${timeShow.day}日" + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 589399a..a3e6476 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,38 +1,47 @@ - - + android:gravity="center_horizontal"> - + - + - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_change.xml b/app/src/main/res/layout/dialog_change.xml new file mode 100644 index 0000000..cdb10c1 --- /dev/null +++ b/app/src/main/res/layout/dialog_change.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_leave.xml b/app/src/main/res/layout/dialog_leave.xml index c694bc0..62c300d 100644 --- a/app/src/main/res/layout/dialog_leave.xml +++ b/app/src/main/res/layout/dialog_leave.xml @@ -83,8 +83,8 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 26af7be..c397bc7 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,279 +1,296 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent" + android:background="@color/backgroundColor" + android:orientation="vertical"> - - - - - + android:padding="30dp"> - - - - - - - - - - + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="学生请假单列表" + android:textColor="@color/black" + android:textSize="@dimen/d_28" + android:textStyle="bold" /> - + - + - - - - - + android:paddingVertical="30dp"> - + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingStart="@dimen/d_10" + android:paddingEnd="@dimen/dp_10" + app:qmui_backgroundColor="@color/white" + app:qmui_borderColor="#dcdee0" + app:qmui_borderWidth="1px" + app:qmui_radius="@dimen/d_30"> + + + + + + + + + + + + + + + + + + + - + + android:layout_height="@dimen/d_28" + android:layout_gravity="center_vertical" + android:layout_marginStart="@dimen/d_10" + android:gravity="center" + android:text="自动弹出请假单" + android:textColor="#53a051" /> - + + + + + android:orientation="horizontal" + android:paddingTop="@dimen/d_20" + android:paddingBottom="@dimen/d_20"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_my.xml b/app/src/main/res/layout/fragment_my.xml index a639514..742a31a 100644 --- a/app/src/main/res/layout/fragment_my.xml +++ b/app/src/main/res/layout/fragment_my.xml @@ -15,7 +15,7 @@ android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="10dp"> + android:padding="30dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_time.xml b/app/src/main/res/layout/view_time.xml new file mode 100644 index 0000000..9834fc3 --- /dev/null +++ b/app/src/main/res/layout/view_time.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-mdpi/change_select.png b/app/src/main/res/mipmap-mdpi/change_select.png new file mode 100644 index 0000000000000000000000000000000000000000..7452534b62797ff291cb330ce19ad5907811a216 GIT binary patch literal 827 zcmV-B1H}A^P)9R!x9h_wlD-&5DX$}rC?P3SFcR^jF^U9i6a-NOQ0B52Pnz3@9XQ@a zQ8{QnnCxiat1gSl$*zWabKj}XM-5!)wu+2=-@s0s!mBQeNy&2|Ioa932tM~_Bkg6k zR3+dEP6&y}HvBtL;&Bh3;Ce=3bu)q^SRnM^N6icEQp=lIjdj8r_J83oVHW;@KKE;iS_g7^cKgGJg zt`eZC;a50^Rak;=@MpzXMffAuu^4M&-Iaz|9lMsp*egsF>v35U? zh&s=6ngTCl0GoxamqjJx3=1vztpvR$)lo~?E;t&?td@9)q&`e*on!{^nYY*VpX1*K zVwvR0PL?Ce$Oujg>*W&RpD`TYv(aj}S@BrnI>&K0aUE@G?b27?dGASDTX+k;ly*Js zI;|}{rpL{a?>8P(hH1mS&a~lPXWDSDQ#F^Kjo<1NQh`b*CS?piYx&&3$5kp!$kQT) z%5>=;DhkQL6I?4&u#Dk@!m(<$pZXSH9KQ-@zrPo`;Wg5ana02yd9?rl002ovPDHLk FV1g$Kf2aTe literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/change_unselect.png b/app/src/main/res/mipmap-mdpi/change_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..87b1c73e70d58ef43664e912c1a1099f2dc841b4 GIT binary patch literal 1201 zcmV;i1Wx;jP)%Z6f|IYgV*R=0|?(S}F zq!ahyruca=9>lhGIZ$d-I|FeWzQ^5y@XmPuV=Nok4oBJ{cna3xX$(mz9~#TnMcbCr zO2K3CZoI~}z`ib8A$W-V9_z)WxFX(HQWOyl(M-XIVXly;X*u~P=HXPlgJto4UMx$J z%=x*o?xxTT!2@t5*5ff@FiNru&!7vBV`rjlXZ)@!+U%-$wlmhb9@CrPYr}#kU^U*v z=#=u67>C=jC8wS((PmtHrjpTEiVrcq0e|ZjJQA-7Vke}OZ@?w-+E7EiMbAyb8Z5za zHPpM0S_L18h3LUmLO3TW>ZxkUi;NOx3i-V-`cyU53NAPD9Ts3vMR`#!)NEci*75s`>I18(4@wiD8jr`MPPmu=*E}HDid3rLQ$DRfqZ-k=!&RhhQ1y7g1 zoJ;0u+qQC5kj(F8Ddh((b4$2Wi2Jk!d%N?rUU~%|CksATQr?){QNq0`2LE@S*2^lv z=UIY=N@ka&B(^ZeohE0r>%(*jgWBMfvSB5>ky6l!*}{tIJzS2CR(aS2I)riPeQXrc z^yn13*9YP*>=4eGDn$*zMe+Ix-FOavw8ZV&87749EjT{MZYN&BoD#O;R{KZatYzT| zcm$i`!)cp_c5xnF6*}Qz*zWqpo-dqkG(juAqS%@nqil^mN>Pmj=pFUgLYx@py`mRdt_TeO*|I7J$w)i2YMgUkrr?7(^b z>-gP>Xp^s_k&TsU$;sMaAEKNwSBp z70!oRGFbE#l0CdfKNm~;{>P)wa7b`}=aAt3&LP45oqE^ON8yKNI#LHkXI!b&BKV)g zeF-Pk(_jnPQH@b8A^ldJjY!Eh<00WL{@rTlgX`FPg*$e1s{>Zihs%Y#))r#oM&M2D z74{3JU}GC&)QB5|WjL{buPt~MC*fjr)fu-77pO0+8Hg%Hy_YnP>^?vJ5QKkE`)~!ahVesK$gX5z4H3&DaZtJGxP5@}@CC zxEZT(exu2j@Lr=qWd_QVd@f;66ZXFFWAsO^jmA5|Ic~E0C-)>>I7euOyd~vCQ4yEr zWV=FGUe%;6#jQd?zB_Vl7QPVrD9tbxUtxOeVhMlZjSP;G>%1cDk~-sW!LJef4Opsm zjo9IM3D+ktRL*k?GdP*%!1-yYuoUYFds}EdB$-i;m8XrLg+XP%Gpdc19!i(+CT3g% zCwqk)Gg|0I#~3L4Np4gp3rlfWo>}K)r;vtz;=nIBAatG@F<98K>Iow(@z@T$P0{{`YXyLjEU`9@8UM`lXD|t<?1n+a literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/leave_unselect.png b/app/src/main/res/mipmap-mdpi/leave_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..3a96c18573ce190504712074d46e96fd882b8481 GIT binary patch literal 1579 zcmV+`2Gse9P)ZTZ^JnOhwz`qsp5?skXJZmk({d+&4Zx%Z!(+|2AXYi8{| zkG0m^k(Db~8jvYC25-T99FCXbMc9L}-4o8}SL%hV|;}MBIeG;5~iz-#1N^PsL?;0Ot&8K!@N) z{1QhFL0>6#)AAsE7YiEd+b!1ERy7M`Nmtdo6w<4D7{r z{1A8Jcla~@-$Qmf&J?p?R#N{09NcicebH-*9ff=JHf$3cvo?3F_rr=w`z?_G$M0}xP zu)Ih8G#n?+&KYIB=y9fo(5Jii?GHSBayR)|Br&8V1qbHy<+wl|{KB)Ux*n%$%G~DJaz*$LoO!%x9;X&*y{$5nnk0r8a;q_I@Tg9(zU3}KWJGbx7 z%3l*sbs4M0Ihk^PmGTzeC=TP4XM}@0(d0XGoeOqDRz9&xxP=o+>Tko2nvRA+?snC! z@BDd{Yxw+^%elLzlVP!EB9*tq&XaTRM0T3+_pCg>M*ej*?K@~G_sBQbbTTY{mX+UE zBcDHCQzhIIIggZ4;lWP^H;VK_oAZU!P{!FhcgL}!eNS4t1IW=b!3NA3pv?nVm6S(> zFM73bET$EIuP*9G64_NEe(cFqvF*=D>ZS=dY-b;XoF~GhLAVfaD0C2!$tR0nFWS+2 zB`y4?r2ddT1~(6P>5l)N#ucoJ;{75gT1!jBYB>uVw5>DjH%$hBw~1ZvK`}k6Sb)D3@{8&ew?v{e=hT{Z!!Yd7 zLdTDU8#Pib{yZav{Ouxv^_pISZR7ID_NaKzX_ifUudQ~ zF4KMfo+_gK)5|((;aTzaQbw?}ME(fXhW)ySF)8mAxzKcn-X?ax!*Qj!TiBL7TPtGA zxwt@Q#6JVy6B+Cd+A-XUl0huhonzUITXe=%&uDJgV&U1RvE%*1t-4OVuenF;z(?!c zE2b2B7pKDQPS)V}nW9(Womt&3@rK`yCxu~)G&5`#zNyo&bs`h}P=od zZ%CF?yQ49Y`O3KpFD|M7zIfZGXl5AkW~V3RO=7JK>gsJT+HXqgX5cIBLi!eeEY?EG zEA&2y|Dpa|YIC}{$7{0(=NfDXI9|H)CLa|^(3GXPWSoPzI4iFZcMHQ{ zJ@OmWOXxQ45%DJS+{snAM$GGenJd;+o89>Q0D7wUoX#;Hhr`M)Le_}wdT&<$ar{<% z_I_BBm4ASL^{Jzde-?UE7Wca4xk>nXdH8d*NI~2ulDKacp-vtXrsS?%ex?qKT<^lF z`?*zO{oO1s5L4zCze|hqPLV(@BhMuNyndVmk-L#c)?ESLA->kHYUHZC^p|JlVNc06 zTeI>(P42h1i1gowl*fKl8~4JjTy;S?9`ft0=}j;1_loUyj_~a^X3w7-=fEa}e*ZIJ zhd9)a5c$q4#HHXwO|@|`$UoV%S+BW=lG4(B%nXCBGk8M($)yL!){6{B?_?O4f2CC- z_-q<^*D+G)%X65c@;j+mvZne0Q-eB--c2h=0 dWPc8BeGV8%G?mN9*C+r0002ovPDHLkV1mSqD^36a literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d34eab5..5c662e3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -27,7 +27,7 @@ #ff8635 @android:color/transparent @color/white - + #88000000 diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 0000000..4b431f6 --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 020f09b..ec498c1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -10,6 +10,8 @@ @color/colorAccent @color/backgroundColor 500dp + true + true + + + +