From 8d3945977ca1279947f5137318329bc192aa84bd Mon Sep 17 00:00:00 2001 From: lijie <675862284@qq.com> Date: Thu, 27 Jul 2023 17:05:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/gradle.xml | 20 ++ .idea/kotlinc.xml | 6 + .idea/misc.xml | 37 +++ .idea/vcs.xml | 6 + app/.gitignore | 7 + app/build.gradle | 75 ++++++ app/proguard-rules.pro | 21 ++ app/src/main/AndroidManifest.xml | 83 +++++++ .../cmx/hydrology/activity/BaseActivity.java | 75 ++++++ .../cmx/hydrology/activity/LoginActivity.java | 92 +++++++ .../cmx/hydrology/activity/MainActivity.java | 114 +++++++++ .../cmx/hydrology/activity/MyApplication.java | 40 +++ .../cmx/hydrology/activity/WebActivity.java | 179 ++++++++++++++ .../java/com/cmx/hydrology/constant/Events.kt | 42 ++++ .../com/cmx/hydrology/model/LoginBean.java | 22 ++ .../com/cmx/hydrology/model/LoginRes.java | 51 ++++ .../cmx/hydrology/retrofit/ApiRequtest.java | 47 ++++ .../cmx/hydrology/retrofit/ApiResponse.java | 19 ++ .../com/cmx/hydrology/retrofit/ApiResult.java | 104 ++++++++ .../cmx/hydrology/retrofit/ApiService.java | 22 ++ .../retrofit/RetrofitAPIManager.java | 71 ++++++ .../hydrology/retrofit/onRequestResponse.java | 9 + .../retrofit/onServerRequestCallBack.java | 9 + .../com/cmx/hydrology/ui/HomeFragment.java | 226 +++++++++++++++++ .../com/cmx/hydrology/ui/MapFragment.java | 93 +++++++ .../com/cmx/hydrology/ui/MsgFragment.java | 232 ++++++++++++++++++ .../java/com/cmx/hydrology/ui/MyFragment.java | 93 +++++++ .../com/cmx/hydrology/utils/AndroidtoJs.java | 89 +++++++ .../main/java/com/cmx/hydrology/utils/L.java | 92 +++++++ .../java/com/cmx/hydrology/utils/MyUtils.java | 220 +++++++++++++++++ .../java/com/cmx/hydrology/utils/SpUtils.java | 24 ++ .../cmx/hydrology/utils/StaticFinalData.java | 8 + .../cmx/hydrology/view/BaseLoadingDialog.java | 37 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ app/src/main/res/drawable/bg_checkbox.xml | 4 + app/src/main/res/drawable/curse_sharp.xml | 9 + .../main/res/drawable/dialog_custom_bg.xml | 5 + .../res/drawable/edittext_active_sharp.xml | 16 ++ .../res/drawable/edittext_normal_sharp.xml | 16 ++ .../res/drawable/ic_dashboard_black_24dp.xml | 9 + .../main/res/drawable/ic_home_black_24dp.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++ app/src/main/res/drawable/ic_login_bg.xml | 10 + .../drawable/ic_notifications_black_24dp.xml | 9 + app/src/main/res/drawable/round_btn_sharp.xml | 16 ++ .../res/drawable/round_btn_sharp_empty.xml | 14 ++ .../main/res/drawable/selector_edit_text.xml | 7 + .../res/drawable/selector_round_btn_sharp.xml | 7 + app/src/main/res/layout/actionbar_custom.xml | 17 ++ .../main/res/layout/activity_agreement.xml | 47 ++++ app/src/main/res/layout/activity_login.xml | 96 ++++++++ app/src/main/res/layout/activity_main.xml | 34 +++ app/src/main/res/layout/activity_register.xml | 22 ++ .../res/layout/activity_register_success.xml | 9 + app/src/main/res/layout/activity_web.xml | 12 + app/src/main/res/layout/dialog_confirm.xml | 31 +++ app/src/main/res/layout/fragment_home.xml | 20 ++ app/src/main/res/layout/fragment_map.xml | 21 ++ app/src/main/res/layout/fragment_msg.xml | 21 ++ app/src/main/res/layout/fragment_my.xml | 21 ++ app/src/main/res/menu/bottom_nav_menu.xml | 23 ++ app/src/main/res/mipmap-hdpi/icon_logo.png | Bin 0 -> 6923 bytes .../main/res/mipmap-hdpi/icon_title_back.png | Bin 0 -> 3169 bytes .../main/res/navigation/mobile_navigation.xml | 32 +++ app/src/main/res/navigation/nav_graph.xml | 28 +++ app/src/main/res/values-land/dimens.xml | 4 + app/src/main/res/values-night/themes.xml | 16 ++ app/src/main/res/values-w1240dp/dimens.xml | 4 + app/src/main/res/values-w600dp/dimens.xml | 4 + app/src/main/res/values/colors.xml | 14 ++ app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/strings.xml | 55 +++++ app/src/main/res/values/styles.xml | 17 ++ app/src/main/res/values/themes.xml | 21 ++ app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 ++ app/src/main/res/xml/file_paths.xml | 10 + build.gradle | 15 ++ gradle.properties | 22 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++ gradlew.bat | 89 +++++++ settings.gradle | 21 ++ 87 files changed, 3575 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/cmx/hydrology/activity/BaseActivity.java create mode 100644 app/src/main/java/com/cmx/hydrology/activity/LoginActivity.java create mode 100644 app/src/main/java/com/cmx/hydrology/activity/MainActivity.java create mode 100644 app/src/main/java/com/cmx/hydrology/activity/MyApplication.java create mode 100644 app/src/main/java/com/cmx/hydrology/activity/WebActivity.java create mode 100644 app/src/main/java/com/cmx/hydrology/constant/Events.kt create mode 100644 app/src/main/java/com/cmx/hydrology/model/LoginBean.java create mode 100644 app/src/main/java/com/cmx/hydrology/model/LoginRes.java create mode 100644 app/src/main/java/com/cmx/hydrology/retrofit/ApiRequtest.java create mode 100644 app/src/main/java/com/cmx/hydrology/retrofit/ApiResponse.java create mode 100644 app/src/main/java/com/cmx/hydrology/retrofit/ApiResult.java create mode 100644 app/src/main/java/com/cmx/hydrology/retrofit/ApiService.java create mode 100644 app/src/main/java/com/cmx/hydrology/retrofit/RetrofitAPIManager.java create mode 100644 app/src/main/java/com/cmx/hydrology/retrofit/onRequestResponse.java create mode 100644 app/src/main/java/com/cmx/hydrology/retrofit/onServerRequestCallBack.java create mode 100644 app/src/main/java/com/cmx/hydrology/ui/HomeFragment.java create mode 100644 app/src/main/java/com/cmx/hydrology/ui/MapFragment.java create mode 100644 app/src/main/java/com/cmx/hydrology/ui/MsgFragment.java create mode 100644 app/src/main/java/com/cmx/hydrology/ui/MyFragment.java create mode 100644 app/src/main/java/com/cmx/hydrology/utils/AndroidtoJs.java create mode 100644 app/src/main/java/com/cmx/hydrology/utils/L.java create mode 100644 app/src/main/java/com/cmx/hydrology/utils/MyUtils.java create mode 100644 app/src/main/java/com/cmx/hydrology/utils/SpUtils.java create mode 100644 app/src/main/java/com/cmx/hydrology/utils/StaticFinalData.java create mode 100644 app/src/main/java/com/cmx/hydrology/view/BaseLoadingDialog.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/bg_checkbox.xml create mode 100644 app/src/main/res/drawable/curse_sharp.xml create mode 100644 app/src/main/res/drawable/dialog_custom_bg.xml create mode 100644 app/src/main/res/drawable/edittext_active_sharp.xml create mode 100644 app/src/main/res/drawable/edittext_normal_sharp.xml create mode 100644 app/src/main/res/drawable/ic_dashboard_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_home_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_login_bg.xml create mode 100644 app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 app/src/main/res/drawable/round_btn_sharp.xml create mode 100644 app/src/main/res/drawable/round_btn_sharp_empty.xml create mode 100644 app/src/main/res/drawable/selector_edit_text.xml create mode 100644 app/src/main/res/drawable/selector_round_btn_sharp.xml create mode 100644 app/src/main/res/layout/actionbar_custom.xml create mode 100644 app/src/main/res/layout/activity_agreement.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_register.xml create mode 100644 app/src/main/res/layout/activity_register_success.xml create mode 100644 app/src/main/res/layout/activity_web.xml create mode 100644 app/src/main/res/layout/dialog_confirm.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_map.xml create mode 100644 app/src/main/res/layout/fragment_msg.xml create mode 100644 app/src/main/res/layout/fragment_my.xml create mode 100644 app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 app/src/main/res/mipmap-hdpi/icon_logo.png create mode 100644 app/src/main/res/mipmap-hdpi/icon_title_back.png create mode 100644 app/src/main/res/navigation/mobile_navigation.xml create mode 100644 app/src/main/res/navigation/nav_graph.xml create mode 100644 app/src/main/res/values-land/dimens.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-w1240dp/dimens.xml create mode 100644 app/src/main/res/values-w600dp/dimens.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/file_paths.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ce86a83 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..7e340a7 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ff2bd08 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,37 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..457e5a0 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,7 @@ +/build +.idea +gradlew +gradlew.bat +.DS_Store +*.iml +.gradle \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..4bc71cd --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,75 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-android-extensions' + id 'kotlin-kapt' +} + + +static def releaseTime() { + return "" + new Date().format("yyyyMMddHHmm", TimeZone.getTimeZone("Asia/Shanghai")) +} + +android { + compileSdk 32 + defaultConfig { + applicationId "com.cmx.hydrology" + minSdk 21 + targetSdk 29 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + android.applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "hydrology" + versionName + "_" + versionCode + "_" + releaseTime() + ".apk" + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildFeatures { + viewBinding true + } +} + + +dependencies { + implementation(fileTree("libs")) + implementation 'androidx.work:work-runtime:2.7.1' + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' + implementation 'androidx.navigation:navigation-fragment:2.3.5' + implementation 'androidx.navigation:navigation-ui:2.3.5' + implementation 'androidx.annotation:annotation:1.2.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation 'com.google.code.gson:gson:2.6.2' + implementation 'com.squareup.retrofit2:retrofit:2.4.0' + implementation 'com.squareup.retrofit2:converter-gson:2.4.0' + implementation 'com.github.GrenderG:Toasty:1.5.2' + implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1' + implementation 'com.github.lsxiao.Apollo:core:1.0.2' + implementation 'com.github.lsxiao.Apollo:ipc:1.0.2' + kapt "com.github.lsxiao.Apollo:processor:1.0.2" + //Apollo的编译时注解处理器 + annotationProcessor "com.github.lsxiao.Apollo:processor:1.0.2" + implementation "io.reactivex.rxjava2:rxjava:2.2.4" + implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' + implementation 'com.github.nanchen2251:CompressHelper:1.0.5' + + implementation 'com.scwang.wave:MultiWaveHeader:1.0.0-andx' +} \ 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/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d78ea24 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/activity/BaseActivity.java b/app/src/main/java/com/cmx/hydrology/activity/BaseActivity.java new file mode 100644 index 0000000..b5dc572 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/activity/BaseActivity.java @@ -0,0 +1,75 @@ +package com.cmx.hydrology.activity; + +import android.os.Bundle; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.appcompat.app.AppCompatActivity; + +import com.cmx.hydrology.view.BaseLoadingDialog; +import com.lsxiao.apollo.core.Apollo; +import com.lsxiao.apollo.core.contract.ApolloBinder; + +public class BaseActivity extends AppCompatActivity { + + private static final String TAG = "BaseActivity"; + private BaseLoadingDialog mBaseLoadingDialog; + private ApolloBinder mApolloBinder; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mBaseLoadingDialog = new BaseLoadingDialog(this); + mApolloBinder = Apollo.bind(this); + } + + + public void showDialog() { + if (!mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.show(); + } + } + + + public void disDialog() { + if (mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.dismiss(); + } + } + + public void setWeb(WebView mWebView) { + mWebView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + //使用WebView加载显示url + view.loadUrl(url); + //返回true + return true; + } + + @Override + public void onPageFinished(WebView view, String url) { + disDialog(); + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + disDialog(); + } + } + + ); + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mApolloBinder != null) { + mApolloBinder.unbind(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/activity/LoginActivity.java b/app/src/main/java/com/cmx/hydrology/activity/LoginActivity.java new file mode 100644 index 0000000..491e689 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/activity/LoginActivity.java @@ -0,0 +1,92 @@ +package com.cmx.hydrology.activity; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.RequiresApi; + +import com.cmx.hydrology.databinding.ActivityLoginBinding; +import com.cmx.hydrology.model.LoginBean; +import com.cmx.hydrology.model.LoginRes; +import com.cmx.hydrology.retrofit.RetrofitAPIManager; +import com.cmx.hydrology.utils.MyUtils; +import com.cmx.hydrology.utils.SpUtils; + +import es.dmoral.toasty.Toasty; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class LoginActivity extends BaseActivity { + + private ActivityLoginBinding binding; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityLoginBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + MyUtils.setFullscreen(this, true, true); + binding.btnLogin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + // if (TextUtils.isEmpty(binding.edtUsername.getText().toString().trim())) { + // Toasty.info(LoginActivity.this, "请输入用户名").show(); + // return; + // } + // if (TextUtils.isEmpty(binding.edtPassword.getText().toString().trim())) { + // Toasty.info(LoginActivity.this, "请输入密码").show(); + // return; + // } + // toLogin(); + } + }); + } + + + /** + * 登录 + */ + private void toLogin() { + showDialog(); + LoginBean LoginBean = new LoginBean(); + LoginBean.setUsername(binding.edtUsername.getText().toString().trim()); + LoginBean.setPassword(binding.edtPassword.getText().toString().trim()); + Call call = RetrofitAPIManager.provideClientApi().login(LoginBean); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + disDialog(); + if (response.isSuccessful() && response.body().getCode() == 0) { + SpUtils.putString(LoginActivity.this, "token", response.body().getAccess_token()); + SpUtils.putString(LoginActivity.this, "admin", response.body().getIs_admin()); + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } else { + Toasty.error(LoginActivity.this, response.body().getMessage()).show(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + disDialog(); + Toasty.info(LoginActivity.this, "登录失败").show(); + } + }); + } + + @Override + public void onDestroy() { + super.onDestroy(); + binding = null; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/activity/MainActivity.java b/app/src/main/java/com/cmx/hydrology/activity/MainActivity.java new file mode 100644 index 0000000..b0e1190 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/activity/MainActivity.java @@ -0,0 +1,114 @@ +package com.cmx.hydrology.activity; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import androidx.annotation.RequiresApi; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.NavigationUI; + +import com.cmx.hydrology.R; +import com.cmx.hydrology.constant.Events; +import com.cmx.hydrology.databinding.ActivityMainBinding; +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.lsxiao.apollo.core.Apollo; +import com.lsxiao.apollo.core.annotations.Receive; + +public class MainActivity extends BaseActivity { + + private ActivityMainBinding binding; + private BottomNavigationView navView; + private NavController navController; + + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + navView = findViewById(R.id.nav_view); + navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); + NavigationUI.setupWithNavController(binding.navView, navController); + } + + + /** + * 显示tabbar + */ + @Receive(Events.JS_OPEN_TABBAR_SHOW) + public void showTab() { + binding.navView.setVisibility(View.VISIBLE); + } + + /** + * 隐藏tabbar + */ + @Receive(Events.JS_OPEN_TABBAR_HIDE) + public void hideTab() { + binding.navView.setVisibility(View.GONE); + } + + + /** + * 打开新的web + */ + @Receive(Events.JS_OPEN_OPEN_WEB) + public void openWeb(String url) { + Intent intent = new Intent(this, WebActivity.class); + intent.putExtra("url", url); + startActivity(intent); + } + + + /** + * 选择tab + */ + @Receive(Events.JS_OPEN_TAB) + public void ckTab(String mode) { + Apollo.emit(Events.JS_OPEN_CLOSE_WEB); + switch (mode) { + case "1": + Menu menu = navView.getMenu(); + MenuItem menuItem = menu.getItem(0); // 将index替换为您想要点击的项目的索引 + menuItem.setChecked(true); + navController.navigate(R.id.navigation_home); + break; + case "2": + Menu menu2 = navView.getMenu(); + MenuItem menuItem2 = menu2.getItem(1); // 将index替换为您想要点击的项目的索引 + menuItem2.setChecked(true); + navController.navigate(R.id.navigation_msg); + break; + case "3": + Menu menu3 = navView.getMenu(); + MenuItem menuItem3 = menu3.getItem(2); // 将index替换为您想要点击的项目的索引 + menuItem3.setChecked(true); + navController.navigate(R.id.navigation_map); + break; + case "4": + Menu menu4 = navView.getMenu(); + MenuItem menuItem4 = menu4.getItem(3); // 将index替换为您想要点击的项目的索引 + menuItem4.setChecked(true); + navController.navigate(R.id.navigation_my); + break; + } + } + + + /** + * 退出登录 + */ + @Receive(Events.JS_OPEN_LOGOUT) + public void exit() { + Apollo.emit(Events.JS_OPEN_CLOSE_WEB); + finish(); + Intent intent = new Intent(this, LoginActivity.class); + startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/activity/MyApplication.java b/app/src/main/java/com/cmx/hydrology/activity/MyApplication.java new file mode 100644 index 0000000..47a522f --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/activity/MyApplication.java @@ -0,0 +1,40 @@ +package com.cmx.hydrology.activity; + +import android.app.Application; +import android.content.Context; + +import com.lsxiao.apollo.core.Apollo; + +import io.reactivex.android.schedulers.AndroidSchedulers; + +public class MyApplication extends Application { + private static MyApplication mInstance; + + private static String mToken; + + @Override + public void onCreate() { + super.onCreate(); + mInstance = this; + Apollo.init(AndroidSchedulers.mainThread(), this); + } + + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + } + + + public static MyApplication getmInstance() { + return mInstance; + } + + public static String getmToken() { + return mToken; + } + + public static void setmToken(String mToken) { + MyApplication.mToken = mToken; + } +} diff --git a/app/src/main/java/com/cmx/hydrology/activity/WebActivity.java b/app/src/main/java/com/cmx/hydrology/activity/WebActivity.java new file mode 100644 index 0000000..c16255a --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/activity/WebActivity.java @@ -0,0 +1,179 @@ +package com.cmx.hydrology.activity; + +import android.app.Activity; +import android.content.ClipData; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.util.Log; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; + +import androidx.annotation.Nullable; + +import com.cmx.hydrology.databinding.ActivityWebBinding; +import com.cmx.hydrology.utils.AndroidtoJs; +import com.cmx.hydrology.utils.L; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + + +public class WebActivity extends BaseActivity { + + private WebView mWebView; + private ActivityWebBinding binding; + private String url; + public static final int REQUEST_CODE_LIVENESS = 209; + public static final int TRUST_LEVEL = 50; + private ValueCallback mUploadMessage; + private String mCameraPhotoPath = null; + private long size = 0; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityWebBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + url = getIntent().getStringExtra("url"); + // MyUtils.setFullscreen(this, true, true);//影响键盘 模式 页面遮挡 + // MyUtils.setAndroidNativeLightStatusBar(this, true);//影响键盘 模式 页面遮挡 + mWebView = binding.wvRegister; + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + webSettings.setDomStorageEnabled(true); + mWebView.addJavascriptInterface(new AndroidtoJs(), "AndroidtoJs"); + mWebView.loadUrl(url); + showDialog(); + setWeb(mWebView); + mWebView.setWebChromeClient(new PQChromeClient()); + } + + + // @Receive(Events.JS_OPEN_CLOSE_WEB) + // public void fin() { + // finish(); + // } + + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 101 && mUploadMessage != null) { + try { + String file_path = mCameraPhotoPath.replace("file:", ""); + File file = new File(file_path); + size = file.length(); + if (!(data != null || size > 0)) { + mUploadMessage.onReceiveValue(null); + mUploadMessage = null; + return; + } + if (data != null || mCameraPhotoPath != null) { + Integer count = 1; + ClipData images = null; + try { + images = data.getClipData(); + } catch (Exception e) { + Log.e("Error11!", e.getLocalizedMessage()); + } + if (images == null && data != null && data.getDataString() != null) { + count = data.getDataString().length(); + } else if (images != null) { + count = images.getItemCount(); + } + Uri[] results = new Uri[count]; + // Check that the response is a good one + if (resultCode == Activity.RESULT_OK) { + if (size != 0) { + // If there is not data, then we may have taken a photo + if (mCameraPhotoPath != null) { + results = new Uri[]{Uri.parse(mCameraPhotoPath)}; + } + } else if (data.getClipData() == null) { + results = new Uri[]{Uri.parse(data.getDataString())}; + } else { + for (int i = 0; i < images.getItemCount(); i++) { + results[i] = images.getItemAt(i).getUri(); + } + } + } + mUploadMessage.onReceiveValue(results); + mUploadMessage = null; + } + } catch (Exception e) { + Log.e("Error22!", "Error while opening image file" + e.getLocalizedMessage()); + } + } + } + + public class PQChromeClient extends WebChromeClient { + // For Android 5.0+ + public boolean onShowFileChooser(WebView view, ValueCallback filePath, WebChromeClient.FileChooserParams fileChooserParams) { + L.e("点击》》", "11"); + // Double check that we don't have any existing callbacks + if (mUploadMessage != null) { + L.e("点击》》", "22"); + mUploadMessage.onReceiveValue(null); + } + mUploadMessage = filePath; + Log.e("FileCooserParams => ", filePath.toString()); + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + if (takePictureIntent.resolveActivity(getPackageManager()) != null) { + // Create the File where the photo should go + File photoFile = null; + try { + photoFile = createImageFile(); + takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); + } catch (IOException ex) { + // Error occurred while creating the File + Log.e("test", "Unable to create Image File", ex); + } + // Continue only if the File was successfully created + if (photoFile != null) { + mCameraPhotoPath = "file:" + photoFile.getAbsolutePath(); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); + } else { + takePictureIntent = null; + } + } + + Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); + contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); + contentSelectionIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + contentSelectionIntent.setType("image/*"); + Intent[] intentArray; + if (takePictureIntent != null) { + intentArray = new Intent[]{takePictureIntent}; + } else { + intentArray = new Intent[2]; + } + Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); + chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); + chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser"); + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); + startActivityForResult(Intent.createChooser(chooserIntent, "Select images"), 101); + return true; + } + } + + private File createImageFile() throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); + File imageFile = File.createTempFile(imageFileName, /* prefix */ + ".jpg", /* suffix */ + storageDir /* directory */); + return imageFile; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/constant/Events.kt b/app/src/main/java/com/cmx/hydrology/constant/Events.kt new file mode 100644 index 0000000..c14c8f5 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/constant/Events.kt @@ -0,0 +1,42 @@ +package com.cmx.hydrology.constant + + +/** + * @author LIJIE + */ +interface Events { + companion object { + const val WEB_SERVER_URL = "http://8.222.137.126:80" + const val SERVER_URL = "http://192.168.110.174:8000" + + /** + * tabbar显示 + */ + const val JS_OPEN_TABBAR_SHOW = "js_open_tabbar_show" + + /** + * tabbar隐藏 + */ + const val JS_OPEN_TABBAR_HIDE = "js_open_tabbat_hide" + + /** + * 打开一个新web界面 + */ + const val JS_OPEN_OPEN_WEB = "js_open_open_web" + + /** + * 关闭web界面 + */ + const val JS_OPEN_CLOSE_WEB = "js_open_close_web" + + /** + * 退出登录 + */ + const val JS_OPEN_LOGOUT = "js_open_logout" + + /** + * 切换tab + */ + const val JS_OPEN_TAB = "js_open_tab" + } +} diff --git a/app/src/main/java/com/cmx/hydrology/model/LoginBean.java b/app/src/main/java/com/cmx/hydrology/model/LoginBean.java new file mode 100644 index 0000000..e70d15d --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/model/LoginBean.java @@ -0,0 +1,22 @@ +package com.cmx.hydrology.model; + +public class LoginBean { + String username; + String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/app/src/main/java/com/cmx/hydrology/model/LoginRes.java b/app/src/main/java/com/cmx/hydrology/model/LoginRes.java new file mode 100644 index 0000000..b83f261 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/model/LoginRes.java @@ -0,0 +1,51 @@ +package com.cmx.hydrology.model; + + +public class LoginRes { + + + /** + * code : 0 + * message : 登录成功 + * access_token : 1914936f8c87fddd11836ebebb65317bb7f57506 + * is_admin : 1 + */ + + + private int code; + private String message; + private String access_token; + private String is_admin; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getIs_admin() { + return is_admin; + } + + public void setIs_admin(String is_admin) { + this.is_admin = is_admin; + } +} diff --git a/app/src/main/java/com/cmx/hydrology/retrofit/ApiRequtest.java b/app/src/main/java/com/cmx/hydrology/retrofit/ApiRequtest.java new file mode 100644 index 0000000..a88dd2d --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/retrofit/ApiRequtest.java @@ -0,0 +1,47 @@ +package com.cmx.hydrology.retrofit; + +import com.google.gson.reflect.TypeToken; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Callback; + + +public class ApiRequtest { + private static final String TAG = ApiRequtest.class.getSimpleName(); + + private TypeToken mResultType; + + public ApiRequtest (Call call, TypeToken resultType, final ApiResponse.Listener> listener, final ApiResponse.ErrorListener errorListener){ + mResultType = resultType; + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, retrofit2.Response response) { + try { + ResponseBody responseBody = response.body(); + if(responseBody != null){ + String jsonString = response.body().string(); + final ApiResult result = new ApiResult<>(new JSONObject(jsonString), mResultType); + listener.onResponse(result); + } + + }catch (IOException e){ + }catch (JSONException e) { + } + } + + @Override + public void onFailure(Call call, Throwable t) { + errorListener.onErrorResponse(t); + } + }); + } + + + +} diff --git a/app/src/main/java/com/cmx/hydrology/retrofit/ApiResponse.java b/app/src/main/java/com/cmx/hydrology/retrofit/ApiResponse.java new file mode 100644 index 0000000..14f7f53 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/retrofit/ApiResponse.java @@ -0,0 +1,19 @@ +package com.cmx.hydrology.retrofit; + +public class ApiResponse { + + /** + * network request error response + */ + public interface ErrorListener { + void onErrorResponse(Throwable requestError); + } + + /** + * network request success response result + * @param data result + */ + public interface Listener { + void onResponse(T result); + } +} diff --git a/app/src/main/java/com/cmx/hydrology/retrofit/ApiResult.java b/app/src/main/java/com/cmx/hydrology/retrofit/ApiResult.java new file mode 100644 index 0000000..35c1b55 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/retrofit/ApiResult.java @@ -0,0 +1,104 @@ +package com.cmx.hydrology.retrofit; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONObject; + + +/** + * + */ +public class ApiResult { + + private final static String TAG = ApiResult.class.getSimpleName(); + + public static final int OK = 0; + + public Boolean success = true; + private Integer code = OK; + private String msg=""; + private T result; + private String msgJson; + private static Gson gson = new Gson(); + + + public ApiResult() { + super(); + // TODO Auto-generated constructor stub + } + + public ApiResult(JSONObject jsonObject, TypeToken typeToken) { + super(); + try{ + if (jsonObject.has("errcode")){ + code = jsonObject.getInt("errcode"); + if (code != OK) { + if (jsonObject.has("errmsg")) { + msg = jsonObject.getString("errmsg"); + } + + success = false; + + } + }else{ + + } + + if (code == OK){ + try { + result = gson.fromJson(jsonObject.toString(), typeToken.getType()); + }catch (Exception ex){ + + } + + } + }catch (Exception e) { + // TODO: handle exception + } + + } + private T testDefault(String msg){ + Gson gson = new Gson(); + result = gson.fromJson(msg,new TypeToken(){}.getType()); + return result; + } + private T test(String msg, TypeToken typeToken){ + Gson gson = new Gson(); + result = gson.fromJson(msg,typeToken.getType()); + return result; + } + + public Integer getCode() { + return code; + } + public void setCode(Integer code) { + this.code = code; + } + public String getMsg() { + return msg; + } + public void setMsg(String msg) { + this.msg = msg; + } + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } + + public Boolean getSuccess() { + return success; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public String getMsgJson() { + return msgJson; + } +} diff --git a/app/src/main/java/com/cmx/hydrology/retrofit/ApiService.java b/app/src/main/java/com/cmx/hydrology/retrofit/ApiService.java new file mode 100644 index 0000000..46a8f62 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/retrofit/ApiService.java @@ -0,0 +1,22 @@ +package com.cmx.hydrology.retrofit; + +import com.cmx.hydrology.model.LoginBean; +import com.cmx.hydrology.model.LoginRes; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.POST; + +/** + * Created by + */ +public interface ApiService { + /** + * 登录 + * + * @param body + * @return + */ + @POST("/login") + Call login(@Body LoginBean body); +} diff --git a/app/src/main/java/com/cmx/hydrology/retrofit/RetrofitAPIManager.java b/app/src/main/java/com/cmx/hydrology/retrofit/RetrofitAPIManager.java new file mode 100644 index 0000000..c9f3e89 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/retrofit/RetrofitAPIManager.java @@ -0,0 +1,71 @@ +package com.cmx.hydrology.retrofit; + + +import static com.cmx.hydrology.constant.Events.SERVER_URL; + +import android.util.Log; + +import com.cmx.hydrology.activity.MyApplication; +import com.cmx.hydrology.utils.SpUtils; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.concurrent.TimeUnit; + +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Call; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * Created by TTLock on 2018/9/5. + */ + + +public class RetrofitAPIManager { + + + public static ApiService provideClientApi() { + Retrofit retrofit = new Retrofit.Builder().client(genericClient()).baseUrl(SERVER_URL).addConverterFactory(GsonConverterFactory.create()).build(); + return retrofit.create(ApiService.class); + } + + public static OkHttpClient genericClient() { + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { + @Override + public void log(String message) { + // try { + // String text = URLDecoder.decode(message, "utf-8"); + // Log.e("OKHttp-----", text); + // } catch (UnsupportedEncodingException e) { + // e.printStackTrace(); + Log.e("OKHttp-----", message); + // } + } + }); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + OkHttpClient httpClient = new OkHttpClient.Builder().connectTimeout(35, TimeUnit.SECONDS).readTimeout(35, TimeUnit.SECONDS).writeTimeout(35, TimeUnit.SECONDS).addInterceptor(interceptor).addInterceptor(new Interceptor() { + @Override + public Response intercept(Chain chain) throws IOException { + Request original = chain.request(); + Request.Builder requestBuilder = original.newBuilder().header("token", SpUtils.getString(MyApplication.getmInstance(), "token")); + Request request = requestBuilder.build(); + return chain.proceed(request); + } + }).build(); + + return httpClient; + } + + public static ApiRequtest enqueue(Call call, TypeToken resultType, ApiResponse.Listener> listener, ApiResponse.ErrorListener errorListener) { + ApiRequtest request = new ApiRequtest<>(call, resultType, listener, errorListener); + return request; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/retrofit/onRequestResponse.java b/app/src/main/java/com/cmx/hydrology/retrofit/onRequestResponse.java new file mode 100644 index 0000000..686672a --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/retrofit/onRequestResponse.java @@ -0,0 +1,9 @@ +package com.cmx.hydrology.retrofit; + +/** + * Created by Administrator on 2018/1/17 0017. + */ + +public interface onRequestResponse { + void onResult(boolean success); +} diff --git a/app/src/main/java/com/cmx/hydrology/retrofit/onServerRequestCallBack.java b/app/src/main/java/com/cmx/hydrology/retrofit/onServerRequestCallBack.java new file mode 100644 index 0000000..cce0ed1 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/retrofit/onServerRequestCallBack.java @@ -0,0 +1,9 @@ +package com.cmx.hydrology.retrofit; + +/** + * Created by Administrator on 2018/1/17 0017. + */ + +public interface onServerRequestCallBack { + void onResult(int resultCode); +} diff --git a/app/src/main/java/com/cmx/hydrology/ui/HomeFragment.java b/app/src/main/java/com/cmx/hydrology/ui/HomeFragment.java new file mode 100644 index 0000000..e4a1332 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/ui/HomeFragment.java @@ -0,0 +1,226 @@ +package com.cmx.hydrology.ui; + + +import android.app.Activity; +import android.content.ClipData; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.cmx.hydrology.databinding.FragmentHomeBinding; +import com.cmx.hydrology.utils.AndroidtoJs; +import com.cmx.hydrology.utils.MyUtils; +import com.cmx.hydrology.view.BaseLoadingDialog; +import com.lsxiao.apollo.core.Apollo; +import com.lsxiao.apollo.core.contract.ApolloBinder; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class HomeFragment extends Fragment { + + private FragmentHomeBinding binding; + private BaseLoadingDialog mBaseLoadingDialog; + private WebView mWebView; + private ApolloBinder mApolloBinder; + private ValueCallback mUploadMessage; + private String mCameraPhotoPath = null; + private long size = 0; + private static final int INPUT_FILE_REQUEST_CODE = 1; + + + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentHomeBinding.inflate(inflater, container, false); + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + View root = binding.getRoot(); + MyUtils.setFullscreen(requireActivity(), false, false); + MyUtils.setAndroidNativeLightStatusBar(requireActivity(), true); + mWebView = binding.wvHome; + mApolloBinder = Apollo.bind(this); + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + webSettings.setDomStorageEnabled(true); + webSettings.setAllowFileAccess(true);//文件访问 + webSettings.setAllowFileAccessFromFileURLs(true); + mWebView.addJavascriptInterface(new AndroidtoJs(), "AndroidtoJs"); + mWebView.loadUrl("https://cmx.bskies.cc:8000/cmx-hydrology-h5/#/home"); + showDialog(); + mWebView.setWebChromeClient(new PQChromeClient()); + mWebView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + //使用WebView加载显示url + view.loadUrl(url); + //返回true + return true; + } + + @Override + public void onPageFinished(WebView view, String url) { + disDialog(); + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + disDialog(); + } + } + + ); + return root; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + if (mApolloBinder != null) { + mApolloBinder.unbind(); + } + } + + public void showDialog() { + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + if (!mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.show(); + } + } + + public void disDialog() { + if (mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.dismiss(); + } + } + + + public class PQChromeClient extends WebChromeClient { + // For Android 5.0+ + public boolean onShowFileChooser(WebView view, ValueCallback filePath, WebChromeClient.FileChooserParams fileChooserParams) { + // Double check that we don't have any existing callbacks + if (mUploadMessage != null) { + mUploadMessage.onReceiveValue(null); + } + mUploadMessage = filePath; + Log.e("FileCooserParams => ", filePath.toString()); + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { + // Create the File where the photo should go + File photoFile = null; + try { + photoFile = createImageFile(); + takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); + } catch (IOException ex) { + // Error occurred while creating the File + Log.e("test", "Unable to create Image File", ex); + } + + // Continue only if the File was successfully created + if (photoFile != null) { + mCameraPhotoPath = "file:" + photoFile.getAbsolutePath(); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); + } else { + takePictureIntent = null; + } + } + + Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); + contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); + contentSelectionIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + contentSelectionIntent.setType("image/*"); + Intent[] intentArray; + if (takePictureIntent != null) { + intentArray = new Intent[]{takePictureIntent}; + } else { + intentArray = new Intent[2]; + } + Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); + chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); + chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser"); + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); + startActivityForResult(Intent.createChooser(chooserIntent, "Select images"), 1); + return true; + } + } + + + private File createImageFile() throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); + File imageFile = File.createTempFile(imageFileName, /* prefix */ + ".jpg", /* suffix */ + storageDir /* directory */); + return imageFile; + } + + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode != INPUT_FILE_REQUEST_CODE || mUploadMessage == null) { + super.onActivityResult(requestCode, resultCode, data); + return; + } + try { + String file_path = mCameraPhotoPath.replace("file:", ""); + File file = new File(file_path); + size = file.length(); + if (data != null || mCameraPhotoPath != null) { + Integer count = 1; + ClipData images = null; + try { + images = data.getClipData(); + } catch (Exception e) { + Log.e("Error!", e.getLocalizedMessage()); + } + + if (images == null && data != null && data.getDataString() != null) { + count = data.getDataString().length(); + } else if (images != null) { + count = images.getItemCount(); + } + Uri[] results = new Uri[count]; + // Check that the response is a good one + if (resultCode == Activity.RESULT_OK) { + if (size != 0) { + // If there is not data, then we may have taken a photo + if (mCameraPhotoPath != null) { + results = new Uri[]{Uri.parse(mCameraPhotoPath)}; + } + } else if (data.getClipData() == null) { + results = new Uri[]{Uri.parse(data.getDataString())}; + } else { + + for (int i = 0; i < images.getItemCount(); i++) { + results[i] = images.getItemAt(i).getUri(); + } + } + } + mUploadMessage.onReceiveValue(results); + mUploadMessage = null; + } + } catch (Exception e) { + Log.e("Error!", "Error while opening image file" + e.getLocalizedMessage()); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/ui/MapFragment.java b/app/src/main/java/com/cmx/hydrology/ui/MapFragment.java new file mode 100644 index 0000000..b1d7858 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/ui/MapFragment.java @@ -0,0 +1,93 @@ +package com.cmx.hydrology.ui; + + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.cmx.hydrology.databinding.FragmentMapBinding; +import com.cmx.hydrology.utils.AndroidtoJs; +import com.cmx.hydrology.utils.MyUtils; +import com.cmx.hydrology.view.BaseLoadingDialog; +import com.lsxiao.apollo.core.Apollo; +import com.lsxiao.apollo.core.contract.ApolloBinder; + +public class MapFragment extends Fragment { + + private FragmentMapBinding binding; + private BaseLoadingDialog mBaseLoadingDialog; + private WebView mWebView; + private ApolloBinder mApolloBinder; + + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentMapBinding.inflate(inflater, container, false); + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + View root = binding.getRoot(); + mApolloBinder = Apollo.bind(this); + MyUtils.setFullscreen(requireActivity(), false, false); + MyUtils.setAndroidNativeLightStatusBar(requireActivity(), true); + mWebView = binding.wvMine; + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + webSettings.setDomStorageEnabled(true); + mWebView.addJavascriptInterface(new AndroidtoJs(), "AndroidtoJs"); + // mWebView.loadUrl(SERVER_URL + "/nigeria/?lang=English#/my"); + // showDialog(); + mWebView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + //使用WebView加载显示url + view.loadUrl(url); + //返回true + return true; + } + + @Override + public void onPageFinished(WebView view, String url) { + disDialog(); + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + disDialog(); + } + } + + ); + return root; + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + if (mApolloBinder != null) { + mApolloBinder.unbind(); + } + } + + public void showDialog() { + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + if (!mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.show(); + } + } + + + public void disDialog() { + if (mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.dismiss(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/ui/MsgFragment.java b/app/src/main/java/com/cmx/hydrology/ui/MsgFragment.java new file mode 100644 index 0000000..f1778cb --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/ui/MsgFragment.java @@ -0,0 +1,232 @@ +package com.cmx.hydrology.ui; + + +import android.app.Activity; +import android.content.ClipData; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.cmx.hydrology.databinding.FragmentMsgBinding; +import com.cmx.hydrology.utils.AndroidtoJs; +import com.cmx.hydrology.utils.MyUtils; +import com.cmx.hydrology.view.BaseLoadingDialog; +import com.lsxiao.apollo.core.Apollo; +import com.lsxiao.apollo.core.contract.ApolloBinder; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class MsgFragment extends Fragment { + + private FragmentMsgBinding binding; + private BaseLoadingDialog mBaseLoadingDialog; + private WebView mWebView; + private ApolloBinder mApolloBinder; + private ValueCallback mUploadMessage; + private String mCameraPhotoPath = null; + private long size = 0; + private static final int INPUT_FILE_REQUEST_CODE = 1; + + + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentMsgBinding.inflate(inflater, container, false); + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + View root = binding.getRoot(); + MyUtils.setFullscreen(requireActivity(), false, false); + MyUtils.setAndroidNativeLightStatusBar(requireActivity(), true); + mWebView = binding.wvLoan; + mApolloBinder = Apollo.bind(this); + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + webSettings.setDomStorageEnabled(true); + webSettings.setAllowFileAccess(true);//文件访问 + webSettings.setAllowFileAccessFromFileURLs(true); + mWebView.addJavascriptInterface(new AndroidtoJs(), "AndroidtoJs"); + // mWebView.loadUrl(SERVER_URL + "/nigeria/?lang=English#/loans"); + // showDialog(); + mWebView.setWebChromeClient(new PQChromeClient()); + mWebView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + //使用WebView加载显示url + view.loadUrl(url); + //返回true + return true; + } + + @Override + public void onPageFinished(WebView view, String url) { + disDialog(); + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + disDialog(); + } + } + + ); + return root; + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + if (mApolloBinder != null) { + mApolloBinder.unbind(); + } + } + + + public void showDialog() { + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + if (!mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.show(); + } + } + + + public void disDialog() { + if (mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.dismiss(); + } + } + + + public class PQChromeClient extends WebChromeClient { + // For Android 5.0+ + public boolean onShowFileChooser(WebView view, ValueCallback filePath, WebChromeClient.FileChooserParams fileChooserParams) { + // Double check that we don't have any existing callbacks + if (mUploadMessage != null) { + mUploadMessage.onReceiveValue(null); + } + mUploadMessage = filePath; + Log.e("FileCooserParams => ", filePath.toString()); + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { + // Create the File where the photo should go + File photoFile = null; + try { + photoFile = createImageFile(); + takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); + } catch (IOException ex) { + // Error occurred while creating the File + Log.e("test", "Unable to create Image File", ex); + } + + // Continue only if the File was successfully created + if (photoFile != null) { + mCameraPhotoPath = "file:" + photoFile.getAbsolutePath(); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); + } else { + takePictureIntent = null; + } + } + + Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); + contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); + contentSelectionIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + contentSelectionIntent.setType("image/*"); + + Intent[] intentArray; + if (takePictureIntent != null) { + intentArray = new Intent[]{takePictureIntent}; + } else { + intentArray = new Intent[2]; + } + Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); + chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); + chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser"); + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); + startActivityForResult(Intent.createChooser(chooserIntent, "Select images"), 1); + + return true; + } + } + + + private File createImageFile() throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); + File imageFile = File.createTempFile(imageFileName, /* prefix */ + ".jpg", /* suffix */ + storageDir /* directory */); + return imageFile; + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode != INPUT_FILE_REQUEST_CODE || mUploadMessage == null) { + super.onActivityResult(requestCode, resultCode, data); + return; + } + try { + String file_path = mCameraPhotoPath.replace("file:", ""); + File file = new File(file_path); + size = file.length(); + + } catch (Exception e) { + Log.e("Error!", "Error while opening image file" + e.getLocalizedMessage()); + } + + if (data != null || mCameraPhotoPath != null) { + Integer count = 1; + ClipData images = null; + try { + images = data.getClipData(); + } catch (Exception e) { + Log.e("Error!", e.getLocalizedMessage()); + } + + if (images == null && data != null && data.getDataString() != null) { + count = data.getDataString().length(); + } else if (images != null) { + count = images.getItemCount(); + } + Uri[] results = new Uri[count]; + // Check that the response is a good one + if (resultCode == Activity.RESULT_OK) { + if (size != 0) { + // If there is not data, then we may have taken a photo + if (mCameraPhotoPath != null) { + results = new Uri[]{Uri.parse(mCameraPhotoPath)}; + } + } else if (data.getClipData() == null) { + results = new Uri[]{Uri.parse(data.getDataString())}; + } else { + + for (int i = 0; i < images.getItemCount(); i++) { + results[i] = images.getItemAt(i).getUri(); + } + } + } + mUploadMessage.onReceiveValue(results); + mUploadMessage = null; + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/ui/MyFragment.java b/app/src/main/java/com/cmx/hydrology/ui/MyFragment.java new file mode 100644 index 0000000..47d1890 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/ui/MyFragment.java @@ -0,0 +1,93 @@ +package com.cmx.hydrology.ui; + + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.cmx.hydrology.databinding.FragmentMyBinding; +import com.cmx.hydrology.utils.AndroidtoJs; +import com.cmx.hydrology.utils.MyUtils; +import com.cmx.hydrology.view.BaseLoadingDialog; +import com.lsxiao.apollo.core.Apollo; +import com.lsxiao.apollo.core.contract.ApolloBinder; + +public class MyFragment extends Fragment { + + private FragmentMyBinding binding; + private BaseLoadingDialog mBaseLoadingDialog; + private WebView mWebView; + private ApolloBinder mApolloBinder; + + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentMyBinding.inflate(inflater, container, false); + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + View root = binding.getRoot(); + mApolloBinder = Apollo.bind(this); + MyUtils.setFullscreen(requireActivity(), false, false); + MyUtils.setAndroidNativeLightStatusBar(requireActivity(), true); + mWebView = binding.wvMine; + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + webSettings.setDomStorageEnabled(true); + mWebView.addJavascriptInterface(new AndroidtoJs(), "AndroidtoJs"); + // mWebView.loadUrl(SERVER_URL + "/nigeria/?lang=English#/my"); + // showDialog(); + mWebView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + //使用WebView加载显示url + view.loadUrl(url); + //返回true + return true; + } + + @Override + public void onPageFinished(WebView view, String url) { + disDialog(); + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + disDialog(); + } + } + + ); + return root; + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + if (mApolloBinder != null) { + mApolloBinder.unbind(); + } + } + + public void showDialog() { + mBaseLoadingDialog = new BaseLoadingDialog(getActivity()); + if (!mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.show(); + } + } + + + public void disDialog() { + if (mBaseLoadingDialog.isShowing()) { + mBaseLoadingDialog.dismiss(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/utils/AndroidtoJs.java b/app/src/main/java/com/cmx/hydrology/utils/AndroidtoJs.java new file mode 100644 index 0000000..1b824d6 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/utils/AndroidtoJs.java @@ -0,0 +1,89 @@ +package com.cmx.hydrology.utils; + +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.util.Log; +import android.webkit.JavascriptInterface; + +import com.cmx.hydrology.activity.MyApplication; +import com.cmx.hydrology.constant.Events; +import com.lsxiao.apollo.core.Apollo; + +public class AndroidtoJs { + private static final String TAG = "cmx_AndroidtoJs"; + + // 定义JS需要调用的方法 + // 被JS调用的方法必须加入@JavascriptInterface注解 + @JavascriptInterface + public String getAppToken() { + L.e("JS--", "getAppToken()"); + return SpUtils.getString(MyApplication.getmInstance(), "token"); + } + + /** + * 用户角色类型 + * + * @return + */ + @JavascriptInterface + public String getUser() { + L.e("JS--", "getUser()"); + return SpUtils.getString(MyApplication.getmInstance(), "admin"); + } + + + @JavascriptInterface + public String getAppVersion() { + L.e("JS--", "getAppVersion()"); + String versionname;//版本号 + try { + PackageManager pm = MyApplication.getmInstance().getApplicationContext().getPackageManager(); + PackageInfo pi = pm.getPackageInfo(MyApplication.getmInstance().getApplicationContext().getPackageName(), 0); + versionname = "V" + pi.versionName; + } catch (PackageManager.NameNotFoundException e) { + versionname = "未知"; + } + Log.e(TAG, "getAppVersion=" + versionname); + return versionname; + } + + @JavascriptInterface + public void existApp() { + L.e("JS--", "existApp()"); + Apollo.emit(Events.JS_OPEN_LOGOUT); + } + + @JavascriptInterface + public void showTab() {//tabbar显示 + L.e("JS--", "showTab()"); + Apollo.emit(Events.JS_OPEN_TABBAR_SHOW); + } + + @JavascriptInterface + public void hideTab() {//tabbar隐藏 + L.e("JS--", "hideTab()"); + Apollo.emit(Events.JS_OPEN_TABBAR_HIDE); + } + + + @JavascriptInterface + public void openWeb(String url) {//打开一个新的web界面 + L.e("JS--", "openWeb()" + url); + Apollo.emit(Events.JS_OPEN_OPEN_WEB, url); + } + + + @JavascriptInterface + public void closeWeb() {//关闭那个新的web界面 + L.e("JS--", "closeWeb()"); + Apollo.emit(Events.JS_OPEN_CLOSE_WEB); + } + + + @JavascriptInterface + public void checkTab(String mode) {//关闭注册/忘记密码 + L.e("JS--", "checkTab()"); + Apollo.emit(Events.JS_OPEN_TAB, mode); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cmx/hydrology/utils/L.java b/app/src/main/java/com/cmx/hydrology/utils/L.java new file mode 100644 index 0000000..ce2125d --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/utils/L.java @@ -0,0 +1,92 @@ +package com.cmx.hydrology.utils; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build; +import android.provider.MediaStore; +import android.util.Base64; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListAdapter; +import android.widget.ListView; + +import java.io.File; +import java.lang.reflect.Method; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + + +public class L { + private L() { + throw new UnsupportedOperationException("cannot be instantiated"); + } + + public static boolean isDebug = true; + private static String TAG = "LjTestLog"; + + public static String getTAG() { + return TAG; + } + + public static void setTAG(String TAG) { + L.TAG = TAG; + } + + public static void setDebugMode(boolean debug) { + isDebug = debug; + } + + public static void i(String msg) { + if (isDebug) + Log.i(TAG, msg); + } + + public static void d(String msg) { + if (isDebug) + Log.d(TAG, msg); + } + + public static void e(String msg) { + if (isDebug) + Log.e(TAG, msg); + } + + public static void v(String msg) { + if (isDebug) + Log.v(TAG, msg); + } + + public static void i(String tag, String msg) { + if (isDebug) + Log.i(tag, msg); + } + + public static void d(String tag, String msg) { + if (isDebug) + Log.d(tag, msg); + } + + public static void e(String tag, String msg) { + if (isDebug) + Log.e(tag, msg); + } + + public static void v(String tag, String msg) { + if (isDebug) + Log.v(tag, msg); + + } + + +} + + + diff --git a/app/src/main/java/com/cmx/hydrology/utils/MyUtils.java b/app/src/main/java/com/cmx/hydrology/utils/MyUtils.java new file mode 100644 index 0000000..0195b5c --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/utils/MyUtils.java @@ -0,0 +1,220 @@ +package com.cmx.hydrology.utils; + +import android.app.Activity; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.os.StatFs; +import android.provider.MediaStore; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Locale; + +public class MyUtils { + private static final String TAG = "cmx_" + MyUtils.class.getSimpleName(); + public static void setNavigationStatusColor(Activity activity, int color) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().setNavigationBarColor(color); + activity.getWindow().setStatusBarColor(color); + } + + public static void setFullscreen(Activity activity, boolean isShowStatusBar, boolean isShowNavigationBar) { + int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + + if (!isShowStatusBar) { + uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN; + } + if (!isShowNavigationBar) { + uiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; + } + activity.getWindow().getDecorView().setSystemUiVisibility(uiOptions); + setNavigationStatusColor(activity, Color.TRANSPARENT); + } + + public static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) { + View decor = activity.getWindow().getDecorView(); + if (dark) { + decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } else { + decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + } + + + private static String getVersionName(Activity activity) throws Exception { + PackageManager packageManager = activity.getPackageManager(); + // getPackageName()是你当前类的包名,0代表是获取版本信息 + PackageInfo packInfo = packageManager.getPackageInfo(activity.getPackageName(), 0); + String version = packInfo.versionName; + return version; + } + + public static void getDeviceInfo(Activity activity) throws Exception { + String model = android.os.Build.MODEL; + String carrier = android.os.Build.MANUFACTURER; + String version = getVersionName(activity); + String lang = getSystemLanguage(); + String brand = getPhoneBrand(); + String releaseVersion = getVersionRelease(); + int sdkVersion = getSdkVersion(); + Log.e(TAG, "model=" + model + ", carrier=" + carrier + ", version=" + version + ", lang=" + lang + ", brand=" + brand + ", releaseVersion=" + releaseVersion + ",sdk version=" + sdkVersion); + } + + public static String getSystemLanguage() { + return Locale.getDefault().getLanguage(); + } + + public static Locale[] getSystemLanguageList() { + return Locale.getAvailableLocales(); + } + + public static String getPhoneBrand() { + return Build.BRAND; + } + + public static String getVersionRelease() { + return Build.VERSION.RELEASE; + } + + public static int getSdkVersion() { + return Build.VERSION.SDK_INT; + } + + + public static String getSerialNum() { + String serial = "unknown"; + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {//9.0+ + serial = Build.getSerial(); + } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//8.0+ + serial = Build.SERIAL; + } else {//8.0- + Class c = Class.forName("android.os.SystemProperties"); + Method get = c.getMethod("get", String.class); + serial = (String) get.invoke(c, "ro.serialno"); + } + } catch (Exception e) { + Log.e("序列号》》", e.toString()); + e.printStackTrace(); + } + + Log.e("序列号》》", serial); + return serial; + } + + public static File createTempImageFile(Context context) { + File destFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); + destFolder.mkdirs(); + String dateTimeString = System.currentTimeMillis() + ""; + File imageFile = null; + try { + imageFile = File.createTempFile(dateTimeString + "-", ".jpg", destFolder); + } catch (IOException e) { + Log.e("文件失败>>>", e.toString()); + throw new RuntimeException(e); + } + + + return imageFile; + } + + + public static String getTotalRam() { + String path = "/proc/meminfo"; + String ramMemorySize = null; + int totalRam = 0; + try { + FileReader fileReader = new FileReader(path); + BufferedReader br = new BufferedReader(fileReader, 4096); + ramMemorySize = br.readLine().split("\\s+")[1]; + br.close(); + } catch (Exception e) { + e.printStackTrace(); + } + if (ramMemorySize != null) { + totalRam = (int) Math.ceil((Float.valueOf(Float.parseFloat(ramMemorySize) / (1024 * 1024)).doubleValue())); + } + + return totalRam + ""; + } + + public static String getTotalRom() { + File dataDir = Environment.getDataDirectory(); + StatFs stat = new StatFs(dataDir.getPath()); + long blockSize = stat.getBlockSizeLong(); + long totalBlocks = stat.getBlockCountLong(); + long size = totalBlocks * blockSize; + long GB = 1024 * 1024 * 1024; + final long[] deviceRomMemoryMap = {2 * GB, 4 * GB, 8 * GB, 16 * GB, 32 * GB, 64 * GB, 128 * GB, 256 * GB, 512 * GB, 1024 * GB, 2048 * GB}; + String[] displayRomSize = {"2GB", "4GB", "8GB", "16GB", "32GB", "64GB", "128GB", "256GB", "512GB", "1024GB", "2048GB"}; + int i; + for (i = 0; i < deviceRomMemoryMap.length; i++) { + if (size <= deviceRomMemoryMap[i]) { + break; + } + if (i == deviceRomMemoryMap.length) { + i--; + } + } + return displayRomSize[i].replace("GB", ""); + } + + /** + * sha256加密 + * + * @param str 要加密的字符串 + * @return 加密后的字符串 + */ + public static String getSha256Str(String str) { + MessageDigest messageDigest; + String encodeStr = ""; + try { + messageDigest = MessageDigest.getInstance("SHA-256"); + messageDigest.update(str.getBytes(StandardCharsets.UTF_8)); + encodeStr = byte2Hex(messageDigest.digest()); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return encodeStr; + } + + + /** + * sha256加密 将byte转为16进制 + * + * @param bytes 字节码 + * @return 加密后的字符串 + */ + private static String byte2Hex(byte[] bytes) { + StringBuilder stringBuilder = new StringBuilder(); + String temp; + for (byte aByte : bytes) { + temp = Integer.toHexString(aByte & 0xFF); + if (temp.length() == 1) { + //1得到一位的进行补0操作 + stringBuilder.append("0"); + } + stringBuilder.append(temp); + } + return stringBuilder.toString(); + } + + +} diff --git a/app/src/main/java/com/cmx/hydrology/utils/SpUtils.java b/app/src/main/java/com/cmx/hydrology/utils/SpUtils.java new file mode 100644 index 0000000..7b35754 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/utils/SpUtils.java @@ -0,0 +1,24 @@ +package com.cmx.hydrology.utils; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.view.WindowManager; + +public class SpUtils { + private static final String SP_NAME = "SP_USER_DATA"; + + + public static void putString(Context context, String key, String val) { + SharedPreferences sp = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putString(key, val); + editor.commit(); + } + + public static String getString(Context context, String key) { + SharedPreferences sp = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE); + return sp.getString(key, ""); + } + +} diff --git a/app/src/main/java/com/cmx/hydrology/utils/StaticFinalData.java b/app/src/main/java/com/cmx/hydrology/utils/StaticFinalData.java new file mode 100644 index 0000000..24c3d60 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/utils/StaticFinalData.java @@ -0,0 +1,8 @@ +package com.cmx.hydrology.utils; + +public class StaticFinalData { + public static final String LOGOUT = "LOGOUT"; + public static final String UPLOAD_FACE = "UPLOAD_FACE"; + public static final String UPLOAD_FACE_OVER = "UPLOAD_FACE_OVER"; + public static final String CHANGE_TAB = "CHANGE_TAB"; +} diff --git a/app/src/main/java/com/cmx/hydrology/view/BaseLoadingDialog.java b/app/src/main/java/com/cmx/hydrology/view/BaseLoadingDialog.java new file mode 100644 index 0000000..bec4084 --- /dev/null +++ b/app/src/main/java/com/cmx/hydrology/view/BaseLoadingDialog.java @@ -0,0 +1,37 @@ +package com.cmx.hydrology.view; + +import android.animation.ObjectAnimator; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.animation.LinearInterpolator; +import android.widget.ImageView; + +import com.cmx.hydrology.R; + + +public class BaseLoadingDialog extends Dialog { + + private ImageView load; + + public BaseLoadingDialog(Context context) { + super(context, R.style.CustomDialog); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_confirm); + load = findViewById(R.id.iv_load); + ObjectAnimator animator = ObjectAnimator.ofFloat(load, "rotationY", 0, 360); + animator.setDuration(3000); + animator.setInterpolator(new LinearInterpolator()); + animator.setRepeatCount(-1); + animator.start(); + setCancelable(true); + setCanceledOnTouchOutside(true); + } + + +} \ 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/bg_checkbox.xml b/app/src/main/res/drawable/bg_checkbox.xml new file mode 100644 index 0000000..a8b409b --- /dev/null +++ b/app/src/main/res/drawable/bg_checkbox.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/curse_sharp.xml b/app/src/main/res/drawable/curse_sharp.xml new file mode 100644 index 0000000..18a3fc4 --- /dev/null +++ b/app/src/main/res/drawable/curse_sharp.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dialog_custom_bg.xml b/app/src/main/res/drawable/dialog_custom_bg.xml new file mode 100644 index 0000000..2fa8cfd --- /dev/null +++ b/app/src/main/res/drawable/dialog_custom_bg.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/edittext_active_sharp.xml b/app/src/main/res/drawable/edittext_active_sharp.xml new file mode 100644 index 0000000..0dbb556 --- /dev/null +++ b/app/src/main/res/drawable/edittext_active_sharp.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/edittext_normal_sharp.xml b/app/src/main/res/drawable/edittext_normal_sharp.xml new file mode 100644 index 0000000..caeba65 --- /dev/null +++ b/app/src/main/res/drawable/edittext_normal_sharp.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ + + + 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..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_login_bg.xml b/app/src/main/res/drawable/ic_login_bg.xml new file mode 100644 index 0000000..3eaf50a --- /dev/null +++ b/app/src/main/res/drawable/ic_login_bg.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..78b75c3 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/round_btn_sharp.xml b/app/src/main/res/drawable/round_btn_sharp.xml new file mode 100644 index 0000000..eea6eb0 --- /dev/null +++ b/app/src/main/res/drawable/round_btn_sharp.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/drawable/round_btn_sharp_empty.xml b/app/src/main/res/drawable/round_btn_sharp_empty.xml new file mode 100644 index 0000000..67c9f80 --- /dev/null +++ b/app/src/main/res/drawable/round_btn_sharp_empty.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/app/src/main/res/drawable/selector_edit_text.xml b/app/src/main/res/drawable/selector_edit_text.xml new file mode 100644 index 0000000..9916b19 --- /dev/null +++ b/app/src/main/res/drawable/selector_edit_text.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_round_btn_sharp.xml b/app/src/main/res/drawable/selector_round_btn_sharp.xml new file mode 100644 index 0000000..25a6d0c --- /dev/null +++ b/app/src/main/res/drawable/selector_round_btn_sharp.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/actionbar_custom.xml b/app/src/main/res/layout/actionbar_custom.xml new file mode 100644 index 0000000..cb78f9e --- /dev/null +++ b/app/src/main/res/layout/actionbar_custom.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_agreement.xml b/app/src/main/res/layout/activity_agreement.xml new file mode 100644 index 0000000..ade2878 --- /dev/null +++ b/app/src/main/res/layout/activity_agreement.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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..0ad315b --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + +