Browse Source

[1001699]增加意见反馈

zk 1 year ago
parent
commit
0a398d8775

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -44,6 +44,9 @@
         <activity
             android:name=".module.browser.BrowserActivity"
             android:screenOrientation="portrait" />
+        <activity
+            android:name=".module.feedback.UserFeedbackActivity"
+            android:screenOrientation="portrait" />
 
     </application>
 

+ 0 - 1
app/src/main/java/com/datarecovery/master/module/about/AboutActivity.java

@@ -8,7 +8,6 @@ import android.os.Bundle;
 import androidx.annotation.NonNull;
 
 import com.atmob.app.lib.base.BaseActivity;
-import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.databinding.ActivityAboutBinding;
 import com.datarecovery.master.module.browser.BrowserActivity;

+ 70 - 0
app/src/main/java/com/datarecovery/master/module/feedback/UserFeedbackActivity.java

@@ -0,0 +1,70 @@
+package com.datarecovery.master.module.feedback;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.atmob.app.lib.base.BaseActivity;
+import com.datarecovery.master.databinding.ActivityUserFeedbackBinding;
+import com.gyf.immersionbar.ImmersionBar;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+
+/**
+ * 用户反馈
+ */
+@AndroidEntryPoint
+public class UserFeedbackActivity extends BaseActivity<ActivityUserFeedbackBinding> {
+
+
+    private UserFeedbackViewModel userFeedbackViewModel;
+
+
+    public static void start(Context context) {
+        Intent intent = new Intent(context, UserFeedbackActivity.class);
+        if (!(context instanceof Activity)) {
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+        context.startActivity(intent);
+    }
+
+
+    @Override
+    protected boolean shouldImmersion() {
+        return true;
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initView();
+        initObserver();
+    }
+
+    private void initView() {
+        addTopStatusBarHeight(binding.toolBar);
+        binding.toolBar.setNavigationOnClickListener(v -> onBackPressed());
+    }
+
+    private void initObserver() {
+        userFeedbackViewModel.getFinishEvent().observe(this, o -> onBackPressed());
+    }
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(true);
+    }
+
+
+    @Override
+    protected void initViewModel() {
+        super.initViewModel();
+        userFeedbackViewModel = getViewModelProvider().get(UserFeedbackViewModel.class);
+        binding.setFeedbackViewModel(userFeedbackViewModel);
+    }
+}

+ 49 - 0
app/src/main/java/com/datarecovery/master/module/feedback/UserFeedbackViewModel.java

@@ -0,0 +1,49 @@
+package com.datarecovery.master.module.feedback;
+
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import com.atmob.app.lib.base.BaseViewModel;
+import com.atmob.app.lib.livedata.SingleLiveEvent;
+import com.datarecovery.master.R;
+import com.datarecovery.master.utils.ToastUtil;
+
+import javax.inject.Inject;
+
+import dagger.hilt.android.lifecycle.HiltViewModel;
+
+
+@HiltViewModel
+public class UserFeedbackViewModel extends BaseViewModel {
+
+
+    private final MutableLiveData<String> etContent = new MutableLiveData<>();
+
+    private final SingleLiveEvent<?> finishEvent = new SingleLiveEvent<>();
+
+
+    @Inject
+    public UserFeedbackViewModel() {
+
+    }
+
+    public LiveData<?> getFinishEvent() {
+        return finishEvent;
+    }
+
+    public MutableLiveData<String> getEtContent() {
+        return etContent;
+    }
+
+
+    public void submitClick() {
+        if (etContent.getValue() == null || etContent.getValue().isEmpty()) {
+            ToastUtil.show(R.string.feedback_hint, ToastUtil.LENGTH_SHORT);
+            return;
+        }
+        ToastUtil.show(R.string.feed_back_success, ToastUtil.LENGTH_SHORT);
+        finishEvent.call();
+    }
+
+
+}

+ 0 - 1
app/src/main/java/com/datarecovery/master/module/mine/MineFragment.java

@@ -20,7 +20,6 @@ public class MineFragment extends BaseFragment<FragmentMineBinding> {
 
 
     private MineViewModel mineViewModel;
-
     private CommonSureDialog exitDialog;
     private CommonSureDialog logoutDialog;
 

+ 5 - 0
app/src/main/java/com/datarecovery/master/module/mine/MineViewModel.java

@@ -12,6 +12,7 @@ import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.repositories.AccountRepository;
 import com.datarecovery.master.module.about.AboutActivity;
+import com.datarecovery.master.module.feedback.UserFeedbackActivity;
 
 import javax.inject.Inject;
 
@@ -80,4 +81,8 @@ public class MineViewModel extends BaseViewModel {
     public void onAccountLogout() {
 
     }
+
+    public void onFeedbackClick() {
+        UserFeedbackActivity.start(ActivityUtil.getTopActivity());
+    }
 }

+ 61 - 0
app/src/main/java/com/datarecovery/master/widget/IgnoreNoEnterActionEditText.java

@@ -0,0 +1,61 @@
+package com.datarecovery.master.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatEditText;
+
+public class IgnoreNoEnterActionEditText extends AppCompatEditText {
+    public IgnoreNoEnterActionEditText(@NonNull Context context) {
+        super(context);
+    }
+
+    public IgnoreNoEnterActionEditText(@NonNull Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public IgnoreNoEnterActionEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    public InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
+        InputConnection conn = super.onCreateInputConnection(outAttrs);
+        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
+        return conn;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        final int action = event.getActionMasked();
+        if (action == MotionEvent.ACTION_DOWN) {
+            getParent().requestDisallowInterceptTouchEvent(true);
+        } else if (action == MotionEvent.ACTION_MOVE) {
+            getParent().requestDisallowInterceptTouchEvent(canVerticalScroll());
+        } else if (action == MotionEvent.ACTION_UP) {
+            getParent().requestDisallowInterceptTouchEvent(false);
+        }
+        return super.onTouchEvent(event);
+    }
+
+    private boolean canVerticalScroll() {
+        //滚动的距离
+        int scrollY = getScrollY();
+        //控件内容的总高度
+        int scrollRange = getLayout().getHeight();
+        //控件实际显示的高度
+        int scrollExtent = getHeight() - getCompoundPaddingTop() - getCompoundPaddingBottom();
+        //控件内容总高度与实际显示高度的差值
+        int scrollDifference = scrollRange - scrollExtent;
+
+        if (scrollDifference == 0) {
+            return false;
+        }
+        return (scrollY > 0) || (scrollY < scrollDifference - 1);
+    }
+}

+ 5 - 0
app/src/main/res/drawable/feedback_print_bg.xml

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

+ 2 - 7
app/src/main/res/layout/activity_about.xml

@@ -28,13 +28,8 @@
             app:navigationIcon="@drawable/icon_back">
 
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:text="@string/mine_about"
-                android:textColor="@color/common_txt_color"
-                android:textSize="17sp"
-                android:textStyle="bold" />
+                style="@style/Tool_Bar_Title_Txt"
+                android:text="@string/mine_about" />
 
         </androidx.appcompat.widget.Toolbar>
 

+ 108 - 0
app/src/main/res/layout/activity_user_feedback.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout 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">
+
+    <data>
+
+        <variable
+            name="feedbackViewModel"
+            type="com.datarecovery.master.module.feedback.UserFeedbackViewModel" />
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#F8F8F8">
+
+        <androidx.appcompat.widget.Toolbar
+            android:id="@+id/tool_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/white"
+            app:layout_constraintTop_toTopOf="parent"
+            app:navigationIcon="@drawable/icon_back">
+
+            <TextView
+                style="@style/Tool_Bar_Title_Txt"
+                android:text="@string/feedback_title" />
+        </androidx.appcompat.widget.Toolbar>
+
+
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="12dp"
+            android:layout_marginTop="16dp"
+            android:text="@string/feedback_content_title"
+            android:textColor="@color/common_txt_color"
+            android:textSize="17sp"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tool_bar" />
+
+        <com.datarecovery.master.widget.IgnoreNoEnterActionEditText
+            android:id="@+id/et_suggestion"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginTop="12dp"
+            android:background="@drawable/feedback_print_bg"
+            android:gravity="start"
+            android:hint="@string/feedback_hint"
+            android:imeOptions="actionDone"
+            android:inputType="textMultiLine"
+            android:lineSpacingMultiplier="1.1"
+            android:maxLength="500"
+            android:padding="16dp"
+            android:text="@={feedbackViewModel.etContent}"
+            android:textColor="@color/common_txt_color"
+            android:textColorHint="#A7A7A7"
+            android:textSize="15sp"
+            app:layout_constraintDimensionRatio="336:270"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tv_title"
+            app:layout_constraintWidth_percent="0.9333333333333333" />
+
+
+        <TextView
+            android:id="@+id/tv_et_limit"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="16dp"
+            android:layout_marginBottom="16dp"
+            android:text='@{feedbackViewModel.etContent.length() + "/500" }'
+            android:textColor="#A7A7A7"
+            android:textSize="13sp"
+            app:layout_constraintBottom_toBottomOf="@+id/et_suggestion"
+            app:layout_constraintEnd_toEndOf="@+id/et_suggestion"
+            tools:text="0/500" />
+
+        <Space
+            android:id="@+id/space"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintDimensionRatio="360:40"
+            app:layout_constraintTop_toBottomOf="@+id/et_suggestion" />
+
+        <TextView
+            android:id="@+id/tv_submit"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:background="@drawable/bg_common_btn"
+            android:gravity="center"
+            android:onClick="@{()-> feedbackViewModel.submitClick()}"
+            android:text="@string/feedback_submit"
+            android:textColor="@color/white"
+            android:textSize="16sp"
+            android:textStyle="bold"
+            app:layout_constraintDimensionRatio="328:44"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/space"
+            app:layout_constraintWidth_percent="0.9111111111111111" />
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 2 - 1
app/src/main/res/layout/fragment_mine.xml

@@ -184,7 +184,8 @@
                         settingsIcon="@{@drawable/icon_small_suggestion}"
                         settingsName="@{@string/mine_suggestion}"
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content" />
+                        android:layout_height="wrap_content"
+                        android:onClick="@{()->mineViewModel.onFeedbackClick()}" />
 
                     <include
                         layout="@layout/layout_item_settings"

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

@@ -49,4 +49,9 @@
     <string name="dialog_exit_content">您确定退出登录吗?</string>
     <string name="dialog_logout_tips">您确定要注销账户吗?</string>
     <string name="dialog_logout_content">注销后,将会删除您账户所有的信息</string>
+    <string name="feedback_title">意见反馈</string>
+    <string name="feedback_content_title">反馈内容</string>
+    <string name="feedback_hint">请详细描述您的意见</string>
+    <string name="feedback_submit">提 交</string>
+    <string name="feed_back_success">提交成功,感谢您的反馈!</string>
 </resources>

+ 9 - 0
app/src/main/res/values/style.xml

@@ -48,4 +48,13 @@
         <item name="android:textColor">@color/common_txt_color</item>
     </style>
 
+    <style name="Tool_Bar_Title_Txt">
+        <item name="android:textSize">17sp</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textColor">@color/common_txt_color</item>
+        <item name="android:layout_gravity">center</item>
+    </style>
+
 </resources>