Browse Source

完善评分弹窗流程

zk 1 year ago
parent
commit
b71c75214f

BIN
app/src/main/assets/anim/anim_scoring_normal.zip


+ 74 - 34
app/src/main/java/com/atmob/voiceai/dialog/ScoringDialog.java

@@ -2,10 +2,15 @@ package com.atmob.voiceai.dialog;
 
 
 import android.content.Context;
+import android.content.DialogInterface;
 import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.view.View;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieAnimationView;
 import com.atmob.app.lib.base.BaseDialog;
@@ -15,7 +20,9 @@ import com.atmob.voiceai.databinding.DialogScoringBinding;
 import com.atmob.voiceai.handlers.EventHandler;
 import com.atmob.voiceai.utils.AppUtil;
 import com.atmob.voiceai.utils.ScoringUtils;
+import com.atmob.voiceai.utils.ToastUtil;
 
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 import atmob.reactivex.rxjava3.disposables.Disposable;
@@ -34,22 +41,24 @@ public class ScoringDialog extends BaseDialog<DialogScoringBinding> {
 
     private int starsNum;
 
+    private ScoringDialogListener scoringDialogListener;
+
     public ScoringDialog(@NonNull Context context) {
         super(context, R.style.Theme_Common_Dialog);
         setCancelable(false);
         stars = new LottieAnimationView[]{
-//                binding.scoringStar1,
-//                binding.scoringStar2,
-//                binding.scoringStar3,
-//                binding.scoringStar4,
-//                binding.scoringStar5
+                binding.scoringStar1,
+                binding.scoringStar2,
+                binding.scoringStar3,
+                binding.scoringStar4,
+                binding.scoringStar5
         };
         binding.setOnStarClickListener(v -> {
             starsNum = getStars(v);
             Bundle bundle = new Bundle();
             bundle.putInt("stars", starsNum);
             EventHandler.report(EventId.ratestarnub_001, bundle);
-            binding.setShowFeedback(starsNum <= 3);
+            binding.setShowAdvice(starsNum <= 3);
             starAnim(starsNum, () -> {
                 if (starsNum > 3) {
                     requestGoogleStoreScoring();
@@ -61,51 +70,78 @@ public class ScoringDialog extends BaseDialog<DialogScoringBinding> {
             dismiss();
         });
         binding.setOnSubmitClickListener(v -> {
+            if (TextUtils.isEmpty(binding.etScoringAdvice.getText())) {
+                ToastUtil.show(R.string.scoring_advice_hint, ToastUtil.LENGTH_SHORT);
+                return;
+            }
             Bundle bundle = new Bundle();
             bundle.putInt("stars", starsNum);
-//            bundle.putString("feedback", binding.feedback.getText().toString());
+            bundle.putString("feedback", Objects.toString(binding.etScoringAdvice.getText()));
             EventHandler.report(EventId.ratebadsubmit_001, bundle);
+            ToastUtil.show(R.string.thanks_feedback, ToastUtil.LENGTH_SHORT);
             showFeedbackSuccess();
         });
+        binding.etScoringAdvice.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                String str = s.length() + "/200";
+                binding.tvScoringAdviceCount.setText(str);
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+
+            }
+        });
+    }
+
+
+    public void setScoringDialogListener(ScoringDialogListener scoringDialogListener) {
+        this.scoringDialogListener = scoringDialogListener;
     }
 
     private void requestGoogleStoreScoring() {
         if (AppUtil.isAppExist(AppUtil.GooglePlay)) {
             AppUtil.launchGooglePlayDetail(getContext().getPackageName());
-            dismiss();
         }
         showFeedbackSuccess();
     }
 
     private void showFeedbackSuccess() {
+        dismiss();
         ScoringUtils.isScoringSuccess();
+        if (scoringDialogListener != null) {
+            scoringDialogListener.onScoringSuccess();
+        }
     }
 
+
     private int getStars(View v) {
         int id = v.getId();
-//        if (id == R.id.scoring_star_1) {
-//            return 1;
-//        } else if (id == R.id.scoring_star_2) {
-//            return 2;
-//        } else if (id == R.id.scoring_star_3) {
-//            return 3;
-//        } else if (id == R.id.scoring_star_4) {
-//            return 4;
-//        } else if (id == R.id.scoring_star_5) {
-//            return 5;
-//        }
+        if (id == R.id.scoring_star_1) {
+            return 1;
+        } else if (id == R.id.scoring_star_2) {
+            return 2;
+        } else if (id == R.id.scoring_star_3) {
+            return 3;
+        } else if (id == R.id.scoring_star_4) {
+            return 4;
+        } else if (id == R.id.scoring_star_5) {
+            return 5;
+        }
         return 5;
     }
 
-    @Override
-    public void show() {
-        binding.setShowFeedback(false);
-        super.show();
-    }
 
     @Override
     protected void onDismiss() {
         super.onDismiss();
+        binding.setShowAdvice(false);
         if (startAnimInterval != null) {
             startAnimInterval.dispose();
         }
@@ -125,16 +161,16 @@ public class ScoringDialog extends BaseDialog<DialogScoringBinding> {
             startAnimInterval.dispose();
             resetStar();
         }
-//        startAnimInterval = RxJavaUtil.interval(0, STAR_ANIM_PERIOD,
-//                stars * (STAR_ANIM_PERIOD - 1) + binding.scoringStar5.getDuration(), TimeUnit.MILLISECONDS, index -> {
-//                    if (index < stars && index < this.stars.length) {
-//                        this.stars[Math.toIntExact(index)].playAnimation();
-//                    }
-//                }, () -> {
-//                    if (onComplete != null) {
-//                        onComplete.run();
-//                    }
-//                });
+        startAnimInterval = RxJavaUtil.interval(0, STAR_ANIM_PERIOD,
+                stars * (STAR_ANIM_PERIOD - 1) + binding.scoringStar5.getDuration(), TimeUnit.MILLISECONDS, index -> {
+                    if (index < stars && index < this.stars.length) {
+                        this.stars[Math.toIntExact(index)].playAnimation();
+                    }
+                }, () -> {
+                    if (onComplete != null) {
+                        onComplete.run();
+                    }
+                });
     }
 
     private void resetStar() {
@@ -143,4 +179,8 @@ public class ScoringDialog extends BaseDialog<DialogScoringBinding> {
             star.setProgress(0);
         }
     }
+
+    public interface ScoringDialogListener {
+        void onScoringSuccess();
+    }
 }

+ 4 - 2
app/src/main/java/com/atmob/voiceai/module/result/VoiceResultViewModel.java

@@ -108,8 +108,10 @@ public class VoiceResultViewModel extends BaseViewModel {
             return;
         }
         addDisposable(RxJavaUtil.timer(5, TimeUnit.SECONDS, () -> {
-            isCanShowScoring = false;
-            showScoringEvent.call();
+            if (isCanShowScoring) {
+                isCanShowScoring = false;
+                showScoringEvent.call();
+            }
         }));
     }
 

+ 1 - 0
app/src/main/java/com/atmob/voiceai/module/setting/SettingActivity.java

@@ -91,6 +91,7 @@ public class SettingActivity extends BaseActivity<SettingActivityBinding> {
     private void showScoringDialog() {
         if (scoringDialog == null) {
             scoringDialog = new ScoringDialog(this);
+            scoringDialog.setScoringDialogListener(() -> settingViewModel.setHideScoring());
         }
         scoringDialog.show();
     }

+ 5 - 0
app/src/main/java/com/atmob/voiceai/module/setting/SettingViewModel.java

@@ -66,6 +66,11 @@ public class SettingViewModel extends BaseViewModel {
         return versionName;
     }
 
+
+    public void setHideScoring() {
+        isHideScoring.setValue(true);
+    }
+
     public void onSettingProClick() {
         EventHandler.report(EventId.settingpro_001);
         SubscriptionPageActivity.start(ActivityUtil.getTopActivity());

BIN
app/src/main/res/drawable-xxhdpi/icon_scoring_close.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scoring_header_img.webp


+ 8 - 0
app/src/main/res/drawable/bg_scoring_edit.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="8dp" />
+    <solid android:color="#46474F" />
+    <stroke
+        android:width="1dp"
+        android:color="#585960" />
+</shape>

+ 262 - 25
app/src/main/res/layout/dialog_scoring.xml

@@ -5,7 +5,7 @@
     <data>
 
         <variable
-            name="showFeedback"
+            name="showAdvice"
             type="Boolean" />
 
 
@@ -26,32 +26,269 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
-        <View
-            android:id="@+id/v_scoring_bg"
-            android:background="@drawable/bg_scoring_dialog"
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
             app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintWidth_percent="0.8333333333333333"
-            app:layout_constraintDimensionRatio="3:4"
-            android:layout_width="0dp"
-            android:layout_height="0dp" />
-
-
-        <TextView
-            android:gravity="center"
-            android:text="@string/scoring_submit"
-            app:layout_constraintVertical_bias="0.9120879120879121"
-            android:background="@drawable/bg_voice_ai_btn"
-            app:layout_constraintWidth_percent="0.7111111111111111"
-            app:layout_constraintDimensionRatio="256:36"
-            app:layout_constraintStart_toStartOf="@+id/v_scoring_bg"
-            app:layout_constraintEnd_toEndOf="@+id/v_scoring_bg"
-            app:layout_constraintBottom_toBottomOf="@+id/v_scoring_bg"
-            app:layout_constraintTop_toTopOf="@+id/v_scoring_bg"
-            android:layout_width="0dp"
-            android:layout_height="0dp" />
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <View
+                android:id="@+id/v_scoring_bg"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:background="@drawable/bg_scoring_dialog"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintWidth_percent="0.8333333333333333" />
+
+            <Space
+                android:id="@id/space1"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:64"
+                app:layout_constraintTop_toTopOf="@id/v_scoring_bg" />
+
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_margin="16dp"
+                android:onClick="@{onCloseClickListener}"
+                android:src="@drawable/icon_recording_close"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintEnd_toEndOf="@id/v_scoring_bg"
+                app:layout_constraintTop_toTopOf="@id/v_scoring_bg"
+                app:layout_constraintWidth_percent="0.0666666666666667" />
+
+            <ImageView
+                android:id="@+id/iv_scoring_header_img"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:src="@drawable/icon_scoring_header_img"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintEnd_toEndOf="@+id/v_scoring_bg"
+                app:layout_constraintStart_toStartOf="@id/v_scoring_bg"
+                app:layout_constraintTop_toBottomOf="@id/space1"
+                app:layout_constraintWidth_percent="0.1888888888888889" />
+
+            <Space
+                android:id="@id/space2"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:9"
+                app:layout_constraintTop_toBottomOf="@id/iv_scoring_header_img" />
+
+            <Space
+                android:id="@id/space3"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:24"
+                app:layout_constraintTop_toBottomOf="@id/space2" />
+
+            <TextView
+                android:id="@+id/tv_scoring_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/scoring_title"
+                android:textColor="@color/white"
+                android:textSize="20sp"
+                android:textStyle="bold"
+                app:layout_constraintEnd_toEndOf="@id/v_scoring_bg"
+                app:layout_constraintStart_toStartOf="@id/v_scoring_bg"
+                app:layout_constraintTop_toBottomOf="@+id/space3" />
+
+            <Space
+                android:id="@id/space4"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:12"
+                app:layout_constraintTop_toBottomOf="@+id/tv_scoring_title" />
+
+            <TextView
+                android:id="@+id/tv_scoring_content"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="@string/scoring_content"
+                android:textColor="@color/white60"
+                android:textSize="14sp"
+                app:layout_constraintEnd_toEndOf="@+id/v_scoring_bg"
+                app:layout_constraintStart_toStartOf="@+id/v_scoring_bg"
+                app:layout_constraintTop_toBottomOf="@+id/space4"
+                app:layout_constraintWidth_percent="0.7416666666666667" />
+
+            <Space
+                android:id="@id/space5"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:20"
+                app:layout_constraintTop_toBottomOf="@+id/tv_scoring_content" />
+
+            <com.airbnb.lottie.LottieAnimationView
+                android:id="@+id/scoring_star_1"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:onClickListener="@{onStarClickListener}"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintHorizontal_chainStyle="packed"
+                app:layout_constraintLeft_toLeftOf="@id/v_scoring_bg"
+                app:layout_constraintRight_toLeftOf="@id/scoring_star_2"
+                app:layout_constraintTop_toBottomOf="@+id/space5"
+                app:layout_constraintWidth_percent="0.1111111111111111"
+                app:lottie_fileName="anim/anim_scoring_normal.zip" />
+
+            <com.airbnb.lottie.LottieAnimationView
+                android:id="@+id/scoring_star_2"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_marginStart="8dp"
+                android:onClickListener="@{onStarClickListener}"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintLeft_toRightOf="@id/scoring_star_1"
+                app:layout_constraintRight_toLeftOf="@id/scoring_star_3"
+                app:layout_constraintTop_toTopOf="@+id/scoring_star_1"
+                app:layout_constraintWidth_percent="0.1111111111111111"
+                app:lottie_fileName="anim/anim_scoring_normal.zip" />
+
+            <com.airbnb.lottie.LottieAnimationView
+                android:id="@+id/scoring_star_3"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_marginStart="8dp"
+                android:onClickListener="@{onStarClickListener}"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintLeft_toRightOf="@id/scoring_star_2"
+                app:layout_constraintRight_toLeftOf="@id/scoring_star_4"
+                app:layout_constraintTop_toTopOf="@+id/scoring_star_1"
+                app:layout_constraintWidth_percent="0.1111111111111111"
+                app:lottie_fileName="anim/anim_scoring_normal.zip" />
+
+            <com.airbnb.lottie.LottieAnimationView
+                android:id="@+id/scoring_star_4"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_marginStart="8dp"
+                android:onClickListener="@{onStarClickListener}"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintLeft_toRightOf="@id/scoring_star_3"
+                app:layout_constraintRight_toLeftOf="@id/scoring_star_5"
+                app:layout_constraintTop_toTopOf="@+id/scoring_star_1"
+                app:layout_constraintWidth_percent="0.1111111111111111"
+                app:lottie_fileName="anim/anim_scoring_normal.zip" />
+
+            <com.airbnb.lottie.LottieAnimationView
+                android:id="@+id/scoring_star_5"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_marginStart="8dp"
+                android:onClickListener="@{onStarClickListener}"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintLeft_toRightOf="@id/scoring_star_4"
+                app:layout_constraintRight_toRightOf="@id/v_scoring_bg"
+                app:layout_constraintTop_toTopOf="@+id/scoring_star_1"
+                app:layout_constraintWidth_percent="0.1111111111111111"
+                app:lottie_fileName="anim/anim_scoring_normal.zip" />
+
+
+            <Space
+                android:id="@+id/space6"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:30"
+                app:layout_constraintTop_toBottomOf="@+id/scoring_star_1" />
+
+
+            <Space
+                android:id="@+id/space7"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:26"
+                app:layout_constraintTop_toBottomOf="@+id/space6" />
+
+
+            <com.atmob.voiceai.widget.IgnoreNoEnterActionEditText
+                android:id="@+id/et_scoring_advice"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:background="@drawable/bg_scoring_edit"
+                android:gravity="start"
+                android:hint="@string/scoring_advice_hint"
+                android:maxLength="200"
+                android:paddingHorizontal="8dp"
+                android:paddingVertical="10dp"
+                android:textColor="@color/white"
+                android:textColorHint="@color/white20"
+                android:textSize="14sp"
+                app:layout_constraintDimensionRatio="266:120"
+                app:layout_constraintEnd_toEndOf="@+id/v_scoring_bg"
+                app:layout_constraintStart_toStartOf="@id/v_scoring_bg"
+                app:layout_constraintTop_toBottomOf="@+id/space7"
+                app:layout_constraintWidth_percent="0.7388888888888889" />
+
+            <TextView
+                android:id="@+id/tv_scoring_advice_count"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="12dp"
+                android:layout_marginBottom="10dp"
+                android:text="0/200"
+                android:textColor="@color/white50"
+                android:textSize="14sp"
+                app:layout_constraintBottom_toBottomOf="@+id/et_scoring_advice"
+                app:layout_constraintEnd_toEndOf="@+id/et_scoring_advice" />
+
+            <Space
+                android:id="@+id/space8"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:31"
+                app:layout_constraintTop_toBottomOf="@+id/et_scoring_advice" />
+
+
+            <TextView
+                android:id="@+id/tv_scoring_submit"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:background="@drawable/bg_voice_ai_btn"
+                android:gravity="center"
+                android:text="@string/scoring_submit"
+                android:textColor="@color/colorPrimary"
+                android:textSize="15sp"
+                android:onClick="@{onSubmitClickListener}"
+                android:textStyle="bold"
+                app:layout_constraintDimensionRatio="256:36"
+                app:layout_constraintEnd_toEndOf="@+id/v_scoring_bg"
+                app:layout_constraintStart_toStartOf="@+id/v_scoring_bg"
+                app:layout_constraintTop_toBottomOf="@+id/space8"
+                app:layout_constraintWidth_percent="0.7111111111111111" />
+
+            <Space
+                android:id="@+id/space9"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                app:layout_constraintDimensionRatio="360:27"
+                app:layout_constraintTop_toBottomOf="@+id/tv_scoring_submit" />
+
+
+            <androidx.constraintlayout.widget.Group
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:constraint_referenced_ids="space2,et_scoring_advice,tv_scoring_advice_count,space8,tv_scoring_submit,space9"
+                app:isGone="@{!showAdvice}" />
+
+            <androidx.constraintlayout.widget.Group
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:constraint_referenced_ids="space6"
+                app:isGone="@{showAdvice}" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -117,4 +117,8 @@
     <string name="query_order_status_loading_txt">Processing</string>
     <string name="query_order_time_out">Network abnormality, please click to restore</string>
     <string name="scoring_submit">Submit</string>
+    <string name="scoring_title">Please rate our app</string>
+    <string name="scoring_content">We are working hard for better user experience.Please take a minute to rate us.</string>
+    <string name="scoring_advice_hint">Enter your advice</string>
+    <string name="thanks_feedback">Submit success</string>
 </resources>