diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..6d90625 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,89 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "cn.tsr.personal_drug_management" + minSdkVersion 21 + targetSdkVersion 29 + versionCode 21 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.3.0' + implementation "androidx.appcompat:appcompat:$androidx_base_version" + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation "androidx.recyclerview:recyclerview:$androidx_base_version" + + implementation "org.jetbrains.anko:anko-commons:$anko_version" + + // 所有的模块都依赖于 quick_android_base (必选) + implementation "com.github.SunnyQjm.quickandroid:quick_android_base:$quick_android_version" + implementation "com.github.SunnyQjm.quickandroid:quick_android_custom_view:$quick_android_version" + implementation "com.github.SunnyQjm.quickandroid:quick_android_easy_bar:$quick_android_version" + // 引入quick_android_mvp模块,来使用网络请求和MVP架构(可选) + implementation "com.github.SunnyQjm.quickandroid:quick_android_mvp:$quick_android_version" + // 引入quick_android_rx_permission模块,来接入链式调用动态请求权限的功能(可选) + implementation "com.github.SunnyQjm.quickandroid:quick_android_rx_permission:$quick_android_version" + // 引入quick_android_qrcode模块,来接入扫码功能(可选) + implementation "com.github.SunnyQjm.quickandroid:quick_android_qrcode:$quick_android_version" + // 引入quick_android_image_picker模块,来接入图片选择,图片裁剪等功能(可选) + implementation "com.github.SunnyQjm.quickandroid:quick_android_image_picker:$quick_android_version" + // 引入文件选择功能(调用系统的文件管理器) + implementation "com.github.SunnyQjm.quickandroid:quick_android_file_picker:$quick_android_version" + + // loading button + implementation 'br.com.simplepass:loading-button-android:2.2.0' + + // 加载动画 + implementation 'com.github.ybq:Android-SpinKit:1.4.0' + + // android-banner + implementation 'com.github.zhpanvip:BannerViewPager:2.6.1' + + // SmartRefreshLayout + implementation "com.scwang.smartrefresh:SmartRefreshLayout:$smart_refresh_layout_version" + implementation "com.scwang.smartrefresh:SmartRefreshHeader:$smart_refresh_layout_version" + + // brvah + implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.49-androidx' + + // EventBus + implementation 'org.greenrobot:eventbus:3.1.1' + + // MINSocket相关 + // https://mvnrepository.com/artifact/com.lmax/disruptor + implementation group: 'com.lmax', name: 'disruptor', version: '3.4.2' + + // 协程支持 + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.3.5' + + testImplementation 'junit:junit:4.13' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/cn/tsr/personal_drug_management/ExampleInstrumentedTest.kt b/app/src/androidTest/java/cn/tsr/personal_drug_management/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..000ac6f --- /dev/null +++ b/app/src/androidTest/java/cn/tsr/personal_drug_management/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package cn.tsr.personal_drug_management + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("cn.tsr.personal_drug_management", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3c33652 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/cn/tsr/personal_drug_management/App.kt b/app/src/main/java/cn/tsr/personal_drug_management/App.kt new file mode 100644 index 0000000..4413692 --- /dev/null +++ b/app/src/main/java/cn/tsr/personal_drug_management/App.kt @@ -0,0 +1,12 @@ +package cn.tsr.personal_drug_management + +import android.app.Application +import cn.tsr.personal_drug_management.model.MINVpnAPI + +class App : Application() { + override fun onCreate() { + super.onCreate() + + MINVpnAPI.init(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/cn/tsr/personal_drug_management/activity/base/MINVpnBaseActivity.kt b/app/src/main/java/cn/tsr/personal_drug_management/activity/base/MINVpnBaseActivity.kt new file mode 100644 index 0000000..9f4ab63 --- /dev/null +++ b/app/src/main/java/cn/tsr/personal_drug_management/activity/base/MINVpnBaseActivity.kt @@ -0,0 +1,43 @@ +package cn.tsr.personal_drug_management.activity.base + +import cn.tsr.personal_drug_management.activity.base.mvp.MINVpnBaseView +import cn.qjm253.quick_android_base.extensions.toast +import cn.qjm253.quick_android_mvp.base.activity.BaseQuickAndroidMVPActivity +import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +abstract class MINVpnBaseActivity >: 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