commit 941f6b3c5287f5200928526326075c18ea716dbc
Author: 呗 呗 <2026952257@qq.com>
Date: Thu Jun 2 16:37:27 2022 +0800
Initial commit
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/dbnavigator.xml b/.idea/dbnavigator.xml
new file mode 100644
index 0000000..976d6b5
--- /dev/null
+++ b/.idea/dbnavigator.xml
@@ -0,0 +1,611 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..19bb981
--- /dev/null
+++ b/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..526b4c2
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..60979e7
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/S.T.Link.jks b/S.T.Link.jks
new file mode 100644
index 0000000..86a14bd
Binary files /dev/null and b/S.T.Link.jks differ
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..20323ca
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ compileSdk 31
+
+ defaultConfig {
+ applicationId "com.example.stlink"
+ minSdk 21
+ targetSdk 31
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+
+ ndk {
+ // 设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
+ abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64"
+ }
+ }
+
+ 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
+ }
+
+ sourceSets {
+ main {
+ jniLibs.srcDir 'libs'
+ }
+ }
+}
+
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.3.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ implementation 'androidx.navigation:navigation-fragment:2.3.5'
+ implementation 'androidx.navigation:navigation-ui:2.3.5'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
+ implementation files('libs\\BaiduLBS_Android.jar')
+ implementation 'androidx.test:monitor:1.4.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.android.material:material:1.6.0'
+ implementation "androidx.viewpager2:viewpager2:1.0.0"
+
+ def nav_version = "2.1.0"
+ implementation "androidx.navigation:navigation-fragment:$nav_version"
+ implementation "androidx.navigation:navigation-ui:$nav_version"
+
+ // Java language implementation
+ implementation "androidx.fragment:fragment:1.4.1"
+
+ implementation 'com.squareup.okhttp3:okhttp:3.10.0'
+ implementation 'com.google.code.gson:gson:2.8.6'
+ implementation 'com.github.bumptech.glide:glide:4.11.0'
+
+ // https://mvnrepository.com/artifact/org.ligboy.retrofit2/converter-fastjson-android
+ implementation 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
+
+ //图片选择器
+ implementation 'com.github.donkingliang:ImageSelector:2.2.1'
+
+ //浮动按钮
+ implementation 'gdut.bsx:xdraglayout:1.1.1'
+
+ //二维码的生成与解析
+ // https://mvnrepository.com/artifact/com.google.zxing/core
+ implementation 'com.google.zxing:core:3.5.0'
+ implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
+
+ implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
+
+
+
+
+}
\ No newline at end of file
diff --git a/app/libs/BaiduLBS_Android.jar b/app/libs/BaiduLBS_Android.jar
new file mode 100644
index 0000000..7161cb5
Binary files /dev/null and b/app/libs/BaiduLBS_Android.jar differ
diff --git a/app/libs/arm64-v8a/libBaiduMapSDK_base_v7_5_0.so b/app/libs/arm64-v8a/libBaiduMapSDK_base_v7_5_0.so
new file mode 100644
index 0000000..71cebac
Binary files /dev/null and b/app/libs/arm64-v8a/libBaiduMapSDK_base_v7_5_0.so differ
diff --git a/app/libs/arm64-v8a/libBaiduMapSDK_map_v7_5_0.so b/app/libs/arm64-v8a/libBaiduMapSDK_map_v7_5_0.so
new file mode 100644
index 0000000..8b1b578
Binary files /dev/null and b/app/libs/arm64-v8a/libBaiduMapSDK_map_v7_5_0.so differ
diff --git a/app/libs/arm64-v8a/libgnustl_shared.so b/app/libs/arm64-v8a/libgnustl_shared.so
new file mode 100644
index 0000000..be99b75
Binary files /dev/null and b/app/libs/arm64-v8a/libgnustl_shared.so differ
diff --git a/app/libs/arm64-v8a/libindoor.so b/app/libs/arm64-v8a/libindoor.so
new file mode 100644
index 0000000..bfb6f75
Binary files /dev/null and b/app/libs/arm64-v8a/libindoor.so differ
diff --git a/app/libs/arm64-v8a/liblocSDK8b.so b/app/libs/arm64-v8a/liblocSDK8b.so
new file mode 100644
index 0000000..9bd868a
Binary files /dev/null and b/app/libs/arm64-v8a/liblocSDK8b.so differ
diff --git a/app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_5_0.so b/app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_5_0.so
new file mode 100644
index 0000000..5e43df2
Binary files /dev/null and b/app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_5_0.so differ
diff --git a/app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_5_0.so b/app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_5_0.so
new file mode 100644
index 0000000..c756afc
Binary files /dev/null and b/app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_5_0.so differ
diff --git a/app/libs/armeabi-v7a/libgnustl_shared.so b/app/libs/armeabi-v7a/libgnustl_shared.so
new file mode 100644
index 0000000..96c22a2
Binary files /dev/null and b/app/libs/armeabi-v7a/libgnustl_shared.so differ
diff --git a/app/libs/armeabi-v7a/libindoor.so b/app/libs/armeabi-v7a/libindoor.so
new file mode 100644
index 0000000..b59be91
Binary files /dev/null and b/app/libs/armeabi-v7a/libindoor.so differ
diff --git a/app/libs/armeabi-v7a/liblocSDK8b.so b/app/libs/armeabi-v7a/liblocSDK8b.so
new file mode 100644
index 0000000..aa90e76
Binary files /dev/null and b/app/libs/armeabi-v7a/liblocSDK8b.so differ
diff --git a/app/libs/armeabi/libBaiduMapSDK_base_v7_5_0.so b/app/libs/armeabi/libBaiduMapSDK_base_v7_5_0.so
new file mode 100644
index 0000000..a1831f1
Binary files /dev/null and b/app/libs/armeabi/libBaiduMapSDK_base_v7_5_0.so differ
diff --git a/app/libs/armeabi/libBaiduMapSDK_map_v7_5_0.so b/app/libs/armeabi/libBaiduMapSDK_map_v7_5_0.so
new file mode 100644
index 0000000..21b6050
Binary files /dev/null and b/app/libs/armeabi/libBaiduMapSDK_map_v7_5_0.so differ
diff --git a/app/libs/armeabi/libgnustl_shared.so b/app/libs/armeabi/libgnustl_shared.so
new file mode 100644
index 0000000..5cf6d20
Binary files /dev/null and b/app/libs/armeabi/libgnustl_shared.so differ
diff --git a/app/libs/armeabi/libindoor.so b/app/libs/armeabi/libindoor.so
new file mode 100644
index 0000000..a0879cf
Binary files /dev/null and b/app/libs/armeabi/libindoor.so differ
diff --git a/app/libs/armeabi/liblocSDK8b.so b/app/libs/armeabi/liblocSDK8b.so
new file mode 100644
index 0000000..4083291
Binary files /dev/null and b/app/libs/armeabi/liblocSDK8b.so differ
diff --git a/app/libs/x86/libBaiduMapSDK_base_v7_5_0.so b/app/libs/x86/libBaiduMapSDK_base_v7_5_0.so
new file mode 100644
index 0000000..5d3222f
Binary files /dev/null and b/app/libs/x86/libBaiduMapSDK_base_v7_5_0.so differ
diff --git a/app/libs/x86/libBaiduMapSDK_map_v7_5_0.so b/app/libs/x86/libBaiduMapSDK_map_v7_5_0.so
new file mode 100644
index 0000000..5945657
Binary files /dev/null and b/app/libs/x86/libBaiduMapSDK_map_v7_5_0.so differ
diff --git a/app/libs/x86/libgnustl_shared.so b/app/libs/x86/libgnustl_shared.so
new file mode 100644
index 0000000..1eae31c
Binary files /dev/null and b/app/libs/x86/libgnustl_shared.so differ
diff --git a/app/libs/x86/libindoor.so b/app/libs/x86/libindoor.so
new file mode 100644
index 0000000..1de0a2c
Binary files /dev/null and b/app/libs/x86/libindoor.so differ
diff --git a/app/libs/x86/liblocSDK8b.so b/app/libs/x86/liblocSDK8b.so
new file mode 100644
index 0000000..ca234f1
Binary files /dev/null and b/app/libs/x86/liblocSDK8b.so differ
diff --git a/app/libs/x86_64/libBaiduMapSDK_base_v7_5_0.so b/app/libs/x86_64/libBaiduMapSDK_base_v7_5_0.so
new file mode 100644
index 0000000..053f32a
Binary files /dev/null and b/app/libs/x86_64/libBaiduMapSDK_base_v7_5_0.so differ
diff --git a/app/libs/x86_64/libBaiduMapSDK_map_v7_5_0.so b/app/libs/x86_64/libBaiduMapSDK_map_v7_5_0.so
new file mode 100644
index 0000000..ad2885e
Binary files /dev/null and b/app/libs/x86_64/libBaiduMapSDK_map_v7_5_0.so differ
diff --git a/app/libs/x86_64/libgnustl_shared.so b/app/libs/x86_64/libgnustl_shared.so
new file mode 100644
index 0000000..0149273
Binary files /dev/null and b/app/libs/x86_64/libgnustl_shared.so differ
diff --git a/app/libs/x86_64/libindoor.so b/app/libs/x86_64/libindoor.so
new file mode 100644
index 0000000..80a00c6
Binary files /dev/null and b/app/libs/x86_64/libindoor.so differ
diff --git a/app/libs/x86_64/liblocSDK8b.so b/app/libs/x86_64/liblocSDK8b.so
new file mode 100644
index 0000000..ff464c5
Binary files /dev/null and b/app/libs/x86_64/liblocSDK8b.so differ
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/release/app-release.aab b/app/release/app-release.aab
new file mode 100644
index 0000000..1e51cec
Binary files /dev/null and b/app/release/app-release.aab differ
diff --git a/app/src/androidTest/java/com/example/stlink/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/stlink/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..100b7af
--- /dev/null
+++ b/app/src/androidTest/java/com/example/stlink/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.stlink;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.stlink", appContext.getPackageName());
+ }
+}
\ 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..0f88a0d
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/stlink/LaunchActivity.java b/app/src/main/java/com/example/stlink/LaunchActivity.java
new file mode 100644
index 0000000..01af684
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/LaunchActivity.java
@@ -0,0 +1,69 @@
+package com.example.stlink;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.widget.ImageView;
+
+import com.example.stlink.activitys.IdChooseActivity;
+import com.example.stlink.utils.CommonUtils;
+
+/**
+ * app加载活动
+ */
+public class LaunchActivity extends AppCompatActivity {
+
+ private ImageView mClipLeftLoadingImageView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_launch);
+
+
+// //去除当前活动标题栏
+// Objects.requireNonNull(getSupportActionBar()).hide();
+
+ mClipLeftLoadingImageView = findViewById(R.id.iv_login_loading);
+ mClipLeftLoadingImageView.setImageLevel(0);
+
+ //修改状态栏字体颜色
+ CommonUtils.changeStatusBar(this);
+
+// //延时任务,进度条加载
+// handler.postDelayed(runnable, 500);
+
+ //延时加载
+ Handler handler = new Handler();
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Intent intent = new Intent(LaunchActivity.this, IdChooseActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ }
+ }, 1000);//3秒后执行Runnable中的run方法
+
+ }
+
+
+// //开启一个子线程用作进度条加载
+// private int mUnmber = 0;
+// private Handler handler = new Handler();
+// Runnable runnable = new Runnable() {
+// @Override
+// public void run() {
+// if(mUnmber <= 10000){
+// mClipLeftLoadingImageView.getDrawable().setLevel(mUnmber);
+// handler.postDelayed(runnable, 20);
+// mUnmber += 100;
+// }
+//
+// //进度条加载完毕之后,跳转到身份选择活动
+// Intent intent = new Intent(LaunchActivity.this, IdChooseActivity.class);
+// startActivity(intent);
+// }
+// };
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/stlink/activitys/IdChooseActivity.java b/app/src/main/java/com/example/stlink/activitys/IdChooseActivity.java
new file mode 100644
index 0000000..bfa0988
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/activitys/IdChooseActivity.java
@@ -0,0 +1,134 @@
+package com.example.stlink.activitys;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.stlink.R;
+import com.example.stlink.model.constants.ModelFieldConstants;
+import com.example.stlink.utils.CommonUtils;
+
+/**
+ * 登录身份选择
+ */
+public class IdChooseActivity extends AppCompatActivity {
+
+ private Boolean isExit = false; // 定义一个变量,来标识是否退出
+ Handler mHandler; // 3秒内连续点击两个退出键返回
+
+ private Button stuLoginCho;
+ private Button teaLoginCho;
+
+ private Bundle bundle;
+ private Intent intentIdCho;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login_identity_choose);
+
+ initView();
+
+ // 消息延时处理,将退出标志设置未为false
+ mHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ isExit = false;
+ }
+ };
+ }
+
+ /**
+ * 初始化布局
+ */
+ public void initView(){
+ //修改状态栏字体颜色
+ CommonUtils.changeStatusBar(this);
+
+ stuLoginCho = findViewById(R.id.login_b_stu);
+ teaLoginCho = findViewById(R.id.login_b_tea);
+
+ bundle = new Bundle();
+
+ setOnclickListener();
+ }
+
+ /**
+ * 设置按钮点击监听事件
+ */
+ public void setOnclickListener(){
+ // 选择学生端登录
+ stuLoginCho.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ intentIdCho = new Intent(IdChooseActivity.this, LoginActivity.class);
+ bundle.putInt(ModelFieldConstants.ROLE_ID, 0);
+ intentIdCho.putExtras(bundle);
+ startActivity(intentIdCho);
+ }
+ });
+
+ // 选择教师端登录
+ teaLoginCho.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ intentIdCho = new Intent(IdChooseActivity.this, LoginActivity.class);
+ bundle.putInt(ModelFieldConstants.ROLE_ID, 1);
+ intentIdCho.putExtras(bundle);
+ startActivity(intentIdCho);
+ }
+ });
+ }
+
+
+ /**
+ * 1、当按下BACK键时,会被onKeyDown捕获,判断是BACK键,则执行exit方法。
+ * @param keyCode 自定义的标识
+ * @param event 用户事件
+ * @return 是否点击系统返回键
+ */
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if(keyCode == KeyEvent.KEYCODE_BACK){
+ exit();
+ return false;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ /**
+ * 2、在exit方法中,会首先判断isExit的值,如果为false的话,则置为true,
+ * 同时会弹出提示,并在3000毫秒(3秒)后发出一个消息,在Handler中将此值还原成false。
+ * 如果在发送消息间隔的2秒内,再次按了BACK键,则再次执行exit方法,此时isExit的值已
+ * 为true,则会执行退出的方法。
+ */
+ public void exit(){
+ if (!isExit) {
+ isExit = true;
+ Toast toast = Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT);
+ toast.show();
+ toast.setGravity(Gravity.CENTER, 0, 0);
+ //利用handler延迟发送更改状态信息,3000==3
+ mHandler.sendEmptyMessageDelayed(0, 3000);
+ } else {
+ //在后台运行程序,不退出程序,只返回桌面
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ startActivity(intent);
+ //退出程序代码
+// finish(); //结束程序
+// System.exit(0); //退出程序
+ }
+ }
+}
diff --git a/app/src/main/java/com/example/stlink/activitys/LoginActivity.java b/app/src/main/java/com/example/stlink/activitys/LoginActivity.java
new file mode 100644
index 0000000..aa93154
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/activitys/LoginActivity.java
@@ -0,0 +1,136 @@
+package com.example.stlink.activitys;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.stlink.R;
+import com.example.stlink.model.constants.ModelFieldConstants;
+import com.example.stlink.utils.CommonUtils;
+import com.example.stlink.utils.activityUtil.LoginUtil;
+
+/**
+ * 学生端登录
+ */
+public class LoginActivity extends AppCompatActivity {
+
+
+ private EditText etPwd;
+ private EditText etAccount;
+ private CheckBox cbRememberPwd;
+ private Button btLogin;
+ private TextView lgRegister;
+ private TextView tvLgTitle;
+ private ImageView lgUserIcon;
+
+ private Integer roleId;
+ private Bundle bundle;
+
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+
+ initView();
+
+ }
+
+ /**
+ * 初始化当前页面
+ */
+ private void initView(){
+ //修改状态栏字体颜色
+ CommonUtils.changeStatusBar(this);
+
+ etPwd = findViewById(R.id.pwd_lg);
+ etAccount = findViewById(R.id.id_lg);
+ cbRememberPwd = findViewById(R.id.lg_rememberPsd);
+ btLogin = findViewById(R.id.bt_login);
+ lgRegister = findViewById(R.id.lg_register);
+ tvLgTitle = findViewById(R.id.tv_lg_title);
+ lgUserIcon = findViewById(R.id.lg_userIcon);
+
+ bundle = getIntent().getExtras();
+ roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID);
+
+ if(roleId == 1){
+ tvLgTitle.setText("教师端登录");
+ lgUserIcon.setImageResource(R.mipmap.teacher);
+ }
+
+ //加载用户id,密码到页面
+ initLogin(etAccount, etPwd, cbRememberPwd);
+ //为当前页面按钮添加点击监听事件
+ setOnclickListener();
+ }
+
+ /**
+ * 添加按钮点击监听事件
+ */
+ private void setOnclickListener(){
+
+ LoginUtil.userLogin(LoginActivity.this, btLogin, etAccount, etPwd, cbRememberPwd );
+
+ //用户注册
+ lgRegister.setOnClickListener(new View.OnClickListener() {
+ @SuppressLint("ResourceAsColor")
+ @Override
+ public void onClick(View v) {
+ lgRegister.setTextColor(R.color.crimson);
+ lgRegister.getPaint().setUnderlineText(true);
+ Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
+ intent.putExtras(bundle);
+ startActivity(intent);
+ }
+ });
+ }
+
+ /**
+ * 初始化登录界面
+ * 读取本地账户密码信息,并加载到界面中
+ * @param etAccount 账户昵称输入
+ * @param etPwd 密码输入
+ * @param cbRememberPwd 密码是否保存选择框
+ */
+ public void initLogin(EditText etAccount, EditText etPwd, CheckBox cbRememberPwd){
+ String spFileName = getResources()
+ .getString(R.string.shared_preferences_file_name);
+ String accountKey = getResources()
+ .getString(R.string.login_account_name);
+ String passwordKey = getResources()
+ .getString(R.string.login_password);
+ String rememberPasswordKey = getResources()
+ .getString(R.string.login_remember_password);
+
+ SharedPreferences spFile = getSharedPreferences(
+ spFileName,
+ Context.MODE_PRIVATE
+ );
+
+ String account = spFile.getString(accountKey, null);
+ String password = spFile.getString(passwordKey, null);
+ Boolean rememberPassword = spFile.getBoolean(rememberPasswordKey, false);
+ if(account != null && !TextUtils.isEmpty(account)){
+ etAccount.setText(account);
+ etAccount.setSelection(account.length());
+ }
+ if (password != null && !TextUtils.isEmpty(password)) {
+ etPwd.setText(CommonUtils.encryptAndDencrypt(password));
+ }
+ cbRememberPwd.setChecked(rememberPassword);
+ }
+
+}
diff --git a/app/src/main/java/com/example/stlink/activitys/MainActivity.java b/app/src/main/java/com/example/stlink/activitys/MainActivity.java
new file mode 100644
index 0000000..aa1b9e2
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/activitys/MainActivity.java
@@ -0,0 +1,97 @@
+package com.example.stlink.activitys;
+
+import android.annotation.SuppressLint;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+
+import com.example.stlink.R;
+import com.example.stlink.fragments.StuClassListFragment;
+import com.example.stlink.fragments.StuHomeFragment;
+import com.example.stlink.fragments.TeaCourseListFragment;
+import com.example.stlink.fragments.TeaHomeFragment;
+import com.example.stlink.fragments.UserInfoFragment;
+import com.example.stlink.model.constants.ModelFieldConstants;
+import com.example.stlink.utils.activityUtil.MainActivityUtil;
+import com.google.android.material.bottomnavigation.BottomNavigationView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MainActivity extends AppCompatActivity {
+
+ private MainActivityUtil mainActivityUtil;
+ private BottomNavigationView bottomNavigationView;
+ private Integer roleId;
+ private Bundle bundle;
+
+ @RequiresApi(api = Build.VERSION_CODES.O)
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ initView();
+ initPager();
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.O)
+ @SuppressLint("RestrictedApi")
+ private void initView(){
+
+ bottomNavigationView = findViewById(R.id.bottom_navigation_view);
+
+ mainActivityUtil = new MainActivityUtil(this);
+ mainActivityUtil.initView();
+
+ bundle = getIntent().getExtras();
+ roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID);
+
+ if(roleId == 0){
+ bottomNavigationView.getMenu().getItem(2).setIcon(R.mipmap.student);
+ bottomNavigationView.getMenu().getItem(1).setTitle("班级消息");
+ }
+
+ }
+
+ /**
+ * 绑定页面
+ */
+ private void initPager(){
+ List list = new ArrayList<>();
+ if(roleId == 1){
+ TeaHomeFragment teaHomeFragment = TeaHomeFragment.newInstance("主页",this,findViewById(R.id.nav_host_fragment));
+ TeaCourseListFragment teaCourseListFragment = TeaCourseListFragment.newInstance("班级消息", this);
+ list.add(teaHomeFragment);
+ list.add(teaCourseListFragment);
+ }else{
+ StuHomeFragment stuHomeFragment = StuHomeFragment.newInstance("主页");
+ StuClassListFragment stuClassListFragment = StuClassListFragment.newInstance("班级消息", MainActivity.this);
+ list.add(stuHomeFragment);
+ list.add(stuClassListFragment);
+ }
+ UserInfoFragment teaInfoFragment = UserInfoFragment.newInstance("个人信息", MainActivity.this);
+ list.add(teaInfoFragment);
+ mainActivityUtil.initPager(list);
+ }
+
+ /**
+ * 1、当按下BACK键时,会被onKeyDown捕获,判断是BACK键,则执行exit方法。
+ * @param keyCode 自定义标识
+ * @param event 用户事件
+ * @return 用户是否点击系统返回键
+ */
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if(keyCode == KeyEvent.KEYCODE_BACK){
+ mainActivityUtil.setExit();
+ return false;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+}
diff --git a/app/src/main/java/com/example/stlink/activitys/MapActivity.java b/app/src/main/java/com/example/stlink/activitys/MapActivity.java
new file mode 100644
index 0000000..4772286
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/activitys/MapActivity.java
@@ -0,0 +1,317 @@
+package com.example.stlink.activitys;
+
+import android.annotation.SuppressLint;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.View;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.Toast;
+import android.widget.ZoomControls;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.AppCompatButton;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.baidu.location.BDLocation;
+import com.baidu.location.LocationClient;
+import com.baidu.location.LocationClientOption;
+import com.baidu.mapapi.map.BaiduMap;
+import com.baidu.mapapi.map.BitmapDescriptor;
+import com.baidu.mapapi.map.BitmapDescriptorFactory;
+import com.baidu.mapapi.map.MapStatus;
+import com.baidu.mapapi.map.MapStatusUpdate;
+import com.baidu.mapapi.map.MapStatusUpdateFactory;
+import com.baidu.mapapi.map.MapView;
+import com.baidu.mapapi.model.LatLng;
+import com.baidu.mapapi.search.core.PoiInfo;
+import com.baidu.mapapi.search.core.SearchResult;
+import com.baidu.mapapi.search.geocode.GeoCodeResult;
+import com.baidu.mapapi.search.geocode.GeoCoder;
+import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
+import com.example.stlink.R;
+import com.example.stlink.configs.adapter.LocationPoiAdapter;
+import com.example.stlink.configs.onRecyclerViewItemClickListener;
+import com.example.stlink.fragments.StuHomeFragment;
+import com.example.stlink.model.constants.ModelFieldConstants;
+import com.example.stlink.utils.MyLocationListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MapActivity extends AppCompatActivity {
+ private MapView mMapView = null;
+ private BaiduMap mBaiduMap = null;
+ private LocationClient mLocationClient = null;
+ BitmapDescriptor bitmap = null;
+
+ private ImageView ivRelocation;
+ private ImageButton abBtReturn;
+ private AppCompatButton abBtSave;
+
+ private MyLocationListener myLocationListener;
+ private BDLocation nowLocation;
+
+ private RecyclerView mRecyclerView;
+ private LocationPoiAdapter adapter;
+ private List mList;
+
+ private Handler myLocationListenerHandler;
+ private Handler locationPoiHandler;
+
+ private onRecyclerViewItemClickListener recyclerViewItemClickListener;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ LocationClient.setAgreePrivacy(true);
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_map);
+
+ initView();
+ }
+
+
+ @Override
+ protected void onResume() {
+ mMapView.onResume();
+ super.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ mMapView.onPause();
+ super.onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ mLocationClient.stop();
+ mBaiduMap.setMyLocationEnabled(false);
+ MyLocationListener.isFirstLocate = true;
+ mMapView.onDestroy();
+ mMapView = null;
+ super.onDestroy();
+ }
+
+ /**
+ * 初始化地图相关
+ */
+ private void initView(){
+ //获取布局相关控件
+ mMapView = findViewById(R.id.b_map_view);
+ ivRelocation = findViewById(R.id.iv_relocation);
+ abBtReturn = findViewById(R.id.ab_bt_return);
+ abBtSave = findViewById(R.id.ab_bt_save);
+ bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.location);
+
+ mRecyclerView= findViewById(R.id.rv_msg);
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+ locationPoiHandler = new Handler(new Handler.Callback() {
+ @SuppressLint("NotifyDataSetChanged")
+ @Override
+ public boolean handleMessage(@NonNull Message msg) {
+ if(msg.arg1 == 1){
+ adapter=new LocationPoiAdapter(MapActivity.this,mList);
+ mRecyclerView.setAdapter(adapter);
+ adapter.notifyDataSetChanged();
+ adapter.setOnItemClickListener(recyclerViewItemClickListener);
+ }
+ return false;
+ }
+ });
+
+ myLocationListenerHandler = new Handler(new Handler.Callback() {
+ @Override
+ public boolean handleMessage(@NonNull Message msg) {
+ nowLocation = myLocationListener.getLocation();
+ if(msg.arg1 == 200 && nowLocation != null){
+ LatLng point = new LatLng(nowLocation.getLatitude(), nowLocation.getLongitude());
+ System.out.println("reverseGeocoding: start!!!!!!!!!!!!");
+ //单次定位结束,销毁定位
+ System.out.println("mBaiduMap:closing................");
+ mLocationClient.stop();
+ //关闭定位图层
+// mBaiduMap.setMyLocationEnabled(false);
+ //开始地理反编码
+ reverseGeocoding(point);
+ }else{
+ System.out.println("mLocationClient : " + mLocationClient.toString());
+ System.out.println("nowLocation : " + nowLocation);
+ }
+ return false;
+ }
+ });
+
+ // 得到地图
+ mBaiduMap = mMapView.getMap();
+ // 开启定位图层
+ mBaiduMap.setMyLocationEnabled(true);
+ //设置默认放大倍数
+ mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(20).build()));
+ mMapView.getMap().setMaxAndMinZoomLevel(21, 19);
+ //定位初始化
+ try {
+ mLocationClient = new LocationClient(MapActivity.this);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ // 隐藏logo
+ View child = mMapView.getChildAt(1);
+ if ((child instanceof ImageView || child instanceof ZoomControls)){
+ child.setVisibility(View.INVISIBLE);
+ }
+ //隐藏放大缩小控件
+ mMapView.showZoomControls(false);
+
+ //通过LocationClientOption设置LocationClient相关参数
+ LocationClientOption locationClientOption = new LocationClientOption();
+ // 可选,设置定位模式,默认高精度 LocationMode.Hight_Accuracy:高精度
+ locationClientOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
+ locationClientOption.setOpenGps(true); // 打开gps
+ locationClientOption.setCoorType("bd09ll"); // 设置坐标类型
+ locationClientOption.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
+ // 可选,设置地址信息
+ locationClientOption.setIsNeedAddress(true);
+ locationClientOption.setIsEnableBeidouMode(true);
+ //可选,设置是否需要地址描述
+ locationClientOption.setIsNeedLocationDescribe(true);
+ //设置locationClientOption
+ mLocationClient.setLocOption(locationClientOption);
+
+ //注册LocationListener监听器, 获取本地定位
+ myLocationListener = new MyLocationListener(mMapView, mBaiduMap, myLocationListenerHandler);
+ mLocationClient.registerLocationListener(myLocationListener);
+ //开启地图定位图层
+ mLocationClient.start();
+
+ //设置其他监听事件
+ setOtherListener();
+ }
+
+
+ /**
+ * 地理反编码
+ * @param point 经纬度
+ */
+ private void reverseGeocoding(LatLng point){
+ //实例化一个地理编码查询对象
+ GeoCoder geoCoder = GeoCoder.newInstance();
+ //设置反地理编码位置坐标
+ ReverseGeoCodeOption op = new ReverseGeoCodeOption();
+ op.location(point);
+ op.pageSize(1);
+ //发起反地理编码请求(经纬度->地址信息)
+ geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
+ @Override
+ public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
+ if (geoCodeResult == null
+ || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
+ Toast.makeText(getApplicationContext(), "没有检测到结果", Toast.LENGTH_SHORT).show();
+ }
+ }
+ @SuppressLint("NotifyDataSetChanged")
+ @Override
+ public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
+ if (reverseGeoCodeResult == null
+ || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
+ Toast.makeText(getApplicationContext(), "没有检测到结果", Toast.LENGTH_SHORT).show();
+ } else {
+ System.out.println("reverseGeocoding: success!!!!!!!!!!!!");
+ reverseGeoCodeResult.getPoiList();
+ mList = (ArrayList) reverseGeoCodeResult.getPoiList();
+ System.out.println("mList : " + mList);
+ Message message = new Message();
+ message.arg1 = 1;
+ //发送消息,将反编码结果刷新到布局上
+ locationPoiHandler.sendMessage(message);
+ }
+ }
+ });
+ geoCoder.reverseGeoCode(op);
+ // 释放实例
+ geoCoder.destroy();
+ }
+
+ /**
+ * 设置点击事件监听
+ */
+ private void setOtherListener(){
+ //重定位
+ ivRelocation.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //点击重定位按钮,启动定位
+ System.out.println("mBaiduMap:starting................");
+ mLocationClient.start();
+ //开启定位图层
+// mBaiduMap.setMyLocationEnabled(true);
+// BDLocation nowLocation = myLocationListener.getLocation();
+// LatLng ll = new LatLng(nowLocation.getLatitude(), nowLocation.getLongitude());
+// MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);
+// mBaiduMap.animateMapStatus(msu);
+ }
+ });
+ abBtReturn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
+ //保存
+ abBtSave.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ nowLocation = myLocationListener.getLocation();
+ String ll = "(" + nowLocation.getLatitude() + "," + nowLocation.getLongitude() + ")";
+ Intent intent = new Intent();
+ Bundle bundle = getIntent().getExtras();
+ bundle.putString(ModelFieldConstants.LOCATION, ll);
+ intent.putExtras(bundle);
+ setResult(100,intent);
+ finish();
+ }
+ });
+ recyclerViewItemClickListener = new onRecyclerViewItemClickListener() {
+ @Override
+ public void onItemClick(RecyclerView parent, View view, int position) {
+ PoiInfo poiInfo = mList.get(position);
+ AlertDialog alertDialog2 = new AlertDialog.Builder(MapActivity.this)
+ .setMessage("签到地点【" + poiInfo.name + "】")
+ .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ Intent intent = new Intent();
+ Bundle bundle = getIntent().getExtras();
+ bundle.putString(ModelFieldConstants.LOCATION, poiInfo.name);
+ intent.putExtras(bundle);
+ setResult(100,intent);
+ finish();
+ }
+ })
+ .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ }
+ })
+ .create();
+ alertDialog2.show();
+ }
+
+ @Override
+ public void onItemLongClick(RecyclerView parent, View view, int position) { }
+ };
+
+ }
+}
+
diff --git a/app/src/main/java/com/example/stlink/activitys/RegisterActivity.java b/app/src/main/java/com/example/stlink/activitys/RegisterActivity.java
new file mode 100644
index 0000000..3dbcdd6
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/activitys/RegisterActivity.java
@@ -0,0 +1,81 @@
+package com.example.stlink.activitys;
+
+import android.os.Bundle;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.stlink.R;
+import com.example.stlink.model.constants.ModelFieldConstants;
+import com.example.stlink.utils.CommonUtils;
+import com.example.stlink.utils.activityUtil.RegisterUtil;
+
+/**
+ * 学生端注册
+ */
+public class RegisterActivity extends AppCompatActivity {
+
+ private TextView tvRgTitle;
+ private ImageView ivRgUserImg;
+ private EditText teaAccount;
+ private EditText teaPwdFirst;
+ private EditText teaPwdSecond;
+ private Button btRegister;
+
+ private Integer roleId;
+ private Bundle bundle;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_register);
+
+ initView();
+ }
+
+ /**
+ * 初始化布局
+ */
+ private void initView(){
+ //修改状态栏字体颜色
+ CommonUtils.changeStatusBar(this);
+
+ teaAccount = findViewById(R.id.id_rg);
+ teaPwdFirst = findViewById(R.id.pwd_rg_first);
+ teaPwdSecond = findViewById(R.id.pwd_rg_second);
+
+ tvRgTitle = findViewById(R.id.tv_rg_title);
+ ivRgUserImg = findViewById(R.id.rg_user_title_img);
+
+ bundle = getIntent().getExtras();
+ roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID);
+
+ if(roleId == 1){
+ tvRgTitle.setText("教师端注册");
+ ivRgUserImg.setImageResource(R.mipmap.teacher);
+ }
+
+
+ btRegister = findViewById(R.id.bt_register);
+
+ setOnClickListener();
+ }
+
+ /**
+ * 为按钮添加点击监听事件
+ */
+ private void setOnClickListener(){
+ //为注册按钮添加点击监听事件
+ RegisterUtil.userRegister(
+ RegisterActivity.this,
+ btRegister,
+ teaAccount,
+ teaPwdFirst,
+ teaPwdSecond
+ );
+ }
+}
diff --git a/app/src/main/java/com/example/stlink/activitys/ScanQRCodeActivity.java b/app/src/main/java/com/example/stlink/activitys/ScanQRCodeActivity.java
new file mode 100644
index 0000000..57bc99b
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/activitys/ScanQRCodeActivity.java
@@ -0,0 +1,22 @@
+package com.example.stlink.activitys;
+
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.stlink.R;
+
+public class ScanQRCodeActivity extends AppCompatActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_scan_code);
+ }
+
+ private void initView(){
+
+ }
+
+}
+
diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuClassList/CourseSignIn.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuClassList/CourseSignIn.java
new file mode 100644
index 0000000..0e4af34
--- /dev/null
+++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuClassList/CourseSignIn.java
@@ -0,0 +1,343 @@
+package com.example.stlink.activitys.fragmentChild.activityStuClassList;
+
+import android.annotation.SuppressLint;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.Editable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.fastjson.JSON;
+import com.example.stlink.R;
+import com.example.stlink.activitys.ScanQRCodeActivity;
+import com.example.stlink.configs.adapter.StuCourseSignedAdapter;
+import com.example.stlink.model.constants.ModelFieldConstants;
+import com.example.stlink.model.constants.UrlConstants;
+import com.example.stlink.model.domain.CourseSign;
+import com.example.stlink.model.request.StuSignRequest;
+import com.example.stlink.model.response.BaseResponse;
+import com.example.stlink.model.response.data.CourseData;
+import com.example.stlink.utils.CommonUtils;
+import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
+import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils;
+import com.google.android.material.textfield.TextInputEditText;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.internal.LinkedTreeMap;
+import com.google.gson.reflect.TypeToken;
+import com.google.zxing.integration.android.IntentIntegrator;
+import com.google.zxing.integration.android.IntentResult;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseSignIn extends AppCompatActivity {
+
+ private ImageView abIvTitle;
+ private TextView tvCreateTimeMsg;
+ private TextView tvSignAddressMsg;
+ private TextView tvCourseName;
+ private Button btSign;
+ private TextView tvSignRecord;
+ private RecyclerView rvStuCourseList;
+
+ private TextInputEditText etCodeInput;
+
+ private static List courseHasSignedList;
+ private static StuCourseSignedAdapter adapter;
+
+ private Handler signHandler;
+ private Handler getSignedHandler;
+ private Bundle bundle;
+
+ private String signCodeStr;
+ private long courseSignId;
+ private long courseId;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_stu_course_sign_in);
+
+ initView();
+ }
+
+ private void initView(){
+ CommonUtils.changeStatusBar(CourseSignIn.this);
+
+ abIvTitle = findViewById(R.id.ab_iv_title);
+ tvCreateTimeMsg = findViewById(R.id.tv_create_time_msg);
+ tvSignAddressMsg = findViewById(R.id.tv_sign_address_msg);
+ tvCourseName = findViewById(R.id.tv_course_name);
+ btSign = findViewById(R.id.bt_sign);
+ tvSignRecord = findViewById(R.id.tv_sign_record);
+ rvStuCourseList = findViewById(R.id.rv_stu_course_list);
+
+ setClickListener();
+
+ refreshData();
+ }
+
+
+ private void refreshData(){
+ bundle = getIntent().getExtras();
+
+ CourseSign courseSign = (CourseSign) bundle.getSerializable(ModelFieldConstants.COURSE_SIGN);
+ System.out.println("CourseSignIn:courseSign = " + courseSign);
+ String courseName = courseSign.getCourseName();
+ String courseAddr = courseSign.getCourseAddr();
+ long courseCreateTimeStamp = courseSign.getCreateTime();
+ courseSignId = courseSign.getUserSignId();
+ courseId = courseSign.getCourseId();
+
+ tvCreateTimeMsg.setText(CommonUtils.stampToDate(String.valueOf(courseCreateTimeStamp), "yyyy-MM-dd hh:mm:ss"));
+ tvSignAddressMsg.setText(courseAddr);
+ tvCourseName.setText(courseName);
+
+ courseHasSignedList = new ArrayList<>();
+ adapter = new StuCourseSignedAdapter(
+ CourseSignIn.this,
+ R.layout.item_stu_signed,
+ courseHasSignedList,
+ 0
+ );
+ LinearLayoutManager llm = new LinearLayoutManager(CourseSignIn.this);
+ rvStuCourseList.setLayoutManager(llm);
+ rvStuCourseList.setAdapter(adapter);
+
+ }
+
+ private void setClickListener(){
+ abIvTitle.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
+ //点击签到后的事件
+ btSign.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ @SuppressLint("InflateParams")
+ View view = LayoutInflater.from(CourseSignIn.this).inflate(R.layout.dialog_input, null);
+ AlertDialog.Builder builder = new AlertDialog.Builder(CourseSignIn.this)
+ .setMessage("请输入签到口令")
+ .setView(view)
+ .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ etCodeInput = view.findViewById(R.id.et_code_input);
+ Editable etSignCode = etCodeInput.getText();
+ if(etSignCode == null){
+ Toast.makeText(CourseSignIn.this, "口令为空", Toast.LENGTH_SHORT).show();
+ }else{
+ signCodeStr = etSignCode.toString();
+ int signCode;
+ StuSignRequest stuSignRequest = new StuSignRequest();
+ stuSignRequest.setUserSignId(courseSignId);
+ stuSignRequest.setUserId(bundle.getLong(ModelFieldConstants.ID));
+ try{
+ signCode = Integer.parseInt(signCodeStr);
+ stuSignRequest.setSignCode(signCode);
+ signHandler = new Handler(new Handler.Callback() {
+ @Override
+ public boolean handleMessage(@NonNull Message msg) {
+ if(msg.arg1 == -1){
+ String errorMsg = (String) msg.obj;
+ Toast.makeText(CourseSignIn.this, errorMsg, Toast.LENGTH_SHORT).show();
+ }else if(msg.arg1 == 1){
+ Toast.makeText(CourseSignIn.this, "签到成功", Toast.LENGTH_SHORT).show();
+ tvSignRecord.setVisibility(View.VISIBLE);
+ getSignedHandler = new Handler(new Handler.Callback() {
+ @SuppressLint("NotifyDataSetChanged")
+ @Override
+ public boolean handleMessage(@NonNull Message msg) {
+ if(msg.arg1 == 1){
+ adapter.notifyDataSetChanged();
+ }
+ return false;
+ }
+ });
+ getHasSignedList();
+ }
+ return false;
+ }
+ });
+ signIn(stuSignRequest);
+ }catch ( NumberFormatException numberFormatException){
+ Toast.makeText(CourseSignIn.this, "口令输入错误", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ })
+ .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ }
+ })
+ .setNeutralButton("扫码", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // TODO 扫码签到
+// Intent intent = new Intent(CourseSignIn.this, ScanQRCodeActivity.class);
+// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+// startActivity(intent);
+ // 创建IntentIntegrator对象
+ IntentIntegrator intentIntegrator = new IntentIntegrator(CourseSignIn.this)
+ .setBeepEnabled(true) //扫描提示音
+ .setPrompt("这是个扫码签到界面")
+ //.setCaptureActivity(MyCaptureActivity.class) //修改扫码活动
+ .setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)// 扫码的类型,可选:一维码,二维码,一/二维码
+ .setTimeout(10000);//15秒未扫描,则将自动关闭扫码界面
+ // 开始扫描
+ intentIntegrator.initiateScan();
+ }
+ });
+ AlertDialog alertDialog2 = builder.create();
+ alertDialog2.show();
+ }
+ });
+ }
+
+ /**
+ * 获取已选课程待签到内容
+ */
+ private void getHasSignedList(){
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ bundle = getIntent().getExtras();
+ String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
+ ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID) + "&" +
+ ModelFieldConstants.COURSE_SIGN_STATUS + "=" + 1 + "&" +
+ "current=1&size=10";
+ String url = UrlConstants.STUDENT_SIGN_LIST + "?" + urlParam;
+ new GetUrlParamHttpUtils() {
+ @Override
+ public void nextMethod(BaseResponse