From 05d90004c120c5b597565bc99c7d3b85f15a4e73 Mon Sep 17 00:00:00 2001
From: Administrator <123>
Date: Fri, 05 Nov 2021 06:47:38 +0000
Subject: [PATCH] 短信验证码 倒计时 大厅顶部 UI

---
 app/src/main/res/layout/hall_item_top.xml                               |   57 ++++++++++++++
 app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java  |   37 +++++++--
 app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java |   32 +++++++
 app/src/main/res/layout/fragment_sub_hall.xml                           |   65 ++++++++++++++-
 app/build.gradle                                                        |    8 +
 5 files changed, 181 insertions(+), 18 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 79380c7..ae21812 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -33,7 +33,7 @@
 dependencies {
 
     implementation 'androidx.appcompat:appcompat:1.2.0'
-    implementation 'com.google.android.material:material: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'
@@ -52,7 +52,9 @@
     implementation 'com.squareup.retrofit2:retrofit:2.3.0'
     //RXjava和retrofit结合
     implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
-    implementation 'com.google.android.material:material:1.4.0'
     implementation 'com.github.bumptech.glide:glide:4.12.0'
-    implementation 'com.permissionx.guolindev:permissionx:1.2.2'    //权限依赖
+    implementation 'com.permissionx.guolindev:permissionx:1.2.2'    //权限依赖让你推广你就发群里?没有别的群了?
+    implementation 'com.github.bumptech.glide:glide:4.12.0'
+    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java b/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java
index f1356e0..896d934 100644
--- a/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java
+++ b/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java
@@ -16,6 +16,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModelProvider;
 
 import com.duqing.missions.R;
 import com.duqing.missions.base.activities.BaseTitleBarActivity;
@@ -28,11 +29,9 @@
     @Override
     public void initViews() {
 
-
         final EditText phoneEdit = binding.editPhone;
         final EditText passwordEditText = binding.editPassword;
         final Button loginButton = binding.login;
-
 
         viewModel.getLoginFormState().observe(this, new Observer<LoginFormState>() {
             @Override
@@ -49,7 +48,6 @@
                 }
             }
         });
-
         viewModel.getLoginResult().observe(this, new Observer<LoginResult>() {
             @Override
             public void onChanged(@Nullable LoginResult loginResult) {
@@ -68,7 +66,6 @@
                 finish();
             }
         });
-
         binding.txtPasswordTitle.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -78,7 +75,6 @@
                 unCheckStyle(binding.txtVerifyTitle);
             }
         });
-
         binding.txtVerifyTitle.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -88,7 +84,6 @@
                 unCheckStyle(binding.txtPasswordTitle);
             }
         });
-
         TextWatcher afterTextChangedListener = new TextWatcher() {
             @Override
             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -109,7 +104,6 @@
         phoneEdit.addTextChangedListener(afterTextChangedListener);
         passwordEditText.addTextChangedListener(afterTextChangedListener);
         passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
-
             @Override
             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                 if (actionId == EditorInfo.IME_ACTION_DONE) {
@@ -119,7 +113,6 @@
                 return false;
             }
         });
-
         loginButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -127,6 +120,34 @@
                         passwordEditText.getText().toString());
             }
         });
+
+        viewModel.getCountDown().observe(this, new Observer<Long>() {
+            @Override
+            public void onChanged(Long l) {
+                if(l>0){
+                    binding.textVerify.setTextColor(getResources().getColor(R.color.gray));
+                    binding.textVerify.setEnabled(false);
+                    binding.textVerify.setText("重新发送("+l+"s)");
+                }else{
+                    binding.textVerify.setEnabled(true);
+                    binding.textVerify.setTextColor(getResources().getColor(R.color.sky));
+                    binding.textVerify.setText("获取验证码");
+                }
+            }
+        });
+
+        binding.textVerify.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                viewModel.startCountDown(0);
+            }
+        });
+
+    }
+
+    @Override
+    public ViewModelProvider.Factory getViewModelFactory() {
+        return new LoginViewModelFactory();
     }
 
     public void checkedStyle(TextView textView){
diff --git a/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java b/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java
index 63f177a..d963549 100644
--- a/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java
+++ b/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java
@@ -1,5 +1,6 @@
 package com.duqing.missions.ui.login.view;
 
+import android.os.CountDownTimer;
 import android.util.Patterns;
 
 import androidx.lifecycle.LiveData;
@@ -20,6 +21,8 @@
     private MutableLiveData<LoginFormState> loginFormState = new MutableLiveData<>();
     private MutableLiveData<LoginResult> loginResult = new MutableLiveData<>();
     private LoginRepository loginRepository;
+    private MutableLiveData<Long> countDown = new MutableLiveData<>();
+    private CountDownTimer timer;
 
     LoginViewModel(LoginRepository loginRepository) {
         this.loginRepository = loginRepository;
@@ -86,4 +89,31 @@
     private boolean isPasswordValid(String password) {
         return password != null && password.trim().length() > 5;
     }
-}
\ No newline at end of file
+
+    public MutableLiveData<Long> getCountDown() {
+        return countDown;
+    }
+
+    /**
+     * 启动倒计时
+     * @param consumedTime
+     */
+    public void startCountDown(long consumedTime){
+        //倒计时
+        timer = new CountDownTimer(60 * 1000-consumedTime, 1000) {
+
+            @Override
+            public void onTick(long l) {
+                countDown.postValue(l / 1000);
+            }
+
+            @Override
+            public void onFinish() {
+                countDown.setValue(0l);
+            }
+        };
+        timer.start();
+    }
+
+
+}
diff --git a/app/src/main/res/layout/fragment_sub_hall.xml b/app/src/main/res/layout/fragment_sub_hall.xml
index 2b892d9..35b39a1 100644
--- a/app/src/main/res/layout/fragment_sub_hall.xml
+++ b/app/src/main/res/layout/fragment_sub_hall.xml
@@ -63,18 +63,71 @@
         app:layout_constraintHorizontal_weight="1"
         app:layout_constraintHorizontal_chainStyle="spread" />
 
-    <View
-        android:id="@+id/view"
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/layout"
         android:layout_width="match_parent"
-        android:layout_height="0.5dp"
-        android:background="@color/gray"
+        android:layout_height="wrap_content"
+        android:background="@drawable/bg_white_corner"
+        android:elevation="@dimen/small_radios"
+        android:layout_margin="@dimen/activity_horizontal_margin"
+        android:padding="@dimen/frame_margin_lr"
         app:layout_constraintTop_toBottomOf="@id/radio_group"
         app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"/>
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/include_refresh_recycler">
+
+
+        <include layout="@layout/hall_item_top"
+            android:id="@+id/layout_left"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toLeftOf="@id/layout_between"/>
+        <include layout="@layout/hall_item_top"
+            android:id="@+id/layout_between"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toRightOf="@id/layout_left"
+            app:layout_constraintRight_toLeftOf="@id/layout_right"
+            />
+        <include layout="@layout/hall_item_top"
+            android:id="@+id/layout_right"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toRightOf="@id/layout_between"
+            app:layout_constraintRight_toRightOf="parent"/>
+
+        <View
+            android:layout_width="0.5dp"
+            android:layout_height="0dp"
+            android:background="@color/gray"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toRightOf="@id/layout_left" />
+
+        <View
+            android:layout_width="0.5dp"
+            android:layout_height="0dp"
+            android:background="@color/gray"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toRightOf="@id/layout_between" />
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
     <include layout="@layout/refresh_recycler"
         android:id="@+id/include_refresh_recycler"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        app:layout_constraintTop_toBottomOf="@id/view"
+        app:layout_constraintTop_toBottomOf="@id/layout"
         app:layout_constraintBottom_toBottomOf="parent"/>
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/hall_item_top.xml b/app/src/main/res/layout/hall_item_top.xml
new file mode 100644
index 0000000..534bed3
--- /dev/null
+++ b/app/src/main/res/layout/hall_item_top.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/image_avatar"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:layout_marginTop="@dimen/frame_margin_lr"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/text_title"
+        tools:srcCompat="@tools:sample/avatars" />
+
+    <TextView
+        android:id="@+id/text_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="TextView"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:maxLines="1"
+        android:textSize="16sp"
+        android:textColor="@color/black"
+        android:layout_marginTop="@dimen/frame_margin_lr"
+        app:layout_constraintBottom_toTopOf="@id/text_label"
+        app:layout_constraintTop_toBottomOf="@id/image_avatar"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+    <TextView
+        android:id="@+id/text_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="TextView"
+        android:layout_marginTop="@dimen/frame_margin_lr"
+        app:layout_constraintBottom_toTopOf="@id/text_price"
+        app:layout_constraintTop_toBottomOf="@id/text_title"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+    <TextView
+        android:id="@+id/text_price"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="+0.00"
+        android:textColor="@color/red"
+        android:textSize="16sp"
+        android:layout_marginTop="@dimen/frame_margin_lr"
+        app:layout_constraintTop_toBottomOf="@id/text_label"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file

--
Gitblit v1.9.1