>: BaseQuickAndroidMVPActivity(),
+ MINVpnBaseView {
+
+
+ override fun showWarning(msg: String) {
+ toast(msg)
+ }
+
+ override fun showSuccess(msg: String) {
+ toast(msg)
+ }
+
+ override fun showError(msg: String) {
+ toast(msg)
+ }
+
+
+ override fun onStart() {
+ super.onStart()
+ EventBus.getDefault().register(this)
+ }
+
+ override fun onStop() {
+ super.onStop()
+ EventBus.getDefault().unregister(this)
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun onReceiveTest(test: String) {
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/base/mvp/MINVpnBaseView.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/base/mvp/MINVpnBaseView.kt
new file mode 100644
index 0000000..2534110
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/base/mvp/MINVpnBaseView.kt
@@ -0,0 +1,11 @@
+package cn.tsr.personal_drug_management.activity.base.mvp
+
+import cn.qjm253.quick_android_mvp.base.mvp.BaseView
+
+interface MINVpnBaseView : BaseView {
+ fun showWarning(msg: String)
+
+ fun showSuccess(msg: String)
+
+ fun showError(msg: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivity.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivity.kt
new file mode 100644
index 0000000..f5ba7ff
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivity.kt
@@ -0,0 +1,99 @@
+package cn.tsr.personal_drug_management.activity.login
+
+import android.content.Intent
+import android.os.Bundle
+import cn.tsr.personal_drug_management.activity.base.MINVpnBaseActivity
+import cn.tsr.personal_drug_management.activity.register.RegisterActivity
+import cn.tsr.personal_drug_management.activity.setting.SettingActivity
+import cn.tsr.personal_drug_management.extensions.listenKeyboardVisible
+import cn.qjm253.quick_android_base.GlideApp
+import cn.qjm253.quick_android_base.extensions.*
+import cn.qjm253.quick_android_base.util.DisplayUtils
+import cn.qjm253.quick_android_easy_bar.EasyBar
+import cn.qjm253.quick_android_easy_bar.init
+import cn.tsr.personal_drug_management.R
+import cn.tsr.personal_drug_management.activity.main.MainActivity
+import kotlinx.android.synthetic.main.activity_login.*
+import kotlinx.android.synthetic.main.bar_item.*
+
+class LoginActivity : MINVpnBaseActivity(), LoginActivityContract.View {
+
+ override fun onNewIntent(intent: Intent?) {
+ super.onNewIntent(intent)
+ intent?.let {
+ val username = it.getStringExtra("username")
+ etUsername.setText(username)
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_login)
+
+ initView()
+ }
+
+
+ private fun initView() {
+ easyBar.init(mode = EasyBar.Mode.ICON, title = getString(R.string.login), leftCallback = {
+ onBackPressed()
+ }, rightRes = R.drawable.setting, rightCallback = {
+ jumpTo(SettingActivity::class.java)
+ }, tinColor = R.color.white)
+
+ GlideApp.with(this)
+ .load(R.drawable.logo)
+// .circleCrop()
+ .into(imgLogo)
+
+
+ tvRegisterNow.setOnClickListener {
+ jumpTo(RegisterActivity::class.java)
+ }
+
+ btnLogin.setBackgroundResource(R.drawable.button_shape_default)
+ btnLogin.setOnClickListener {
+ hideSoftKeyboard(btnLogin)
+ btnLogin.startAnimation()
+
+ // TODO 这边执行登录逻辑
+
+ btnLogin.postDelayed({
+ btnLogin.revertAnimation()
+
+ // 模拟登录完成
+ jumpTo(MainActivity::class.java)
+ }, 2000)
+
+ }
+
+ /**
+ * 监听键盘是否弹起
+ */
+ listenKeyboardVisible {
+ if (it) {
+ imgLogo.animer(
+ imgLogo.scaleXAnimation(1f, 0.5f),
+ imgLogo.scaleYAnimation(1f, 0.5f),
+ imgLogo.transYAnimation(0f, -DisplayUtils.dp2px(this, 40).toFloat()),
+ etUsername.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ etPassword.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ btnLogin.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ duration = 200
+ )
+ } else {
+ imgLogo.animer(
+ imgLogo.scaleXAnimation(0.5f, 1f),
+ imgLogo.scaleYAnimation(0.5f, 1f),
+ imgLogo.transYAnimation(-DisplayUtils.dp2px(this, 40).toFloat(), 0f),
+ etUsername.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ etPassword.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ btnLogin.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ duration = 200
+ )
+ }
+ }
+ }
+
+ override fun onCreatePresenter(): LoginActivityPresenter = LoginActivityPresenter(this)
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityContract.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityContract.kt
new file mode 100644
index 0000000..dd80ec7
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityContract.kt
@@ -0,0 +1,18 @@
+package cn.tsr.personal_drug_management.activity.login
+
+import cn.tsr.personal_drug_management.activity.base.mvp.MINVpnBaseView
+import cn.qjm253.quick_android_mvp.base.mvp.BaseModel
+import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter
+
+interface LoginActivityContract {
+ interface View : MINVpnBaseView {
+
+ }
+
+ interface Model : BaseModel {
+
+ }
+
+ abstract class Presenter : BasePresenter() {
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityModel.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityModel.kt
new file mode 100644
index 0000000..726b230
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityModel.kt
@@ -0,0 +1,3 @@
+package cn.tsr.personal_drug_management.activity.login
+
+class LoginActivityModel(private val mPresenter: LoginActivityPresenter) : LoginActivityContract.Model
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityPresenter.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityPresenter.kt
new file mode 100644
index 0000000..575c1c9
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/login/LoginActivityPresenter.kt
@@ -0,0 +1,12 @@
+package cn.tsr.personal_drug_management.activity.login
+
+import cn.tsr.personal_drug_management.activity.login.LoginActivity
+import cn.tsr.personal_drug_management.activity.login.LoginActivityContract
+import cn.tsr.personal_drug_management.activity.login.LoginActivityModel
+
+class LoginActivityPresenter(loginActivity: LoginActivity) : LoginActivityContract.Presenter() {
+ init {
+ mView = loginActivity
+ mModel = LoginActivityModel(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivity.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivity.kt
new file mode 100644
index 0000000..e2816a9
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivity.kt
@@ -0,0 +1,60 @@
+package cn.tsr.personal_drug_management.activity.main
+
+import android.os.Bundle
+import cn.tsr.personal_drug_management.activity.base.MINVpnBaseActivity
+import cn.tsr.personal_drug_management.activity.setting.SettingActivity
+import cn.qjm253.quick_android_base.extensions.alphaAnimation
+import cn.qjm253.quick_android_base.extensions.animer
+import cn.qjm253.quick_android_base.extensions.jumpTo
+import cn.qjm253.quick_android_easy_bar.EasyBar
+import cn.qjm253.quick_android_easy_bar.init
+import cn.tsr.personal_drug_management.R
+import com.github.ybq.android.spinkit.style.DoubleBounce
+import kotlinx.android.synthetic.main.activity_main.*
+import kotlinx.android.synthetic.main.bar_item.*
+
+class MainActivity : MINVpnBaseActivity(), MainActivityContract.View {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+
+ initView()
+ }
+
+ private var isConnected = false
+
+ private fun initView() {
+ easyBar.init(
+ EasyBar.Mode.ICON,
+ "主页",
+ rightRes = R.drawable.setting,
+ tinColor = R.color.white,
+ leftRes = R.drawable.menu,
+ rightCallback = {
+ jumpTo(SettingActivity::class.java)
+ }
+ )
+
+ spinKit.setIndeterminateDrawable(DoubleBounce())
+ btnConnect.setOnClickListener {
+ btnConnect.isClickable = false
+ btnConnect.animer(btnConnect.alphaAnimation(1.0f, 0.3f), duration = 0)
+
+
+ // 模拟异步事件
+ btnConnect.postDelayed({
+ btnConnect.isClickable = true
+ if (!isConnected) {
+ btnConnect.setImageResource(R.drawable.security)
+ } else {
+ btnConnect.setImageResource(R.drawable.launch)
+ }
+ isConnected = !isConnected
+ btnConnect.animer(btnConnect.alphaAnimation(0.3f, 1.0f), duration = 1000)
+ }, 2000)
+ }
+ }
+
+ override fun onCreatePresenter(): MainActivityPresenter =
+ MainActivityPresenter(this)
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityContract.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityContract.kt
new file mode 100644
index 0000000..633639b
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityContract.kt
@@ -0,0 +1,18 @@
+package cn.tsr.personal_drug_management.activity.main
+
+import cn.tsr.personal_drug_management.activity.base.mvp.MINVpnBaseView
+import cn.qjm253.quick_android_mvp.base.mvp.BaseModel
+import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter
+
+interface MainActivityContract {
+ interface View : MINVpnBaseView {
+
+ }
+
+ interface Model : BaseModel {
+
+ }
+
+ abstract class Presenter : BasePresenter() {
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityModel.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityModel.kt
new file mode 100644
index 0000000..7e9fa90
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityModel.kt
@@ -0,0 +1,3 @@
+package cn.tsr.personal_drug_management.activity.main
+
+class MainActivityModel(val mPresenter: MainActivityPresenter) : MainActivityContract.Model
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityPresenter.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityPresenter.kt
new file mode 100644
index 0000000..f763eb2
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/main/MainActivityPresenter.kt
@@ -0,0 +1,12 @@
+package cn.tsr.personal_drug_management.activity.main
+
+import cn.tsr.personal_drug_management.activity.main.MainActivity
+import cn.tsr.personal_drug_management.activity.main.MainActivityContract
+import cn.tsr.personal_drug_management.activity.main.MainActivityModel
+
+class MainActivityPresenter(mainActivity: MainActivity) : MainActivityContract.Presenter() {
+ init {
+ mView = mainActivity
+ mModel = MainActivityModel(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivity.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivity.kt
new file mode 100644
index 0000000..b56f15c
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivity.kt
@@ -0,0 +1,133 @@
+package cn.tsr.personal_drug_management.activity.register
+
+import android.os.Bundle
+import cn.tsr.personal_drug_management.activity.base.MINVpnBaseActivity
+import cn.tsr.personal_drug_management.extensions.listenKeyboardVisible
+import cn.tsr.personal_drug_management.utils.CountDownUtil
+import cn.qjm253.quick_android_base.GlideApp
+import cn.qjm253.quick_android_base.extensions.*
+import cn.qjm253.quick_android_base.params.IntentParam
+import cn.qjm253.quick_android_base.util.AccountValidatorUtil
+import cn.qjm253.quick_android_base.util.DisplayUtils
+import cn.qjm253.quick_android_easy_bar.EasyBar
+import cn.qjm253.quick_android_easy_bar.init
+import cn.tsr.personal_drug_management.R
+import cn.tsr.personal_drug_management.activity.login.LoginActivity
+import kotlinx.android.synthetic.main.activity_register.*
+import kotlinx.android.synthetic.main.bar_item.*
+
+class RegisterActivity : MINVpnBaseActivity(),
+ RegisterActivityContract.View {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_register)
+
+ initView()
+ }
+
+ private fun initView() {
+ easyBar.init(mode = EasyBar.Mode.ICON_, titleRes = R.string.register, leftCallback = {
+ onBackPressed()
+ })
+
+ GlideApp.with(this)
+ .load(R.drawable.logo)
+// .circleCrop()
+ .into(imgLogo)
+
+ btnRegister.setBackgroundResource(R.drawable.button_shape_default)
+ btnRegister.setOnClickListener {
+ hideSoftKeyboard(btnRegister)
+ btnRegister.startMorphAnimation()
+
+ // TODO 注册操作
+
+ btnRegister.postDelayed({
+ btnRegister.revertAnimation()
+
+ // 模拟注册成功操作
+ toast("注册成功")
+ // 注册成功跳转到登录界面登录
+ val username = etUsername.text.toString()
+ jumpTo(
+ LoginActivity::class.java, IntentParam()
+ .add("username", username)
+ )
+ }, 2000)
+// QuickAndroid.createRxPermissioqjmn(this)
+// .request(
+// arrayOf(
+// Manifest.permission.WRITE_EXTERNAL_STORAGE,
+// Manifest.permission.READ_EXTERNAL_STORAGE
+// )
+// )
+// .subscribe {
+// if (it.granted) {
+//
+// }
+// }
+
+ }
+ tvSendVerifyCode.setOnClickListener {
+ val phone = etPhoneNumber.text.toString()
+ if (phone.isEmpty()) {
+ showWarning("手机号不能为空")
+ btnRegister.stopAnimation()
+ return@setOnClickListener
+ }
+ if (!AccountValidatorUtil.isMobile(phone)) {
+ showWarning("请输入有效的手机号")
+ btnRegister.stopAnimation()
+ return@setOnClickListener
+ }
+ CountDownUtil.startCountDown(60)
+ .doOnSubscribe {
+ // TODO 发送验证码操作
+
+ tvSendVerifyCode.isClickable = false
+ }
+ .subscribe({
+ tvSendVerifyCode.text = "${it}s后可再次发送"
+ }, {
+ it.printStackTrace()
+ }, {
+ tvSendVerifyCode.isClickable = true
+ tvSendVerifyCode.setText(R.string.send_verify_code)
+ })
+ }
+ listenKeyboardVisible {
+ if (it) {
+ imgLogo.animer(
+ imgLogo.scaleXAnimation(1f, 0.5f),
+ imgLogo.scaleYAnimation(1f, 0.5f),
+ imgLogo.transYAnimation(0f, -DisplayUtils.dp2px(this, 40).toFloat()),
+ etUsername.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ etPassword.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ etRePassword.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ etPhoneNumber.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ etVerifyCode.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ tvSendVerifyCode.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ btnRegister.transYAnimation(0f, -DisplayUtils.dp2px(this, 90).toFloat()),
+ duration = 200
+ )
+ } else {
+ imgLogo.animer(
+ imgLogo.scaleXAnimation(0.5f, 1f),
+ imgLogo.scaleYAnimation(0.5f, 1f),
+ imgLogo.transYAnimation(-DisplayUtils.dp2px(this, 40).toFloat(), 0f),
+ etUsername.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ etPassword.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ etRePassword.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ etPhoneNumber.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ etVerifyCode.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ tvSendVerifyCode.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ btnRegister.transYAnimation(-DisplayUtils.dp2px(this, 90).toFloat(), 0f),
+ duration = 200
+ )
+ }
+ }
+ }
+
+
+ override fun onCreatePresenter(): RegisterActivityPresenter = RegisterActivityPresenter(this)
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityContract.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityContract.kt
new file mode 100644
index 0000000..32f229b
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityContract.kt
@@ -0,0 +1,18 @@
+package cn.tsr.personal_drug_management.activity.register
+
+import cn.tsr.personal_drug_management.activity.base.mvp.MINVpnBaseView
+import cn.qjm253.quick_android_mvp.base.mvp.BaseModel
+import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter
+
+interface RegisterActivityContract {
+ interface View : MINVpnBaseView {
+
+ }
+
+ interface Model : BaseModel {
+
+ }
+
+ abstract class Presenter : BasePresenter() {
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityModel.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityModel.kt
new file mode 100644
index 0000000..31733ee
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityModel.kt
@@ -0,0 +1,3 @@
+package cn.tsr.personal_drug_management.activity.register
+
+class RegisterActivityModel(private val mPresenter: RegisterActivityPresenter) : RegisterActivityContract.Model
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityPresenter.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityPresenter.kt
new file mode 100644
index 0000000..cd81666
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/register/RegisterActivityPresenter.kt
@@ -0,0 +1,13 @@
+package cn.tsr.personal_drug_management.activity.register
+
+import cn.tsr.personal_drug_management.activity.register.RegisterActivity
+import cn.tsr.personal_drug_management.activity.register.RegisterActivityContract
+import cn.tsr.personal_drug_management.activity.register.RegisterActivityModel
+
+class RegisterActivityPresenter(registerActivity: RegisterActivity)
+ : RegisterActivityContract.Presenter() {
+ init {
+ mView = registerActivity
+ mModel = RegisterActivityModel(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivity.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivity.kt
new file mode 100644
index 0000000..f0cfb73
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivity.kt
@@ -0,0 +1,59 @@
+package cn.tsr.personal_drug_management.activity.setting
+
+import android.os.Bundle
+import cn.tsr.personal_drug_management.activity.base.MINVpnBaseActivity
+import cn.tsr.personal_drug_management.model.MINVpnAPI
+import cn.qjm253.quick_android_easy_bar.EasyBar
+import cn.qjm253.quick_android_easy_bar.init
+import cn.tsr.personal_drug_management.R
+import kotlinx.android.synthetic.main.activity_setting.*
+import kotlinx.android.synthetic.main.bar_item.*
+import org.jetbrains.anko.toast
+
+class SettingActivity : MINVpnBaseActivity(),
+ SettingActivityContract.View {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_setting)
+
+ initView()
+ }
+
+ private fun initView() {
+ easyBar.init(mode = EasyBar.Mode.ICON_, titleRes = R.string.setting, leftCallback = {
+ onBackPressed()
+ })
+
+ btnSaveSetting.setBackgroundResource(R.drawable.button_shape_default)
+
+ // 获取本地的设置填充
+ etIpAddress.setText(MINVpnAPI.getMirIpAddress())
+ etPort.setText("${MINVpnAPI.getMirPort()}")
+ etServicePrefix.setText(MINVpnAPI.getServicePrefix())
+ etBlockChainIp.setText(MINVpnAPI.getBlockChainIpAddress())
+ etBlockChainPort.setText("${MINVpnAPI.getBlockChainPort()}")
+
+ btnSaveSetting.setOnClickListener {
+ btnSaveSetting.startAnimation()
+ val mirIpAddress = etIpAddress.text.toString()
+ val mirPort = etPort.text.toString().toInt()
+ val blockChainIpAddress = etBlockChainIp.text.toString()
+ val blockChainPort = etBlockChainPort.text.toString().toInt()
+ val servicePrefix = etServicePrefix.text.toString()
+
+ MINVpnAPI.updateBlockChainIpAddress(blockChainIpAddress)
+ MINVpnAPI.updateBlockChainPort(blockChainPort)
+ MINVpnAPI.updateMirIpAddress(mirIpAddress)
+ MINVpnAPI.updateMirPort(mirPort)
+ MINVpnAPI.updateServicePrefix(servicePrefix)
+ btnSaveSetting.postDelayed({
+ btnSaveSetting.revertAnimation()
+ toast("保存成功")
+ }, 1000)
+ }
+
+ }
+
+ override fun onCreatePresenter(): SettingActivityPresenter =
+ SettingActivityPresenter(this)
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityContract.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityContract.kt
new file mode 100644
index 0000000..927e4f5
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityContract.kt
@@ -0,0 +1,18 @@
+package cn.tsr.personal_drug_management.activity.setting
+
+import cn.tsr.personal_drug_management.activity.base.mvp.MINVpnBaseView
+import cn.qjm253.quick_android_mvp.base.mvp.BaseModel
+import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter
+
+interface SettingActivityContract {
+ interface View : MINVpnBaseView {
+
+ }
+
+ interface Model : BaseModel {
+
+ }
+
+ abstract class Presenter : BasePresenter() {
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityModel.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityModel.kt
new file mode 100644
index 0000000..09c8eb5
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityModel.kt
@@ -0,0 +1,5 @@
+package cn.tsr.personal_drug_management.activity.setting
+
+class SettingActivityModel(val mPresenter: SettingActivityPresenter) :
+ SettingActivityContract.Model {
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityPresenter.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityPresenter.kt
new file mode 100644
index 0000000..b69cdda
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/setting/SettingActivityPresenter.kt
@@ -0,0 +1,12 @@
+package cn.tsr.personal_drug_management.activity.setting
+
+import cn.tsr.personal_drug_management.activity.setting.SettingActivity
+import cn.tsr.personal_drug_management.activity.setting.SettingActivityContract
+import cn.tsr.personal_drug_management.activity.setting.SettingActivityModel
+
+class SettingActivityPresenter(settingActivity: SettingActivity) : SettingActivityContract.Presenter() {
+ init {
+ mView = settingActivity
+ mModel = SettingActivityModel(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivity.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivity.kt
new file mode 100644
index 0000000..a9c6c77
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivity.kt
@@ -0,0 +1,50 @@
+package cn.tsr.personal_drug_management.activity.welcome
+
+import android.os.Bundle
+import cn.tsr.personal_drug_management.activity.main.MainActivity
+import cn.tsr.personal_drug_management.activity.base.MINVpnBaseActivity
+import cn.tsr.personal_drug_management.activity.login.LoginActivity
+import cn.qjm253.quick_android_base.GlideApp
+import cn.qjm253.quick_android_base.QuickAndroid
+import cn.qjm253.quick_android_base.extensions.jumpTo
+import cn.qjm253.quick_android_base.extensions.scaleXY
+import cn.qjm253.quick_android_rx_permission.createRxPermission
+import cn.tsr.personal_drug_management.R
+import kotlinx.android.synthetic.main.activity_welcome.*
+
+class WelcomeActivity : MINVpnBaseActivity(),
+ WelcomeActivityContract.View {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_welcome)
+
+ initView()
+ }
+
+ private fun initView() {
+ GlideApp.with(this)
+ .load(R.drawable.logo)
+// .circleCrop()
+ .into(imgLogo)
+ imgLogo.scaleXY(0.5f, 1.1f)
+ imgLogo.postDelayed({
+ QuickAndroid
+ .createRxPermission(this)
+ .request(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE))
+ .subscribe {
+ if(it.granted) {
+ if(false) {
+ jumpTo(MainActivity::class.java)
+ } else {
+ jumpTo(LoginActivity::class.java)
+ }
+ finish()
+ } else {
+ finish()
+ }
+ }
+ }, 600)
+ }
+
+ override fun onCreatePresenter(): WelcomeActivityPresenter = WelcomeActivityPresenter(this)
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityContract.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityContract.kt
new file mode 100644
index 0000000..578e7a6
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityContract.kt
@@ -0,0 +1,18 @@
+package cn.tsr.personal_drug_management.activity.welcome
+
+import cn.tsr.personal_drug_management.activity.base.mvp.MINVpnBaseView
+import cn.qjm253.quick_android_mvp.base.mvp.BaseModel
+import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter
+
+interface WelcomeActivityContract {
+ interface View : MINVpnBaseView {
+
+ }
+
+ interface Model : BaseModel {
+
+ }
+
+ abstract class Presenter : BasePresenter() {
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityModel.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityModel.kt
new file mode 100644
index 0000000..ca985c3
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityModel.kt
@@ -0,0 +1,3 @@
+package cn.tsr.personal_drug_management.activity.welcome
+
+class WelcomeActivityModel(private val mPresenter: WelcomeActivityPresenter) : WelcomeActivityContract.Model
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityPresenter.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityPresenter.kt
new file mode 100644
index 0000000..d9cf6df
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/welcome/WelcomeActivityPresenter.kt
@@ -0,0 +1,13 @@
+package cn.tsr.personal_drug_management.activity.welcome
+
+import cn.tsr.personal_drug_management.activity.welcome.WelcomeActivity
+import cn.tsr.personal_drug_management.activity.welcome.WelcomeActivityContract
+import cn.tsr.personal_drug_management.activity.welcome.WelcomeActivityModel
+
+class WelcomeActivityPresenter(welcomeActivity: WelcomeActivity) :
+ WelcomeActivityContract.Presenter() {
+ init {
+ mView = welcomeActivity
+ mModel = WelcomeActivityModel(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/extensions/ActivityExtensions.kt b/app/src/main/java/cn/tsr/personal_drug_management/extensions/ActivityExtensions.kt
new file mode 100644
index 0000000..b81a44e
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/extensions/ActivityExtensions.kt
@@ -0,0 +1,26 @@
+package cn.tsr.personal_drug_management.extensions
+
+import android.app.Activity
+import android.graphics.Rect
+import android.view.View
+import cn.qjm253.quick_android_base.util.DisplayUtils
+
+fun Activity.listenKeyboardVisible(onChange: (isOpen: Boolean) -> Unit) {
+ val contentView = findViewById(android.R.id.content)
+ val activityRoot = window.decorView
+
+ val rectR = Rect()
+ var lastOpenState = false
+ val visibleThreshold = DisplayUtils.dp2px(this, 100)
+ contentView.viewTreeObserver.addOnGlobalLayoutListener {
+ activityRoot.getWindowVisibleDisplayFrame(rectR)
+ val heightDiff = activityRoot.rootView.height - rectR.height()
+
+ // 键盘是否弹出
+ val isOpen = heightDiff > visibleThreshold
+ if (lastOpenState != isOpen) {
+ onChange(isOpen)
+ lastOpenState = isOpen
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/extensions/ContextExtensions.kt b/app/src/main/java/cn/tsr/personal_drug_management/extensions/ContextExtensions.kt
new file mode 100644
index 0000000..a229e81
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/extensions/ContextExtensions.kt
@@ -0,0 +1,10 @@
+package cn.tsr.personal_drug_management.extensions
+
+import android.content.Context
+import androidx.annotation.ColorRes
+import androidx.core.content.ContextCompat
+
+
+fun Context.easyGetColor(@ColorRes id: Int): Int {
+ return ContextCompat.getColor(this, id)
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/extensions/ImageViewExtensions.kt b/app/src/main/java/cn/tsr/personal_drug_management/extensions/ImageViewExtensions.kt
new file mode 100644
index 0000000..19000ea
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/extensions/ImageViewExtensions.kt
@@ -0,0 +1,63 @@
+package cn.tsr.personal_drug_management.extensions
+
+import android.net.Uri
+import android.widget.ImageView
+import androidx.annotation.DrawableRes
+import cn.qjm253.quick_android_base.GlideApp
+import java.io.File
+
+
+fun ImageView.loadFile(
+ file: File,
+ circleCrop: Boolean = false,
+ centerCrop: Boolean = false,
+ centerInside: Boolean = false
+) {
+ val gr = GlideApp.with(context)
+ .load(file)
+ if (circleCrop)
+ gr.circleCrop()
+ if (centerCrop)
+ gr.centerCrop()
+ if (centerInside)
+ gr.centerInside()
+ gr.into(this)
+}
+
+///**
+// * NDN的方式加载网络图片,并渲染到ImageView上
+// */
+//@SuppressLint("CheckResult")
+//fun ImageView.loadNDNFile(
+// fileName: String, forceRefresh: Boolean = false,
+// circleCrop: Boolean = false,
+// centerCrop: Boolean = false,
+// centerInside: Boolean = false
+//) {
+// val image = FileUtils.generatePictureFile(fileName.encodeToMD5())
+// if (image.exists() && !forceRefresh) {
+// loadFile(image, circleCrop, centerCrop, centerInside)
+// } else {
+// API.downloadFile(fileName)
+// .compose(RxSchedulersHelper.io_main())
+// .subscribe({
+// it.toJson().i()
+// loadFile(it.file, circleCrop, centerCrop, centerInside)
+// }, {
+// image.deleteOnExit()
+// it.printStackTrace()
+// })
+// }
+//}
+
+fun ImageView.load(@DrawableRes res: Int) {
+ GlideApp.with(this)
+ .load(res)
+ .into(this)
+}
+
+fun ImageView.load(uri: Uri) {
+ GlideApp.with(this)
+ .load(uri)
+ .into(this)
+}
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/model/MINVpnAPI.kt b/app/src/main/java/cn/tsr/personal_drug_management/model/MINVpnAPI.kt
new file mode 100644
index 0000000..1df8377
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/model/MINVpnAPI.kt
@@ -0,0 +1,80 @@
+package cn.tsr.personal_drug_management.model
+
+import android.app.Application
+import android.content.Context
+import cn.qjm253.quick_android_base.util.SpUtils
+
+object MINVpnAPI {
+
+
+ //////////////////////////////////////////////////////////////////////////////////
+ //////// 设置相关
+ //////////////////////////////////////////////////////////////////////////////////
+ private const val SP_LOCAL_SETTING_MIR_IP_ADDRESS = "SP_LOCAL_SETTING_MIR_IP_ADDRESS"
+ private const val SP_LOCAL_SETTING_MIR_PORT = "SP_LOCAL_SETTING_MIR_PORT"
+ private const val SP_LOCAL_SETTING_SERVICE_PREFIX = "SP_LOCAL_SETTING_SERVICE_PREFIX"
+ private const val SP_LOCAL_SETTING_BLOCK_CHAIN_IP_ADDRESS =
+ "SP_LOCAL_SETTING_BLOCK_CHAIN_IP_ADDRESS"
+ private const val SP_LOCAL_SETTING_BLOCK_CHAIN_PORT = "SP_LOCAL_SETTING_BLOCK_CHAIN_PORT"
+
+ private var mirIpAddress: String = "127.0.0.1"
+ private var mirPort: Int = 6363
+ private var servicePrefix: String = "/min/vpn"
+ private var blockChainIpAddress: String = "127.0.0.1"
+ private var blockChainPort: Int = 9748
+
+ private lateinit var context: Context
+
+
+ fun init(applicationContext: Application) {
+ context = applicationContext
+ SpUtils.getAll(applicationContext)?.forEach {
+ when (it.key) {
+ SP_LOCAL_SETTING_MIR_IP_ADDRESS -> mirIpAddress = it.value as String
+ SP_LOCAL_SETTING_MIR_PORT -> mirPort = it.value as Int
+ SP_LOCAL_SETTING_SERVICE_PREFIX -> servicePrefix = it.value as String
+ SP_LOCAL_SETTING_BLOCK_CHAIN_IP_ADDRESS -> blockChainIpAddress = it.value as String
+ SP_LOCAL_SETTING_BLOCK_CHAIN_PORT -> blockChainPort = it.value as Int
+ }
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ ////// 设置相关获取和更新
+ ////////////////////////////////////////////////////////////////////////////////////
+
+ fun getMirIpAddress() = mirIpAddress
+
+ fun getMirPort() = mirPort
+
+ fun getServicePrefix() = servicePrefix
+
+ fun getBlockChainIpAddress() = blockChainIpAddress
+
+ fun getBlockChainPort() = blockChainPort
+
+ fun updateMirIpAddress(mirIpAddress: String) {
+ MINVpnAPI.mirIpAddress = mirIpAddress
+ SpUtils.put(context, SP_LOCAL_SETTING_MIR_IP_ADDRESS, mirIpAddress)
+ }
+
+ fun updateMirPort(mirPort: Int) {
+ MINVpnAPI.mirPort = mirPort
+ SpUtils.put(context, SP_LOCAL_SETTING_MIR_PORT, mirPort)
+ }
+
+ fun updateServicePrefix(servicePrefix: String) {
+ MINVpnAPI.servicePrefix = servicePrefix
+ SpUtils.put(context, SP_LOCAL_SETTING_SERVICE_PREFIX, servicePrefix)
+ }
+
+ fun updateBlockChainIpAddress(blockChainIpAddress: String) {
+ MINVpnAPI.blockChainIpAddress = blockChainIpAddress
+ SpUtils.put(context, SP_LOCAL_SETTING_BLOCK_CHAIN_IP_ADDRESS, blockChainIpAddress)
+ }
+
+ fun updateBlockChainPort(blockChainPort: Int) {
+ MINVpnAPI.blockChainPort = blockChainPort
+ SpUtils.put(context, SP_LOCAL_SETTING_BLOCK_CHAIN_PORT, blockChainPort)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/tsr/personal_drug_management/utils/CountDownUtil.kt b/app/src/main/java/cn/tsr/personal_drug_management/utils/CountDownUtil.kt
new file mode 100644
index 0000000..8bf71e0
--- /dev/null
+++ b/app/src/main/java/cn/tsr/personal_drug_management/utils/CountDownUtil.kt
@@ -0,0 +1,22 @@
+package cn.tsr.personal_drug_management.utils
+
+import io.reactivex.Observable
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import java.util.concurrent.TimeUnit
+
+object CountDownUtil {
+ fun startCountDown(countTime: Int): Observable {
+ var totalTime = 0
+ if (countTime > 0)
+ totalTime = countTime
+
+ return Observable.interval(0, 1, TimeUnit.SECONDS)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .map {
+ return@map totalTime - it
+ }
+ .take(countTime + 1L)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/approval.png b/app/src/main/res/drawable/approval.png
new file mode 100644
index 0000000..20422e7
Binary files /dev/null and b/app/src/main/res/drawable/approval.png differ
diff --git a/app/src/main/res/drawable/btn_bg.xml b/app/src/main/res/drawable/btn_bg.xml
new file mode 100644
index 0000000..ffb73fb
--- /dev/null
+++ b/app/src/main/res/drawable/btn_bg.xml
@@ -0,0 +1,13 @@
+
+
+ -
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/button_shape_circle.xml b/app/src/main/res/drawable/button_shape_circle.xml
new file mode 100644
index 0000000..d658f40
--- /dev/null
+++ b/app/src/main/res/drawable/button_shape_circle.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/button_shape_default.xml b/app/src/main/res/drawable/button_shape_default.xml
new file mode 100644
index 0000000..ef5db47
--- /dev/null
+++ b/app/src/main/res/drawable/button_shape_default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/code.png b/app/src/main/res/drawable/code.png
new file mode 100644
index 0000000..c5b6573
Binary files /dev/null and b/app/src/main/res/drawable/code.png differ
diff --git a/app/src/main/res/drawable/collection.png b/app/src/main/res/drawable/collection.png
new file mode 100644
index 0000000..28908f6
Binary files /dev/null and b/app/src/main/res/drawable/collection.png differ
diff --git a/app/src/main/res/drawable/delete.png b/app/src/main/res/drawable/delete.png
new file mode 100644
index 0000000..f73e9ed
Binary files /dev/null and b/app/src/main/res/drawable/delete.png differ
diff --git a/app/src/main/res/drawable/download.png b/app/src/main/res/drawable/download.png
new file mode 100644
index 0000000..bfe5dac
Binary files /dev/null and b/app/src/main/res/drawable/download.png differ
diff --git a/app/src/main/res/drawable/email.png b/app/src/main/res/drawable/email.png
new file mode 100644
index 0000000..8140acb
Binary files /dev/null and b/app/src/main/res/drawable/email.png differ
diff --git a/app/src/main/res/drawable/entry_examination.png b/app/src/main/res/drawable/entry_examination.png
new file mode 100644
index 0000000..22c4bff
Binary files /dev/null and b/app/src/main/res/drawable/entry_examination.png differ
diff --git a/app/src/main/res/drawable/evection.png b/app/src/main/res/drawable/evection.png
new file mode 100644
index 0000000..4751a43
Binary files /dev/null and b/app/src/main/res/drawable/evection.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..2408e30
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..1f6bb29
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/index.png b/app/src/main/res/drawable/index.png
new file mode 100644
index 0000000..8dded7b
Binary files /dev/null and b/app/src/main/res/drawable/index.png differ
diff --git a/app/src/main/res/drawable/initiate.png b/app/src/main/res/drawable/initiate.png
new file mode 100644
index 0000000..9a49a43
Binary files /dev/null and b/app/src/main/res/drawable/initiate.png differ
diff --git a/app/src/main/res/drawable/item_add_picture_bg.xml b/app/src/main/res/drawable/item_add_picture_bg.xml
new file mode 100644
index 0000000..c780f6b
--- /dev/null
+++ b/app/src/main/res/drawable/item_add_picture_bg.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/launch.png b/app/src/main/res/drawable/launch.png
new file mode 100644
index 0000000..94db754
Binary files /dev/null and b/app/src/main/res/drawable/launch.png differ
diff --git a/app/src/main/res/drawable/leave_office.png b/app/src/main/res/drawable/leave_office.png
new file mode 100644
index 0000000..14ea2d9
Binary files /dev/null and b/app/src/main/res/drawable/leave_office.png differ
diff --git a/app/src/main/res/drawable/login_edit_text_bg.xml b/app/src/main/res/drawable/login_edit_text_bg.xml
new file mode 100644
index 0000000..d8abd60
--- /dev/null
+++ b/app/src/main/res/drawable/login_edit_text_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/login_edit_text_bg_selected.xml b/app/src/main/res/drawable/login_edit_text_bg_selected.xml
new file mode 100644
index 0000000..3efb400
--- /dev/null
+++ b/app/src/main/res/drawable/login_edit_text_bg_selected.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_edit_text_bg_unselected.xml b/app/src/main/res/drawable/login_edit_text_bg_unselected.xml
new file mode 100644
index 0000000..fca4709
--- /dev/null
+++ b/app/src/main/res/drawable/login_edit_text_bg_unselected.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png
new file mode 100644
index 0000000..218e0a3
Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ
diff --git a/app/src/main/res/drawable/mail_list.png b/app/src/main/res/drawable/mail_list.png
new file mode 100644
index 0000000..077a98f
Binary files /dev/null and b/app/src/main/res/drawable/mail_list.png differ
diff --git a/app/src/main/res/drawable/mail_send.png b/app/src/main/res/drawable/mail_send.png
new file mode 100644
index 0000000..d975e08
Binary files /dev/null and b/app/src/main/res/drawable/mail_send.png differ
diff --git a/app/src/main/res/drawable/menu.png b/app/src/main/res/drawable/menu.png
new file mode 100644
index 0000000..7a172d1
Binary files /dev/null and b/app/src/main/res/drawable/menu.png differ
diff --git a/app/src/main/res/drawable/message.png b/app/src/main/res/drawable/message.png
new file mode 100644
index 0000000..d62c112
Binary files /dev/null and b/app/src/main/res/drawable/message.png differ
diff --git a/app/src/main/res/drawable/mine.png b/app/src/main/res/drawable/mine.png
new file mode 100644
index 0000000..96fdbc6
Binary files /dev/null and b/app/src/main/res/drawable/mine.png differ
diff --git a/app/src/main/res/drawable/notification.png b/app/src/main/res/drawable/notification.png
new file mode 100644
index 0000000..81a2951
Binary files /dev/null and b/app/src/main/res/drawable/notification.png differ
diff --git a/app/src/main/res/drawable/password.png b/app/src/main/res/drawable/password.png
new file mode 100644
index 0000000..516029f
Binary files /dev/null and b/app/src/main/res/drawable/password.png differ
diff --git a/app/src/main/res/drawable/phone.png b/app/src/main/res/drawable/phone.png
new file mode 100644
index 0000000..b40b166
Binary files /dev/null and b/app/src/main/res/drawable/phone.png differ
diff --git a/app/src/main/res/drawable/picture_add.png b/app/src/main/res/drawable/picture_add.png
new file mode 100644
index 0000000..ff1f96e
Binary files /dev/null and b/app/src/main/res/drawable/picture_add.png differ
diff --git a/app/src/main/res/drawable/rect_stroke_transpaent.xml b/app/src/main/res/drawable/rect_stroke_transpaent.xml
new file mode 100644
index 0000000..fcf4334
--- /dev/null
+++ b/app/src/main/res/drawable/rect_stroke_transpaent.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/reimbursement.png b/app/src/main/res/drawable/reimbursement.png
new file mode 100644
index 0000000..2721176
Binary files /dev/null and b/app/src/main/res/drawable/reimbursement.png differ
diff --git a/app/src/main/res/drawable/ripple_bg_circle_color_primary.xml b/app/src/main/res/drawable/ripple_bg_circle_color_primary.xml
new file mode 100644
index 0000000..05b8c9c
--- /dev/null
+++ b/app/src/main/res/drawable/ripple_bg_circle_color_primary.xml
@@ -0,0 +1,10 @@
+
+
+ -
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ripple_bg_white.xml b/app/src/main/res/drawable/ripple_bg_white.xml
new file mode 100644
index 0000000..172d5ac
--- /dev/null
+++ b/app/src/main/res/drawable/ripple_bg_white.xml
@@ -0,0 +1,10 @@
+
+
+ -
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/scan.png b/app/src/main/res/drawable/scan.png
new file mode 100644
index 0000000..c6509c6
Binary files /dev/null and b/app/src/main/res/drawable/scan.png differ
diff --git a/app/src/main/res/drawable/security.png b/app/src/main/res/drawable/security.png
new file mode 100644
index 0000000..81a8f6f
Binary files /dev/null and b/app/src/main/res/drawable/security.png differ
diff --git a/app/src/main/res/drawable/send.png b/app/src/main/res/drawable/send.png
new file mode 100644
index 0000000..43cefcf
Binary files /dev/null and b/app/src/main/res/drawable/send.png differ
diff --git a/app/src/main/res/drawable/setting.png b/app/src/main/res/drawable/setting.png
new file mode 100644
index 0000000..6580446
Binary files /dev/null and b/app/src/main/res/drawable/setting.png differ
diff --git a/app/src/main/res/drawable/sex_female.png b/app/src/main/res/drawable/sex_female.png
new file mode 100644
index 0000000..b3edc63
Binary files /dev/null and b/app/src/main/res/drawable/sex_female.png differ
diff --git a/app/src/main/res/drawable/sex_male.png b/app/src/main/res/drawable/sex_male.png
new file mode 100644
index 0000000..8181703
Binary files /dev/null and b/app/src/main/res/drawable/sex_male.png differ
diff --git a/app/src/main/res/drawable/transparent_edit_text_bg.xml b/app/src/main/res/drawable/transparent_edit_text_bg.xml
new file mode 100644
index 0000000..3e5bab7
--- /dev/null
+++ b/app/src/main/res/drawable/transparent_edit_text_bg.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/work_summary.png b/app/src/main/res/drawable/work_summary.png
new file mode 100644
index 0000000..18dc55f
Binary files /dev/null and b/app/src/main/res/drawable/work_summary.png differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..a4d8a8f
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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
new file mode 100644
index 0000000..f803af0
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml
new file mode 100644
index 0000000..8ee5ff6
--- /dev/null
+++ b/app/src/main/res/layout/activity_register.xml
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
new file mode 100644
index 0000000..b21d71b
--- /dev/null
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_welcome.xml b/app/src/main/res/layout/activity_welcome.xml
new file mode 100644
index 0000000..40b319a
--- /dev/null
+++ b/app/src/main/res/layout/activity_welcome.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bar_item.xml b/app/src/main/res/layout/bar_item.xml
new file mode 100644
index 0000000..8f7e3ba
--- /dev/null
+++ b/app/src/main/res/layout/bar_item.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..a571e60
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..61da551
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c41dd28
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..db5080a
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..6dba46d
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..da31a87
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..15ac681
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..b216f2d
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..f25a419
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..e96783c
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..124b84d
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,18 @@
+
+
+ #3B543E
+ #36543E
+ #D81B60
+
+
+ #ccc
+
+ #999
+ #ccc
+ #efefef
+ #333
+
+ #E42011
+ #20B354
+ #00f
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..7da9996
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,7 @@
+
+
+ 28dp
+ 48dp
+ 28dp
+ 50dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..f5cc274
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,58 @@
+
+ 个人药物管理
+ 主页
+ 我的
+ 消息
+ 返回
+ 确认
+ 收藏
+ 通知
+ 我的文件
+ 设置
+ 退出
+ 登录
+ 用户名
+ 密码
+ 现在注册
+ 忘记密码
+ 注册
+ 手机号
+ 发送验证码
+ 确认密码
+ 验证码
+ 通讯录
+ 审批
+ 点此登录
+ 添加消息
+ 发送
+ 通知详情
+ 报销
+ 发生日期
+ 请选择
+ 提交
+ 审核人
+ 审批记录
+ 我发起的
+ 我审批的
+ 审核
+ 发送通知
+ 邮件列表
+ 收件箱
+ 发件箱
+ 发送邮件
+ 请将内容填写完整
+ 邮件详情
+ 打开
+ 下载
+ 接入IP地址
+ 接入端口号
+ 例如: 192.168.1.25
+ 例如:9748
+ 服务前缀
+ 例如:/min/edu/pkusz/OA
+ 区块链IP地址
+ 例如:192.168.1.24
+ 区块链端口
+ 例如:9749
+ 保存配置
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..96711d8
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/cn/tsr/personal_drug_management/ExampleUnitTest.kt b/app/src/test/java/cn/tsr/personal_drug_management/ExampleUnitTest.kt
new file mode 100644
index 0000000..fdb982c
--- /dev/null
+++ b/app/src/test/java/cn/tsr/personal_drug_management/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package cn.tsr.personal_drug_management
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..5eb3650
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,33 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ ext.kotlin_version = "1.3.72"
+ ext.quick_android_version = 'v0.1.9'
+ ext.anko_version = '0.10.8'
+ ext.smart_refresh_layout_version = '1.1.0'
+ ext.androidx_base_version = '1.1.0'
+ ext.room_version = "2.2.3"
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath "com.android.tools.build:gradle:4.0.0"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ maven { url 'https://maven.aliyun.com/repository/public/' }
+ maven { url 'https://jitpack.io' }
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..4d15d01
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,21 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..f5dabe6
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Jun 11 16:49:57 CST 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..d82d558
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+include ':app'
+rootProject.name = "personal-drug-management"
\ No newline at end of file