From d915812236a0a6b5aa5612d202cae5114b16eda8 Mon Sep 17 00:00:00 2001
From: xiaowusky <chenyangyang3858@dingtalk.com>
Date: Wed, 20 Dec 2023 09:24:42 +0800
Subject: [PATCH] =?UTF-8?q?desc:=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?=
 =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9F=B3=E9=87=8F=E9=94=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../watcher/base/BaseActivity.kt              |  65 ++++++++++++++----
 .../watcher/player/ProVideoActivity.java      |   2 +-
 .../watcher/player/VideoControllerView.java   |  16 ++++-
 .../watcher/ui/SensorSettingActivity.kt       |   2 +
 .../watcher/ui/view/CommonTopBar.kt           |   2 +-
 .../main/res/drawable-hdpi/voice_circle.png   | Bin 0 -> 8482 bytes
 app/src/main/res/layout/layout_topbar.xml     |   2 +-
 app/src/main/res/layout/media_controller.xml  |  11 ++-
 8 files changed, 80 insertions(+), 20 deletions(-)
 create mode 100644 app/src/main/res/drawable-hdpi/voice_circle.png

diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt
index d1f8786..314ab74 100644
--- a/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt
+++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt
@@ -10,6 +10,7 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.EditText
 import android.widget.ImageButton
+import android.widget.ImageView
 import android.widget.LinearLayout
 import android.widget.RelativeLayout
 import android.widget.SeekBar
@@ -76,10 +77,27 @@ abstract class BaseActivity : AppCompatActivity() {
         RecordHelper.stopRecording()
     }
 
+    private val setVoiceAreaRunnable = Runnable {
+        volumeUtil.mediaVolume = baseBinding.sbSound.progress
+    }
+
     private fun initSound() {
         baseBinding.sbSound.max = volumeUtil.mediaMaxVolume
         val mediaVolume = volumeUtil.mediaVolume
         baseBinding.sbSound.progress = mediaVolume
+        baseBinding.sbSound.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
+            override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
+                baseBinding.root.removeCallbacks(setVoiceAreaRunnable)
+                baseBinding.root.postDelayed(setVoiceAreaRunnable, 200)
+                autoHideVoiceArea(1500)
+            }
+
+            override fun onStartTrackingTouch(seekBar: SeekBar) {
+            }
+
+            override fun onStopTrackingTouch(seekBar: SeekBar) {
+            }
+        })
     }
 
     private fun setChildContent() {
@@ -181,6 +199,7 @@ abstract class BaseActivity : AppCompatActivity() {
             "SeekBar" -> SeekBar(context, attrs)
             "EditText" -> EditText(context, attrs)
             "ImageButton" -> ImageButton(context, attrs)
+            "ImageView" -> ImageView(context, attrs)
             else -> {
                 null
             }
@@ -228,11 +247,7 @@ abstract class BaseActivity : AppCompatActivity() {
         val keyCode = event.keyCode
         if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode || KeyEvent.KEYCODE_DPAD_RIGHT == keyCode) {
             if (isLeftRightLongPress && baseBinding.areaSound.visibility == View.VISIBLE) {
-                baseBinding.areaSound.postDelayed(300) {
-                    lastFocusView?.requestFocus()
-                    baseBinding.areaSound.visibility = View.GONE
-                    volumeUtil.mediaVolume = baseBinding.sbSound.progress
-                }
+                baseBinding.areaSound.postDelayed(hideVoiceAreaRunnable, 1500)
                 return true
             }
         } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
@@ -254,25 +269,47 @@ abstract class BaseActivity : AppCompatActivity() {
         val repeatCount = event.repeatCount
         val keyCode = event.keyCode
         if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode || KeyEvent.KEYCODE_DPAD_RIGHT == keyCode) {
-            isLeftRightLongPress = repeatCount > 10
+            isLeftRightLongPress = repeatCount > 8
             if (isLeftRightLongPress && currentFocus !is SeekBar) {
-                val visibility = baseBinding.areaSound.visibility
-                if (View.GONE == visibility) {
-                    lastFocusView = currentFocus
-                    baseBinding.areaSound.visibility = View.VISIBLE
-                    baseBinding.sbSound.requestFocus()
-                }
+                showVoiceArea()
                 var mediaVolume = baseBinding.sbSound.progress
                 if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode) mediaVolume-- else mediaVolume++
                 baseBinding.sbSound.progress = mediaVolume
-                return true
+                return super.dispatchKeyEvent(event)
             }
         } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
-            isHomeLongPress = repeatCount > 10
+            isHomeLongPress = repeatCount > 8
         } else if (keyCode == KeyEvent.KEYCODE_F1) {
             LogUtils.w("BaseActivity F1 pressed")
             SoundUtils.playSoundIo()
         }
         return super.dispatchKeyEvent(event)
     }
+
+    fun showVoiceArea() {
+        val visibility = baseBinding.areaSound.visibility
+        if (View.GONE == visibility) {
+            lastFocusView = currentFocus
+            baseBinding.areaSound.visibility = View.VISIBLE
+            baseBinding.sbSound.requestFocus()
+        }
+        autoHideVoiceArea()
+    }
+
+
+    private fun hideVoiceArea() {
+        lastFocusView?.requestFocus()
+        baseBinding.areaSound.visibility = View.GONE
+        volumeUtil.mediaVolume = baseBinding.sbSound.progress
+        baseBinding.root.removeCallbacks(hideVoiceAreaRunnable)
+    }
+
+    private val hideVoiceAreaRunnable = Runnable {
+        hideVoiceArea()
+    }
+
+    fun autoHideVoiceArea(delayTime: Long = 2500) {
+        baseBinding.root.removeCallbacks(hideVoiceAreaRunnable)
+        baseBinding.root.postDelayed(hideVoiceAreaRunnable, delayTime)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java
index 958d152..547b795 100644
--- a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java
+++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java
@@ -211,7 +211,7 @@ public class ProVideoActivity extends NoOptionsActivity {
                 }
             }
         }
-        mediaController = new VideoControllerView(this);
+        mediaController = new VideoControllerView(this, v -> showVoiceArea());
         mediaController.setMediaPlayer(mBinding.videoView);
         mVideoView = mBinding.videoView;
         mVideoView.setMediaController(mediaController);
diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java
index e3b4932..0b3d072 100644
--- a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java
+++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java
@@ -16,6 +16,7 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
+import android.widget.ImageView;
 import android.widget.MediaController;
 import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
@@ -154,6 +155,14 @@ public class VideoControllerView extends FrameLayout implements IMediaController
             show(sDefaultTimeout);
         }
     };
+    View.OnClickListener outVoiceListener = null;
+    private OnClickListener mVoiceListener = new OnClickListener() {
+        public void onClick(View v) {
+            if (outVoiceListener != null) {
+                outVoiceListener.onClick(v);
+            }
+        }
+    };
 
     /**
      * ==================== constructor ====================
@@ -178,9 +187,9 @@ public class VideoControllerView extends FrameLayout implements IMediaController
         Log.i(TAG, TAG);
     }
 
-    public VideoControllerView(Context context) {
+    public VideoControllerView(Context context, View.OnClickListener voiceListener) {
         this(context, true);
-
+        outVoiceListener = voiceListener;
         Log.i(TAG, TAG);
     }
 
@@ -426,6 +435,9 @@ public class VideoControllerView extends FrameLayout implements IMediaController
             }
         }
 
+        ImageView voiceView = (ImageView) v.findViewById(R.id.voice);
+        voiceView.setOnClickListener(mVoiceListener);
+
         mProgress = (SeekBar) v.findViewById(R.id.media_controller_progress);
         if (mProgress != null) {
             if (mProgress instanceof SeekBar) {
diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorSettingActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorSettingActivity.kt
index 28b84c5..3f4eb2b 100644
--- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorSettingActivity.kt
+++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorSettingActivity.kt
@@ -290,5 +290,7 @@ class SensorSettingActivity : NoOptionsActivity() {
         MMKVUtils.sync()
 //        }
         showToast("保存成功")
+
+        initView()
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt
index 6ddaaa6..0e9affa 100644
--- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt
+++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt
@@ -89,7 +89,7 @@ class CommonTopBar : LinearLayout {
         override fun onLevel(level: Int) {
             Log.i(this@CommonTopBar.javaClass.name, "wifiCallback onLevel = $level")
             mBinding?.root?.post {
-                mBinding?.wifi?.visibility = if (!isVirtuallyNet4()) VISIBLE else GONE
+                mBinding?.wifi?.visibility = if (level > 0 && !isVirtuallyNet4()) VISIBLE else GONE
                 val showLevel = (level + 1) * 20
                 mBinding?.wifi?.setImageLevel(showLevel)
                 dealForNet4()
diff --git a/app/src/main/res/drawable-hdpi/voice_circle.png b/app/src/main/res/drawable-hdpi/voice_circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..5405de3c7f08fdfdda05b753e86af5b6b7642c6d
GIT binary patch
literal 8482
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
QdH?_b07*qoM6N<$f>^%{`Tzg`

literal 0
HcmV?d00001

diff --git a/app/src/main/res/layout/layout_topbar.xml b/app/src/main/res/layout/layout_topbar.xml
index c8ec6f3..2d8c5d3 100644
--- a/app/src/main/res/layout/layout_topbar.xml
+++ b/app/src/main/res/layout/layout_topbar.xml
@@ -46,7 +46,7 @@
     <TextClock
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:format12Hour="hh.mm"
+        android:format12Hour="HH.mm"
         android:format24Hour="HH.mm"
         android:textColor="@color/white"
         android:textSize="@dimen/_30dp" />
diff --git a/app/src/main/res/layout/media_controller.xml b/app/src/main/res/layout/media_controller.xml
index a376bec..37f103e 100644
--- a/app/src/main/res/layout/media_controller.xml
+++ b/app/src/main/res/layout/media_controller.xml
@@ -61,6 +61,7 @@
                 android:layout_weight="1"
                 android:nextFocusLeft="@id/media_controller_progress"
                 android:nextFocusRight="@id/media_controller_progress"
+                android:nextFocusDown="@id/voice"
                 android:focusable="true"
                 android:progress="0" />
 
@@ -84,12 +85,20 @@
             android:orientation="horizontal"
             android:paddingHorizontal="@dimen/_580dp">
 
+            <ImageView
+                android:id="@+id/voice"
+                style="@android:style/MediaButton.Rew"
+                android:layout_weight="1"
+                android:padding="@dimen/_23dp"
+                android:focusable="true"
+                android:nextFocusLeft="@id/voice"
+                android:src="@drawable/voice_circle" />
+
             <ImageButton
                 android:id="@+id/rewind"
                 style="@android:style/MediaButton.Rew"
                 android:layout_weight="1"
                 android:focusable="true"
-                android:nextFocusLeft="@id/rewind"
                 android:src="@drawable/new_moveback_btn" />
 
             <ImageButton