Explorar el Código

chore: so many features implemented I've lost count

beautusg hace 7 años
padre
commit
a6c3e059cb

+ 19 - 1
app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt

@@ -9,14 +9,16 @@ import androidx.appcompat.app.AppCompatActivity
 import androidx.navigation.NavController
 import androidx.navigation.Navigation.findNavController
 import com.sduduzog.slimlauncher.utils.BaseFragment
+import com.sduduzog.slimlauncher.utils.HomeWatcher
 import com.sduduzog.slimlauncher.utils.Permissions
 import com.sduduzog.slimlauncher.utils.VoiceRecorder
 
 
-class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
+class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, HomeWatcher.OnHomePressedListener {
 
     private lateinit var settings: SharedPreferences
     private lateinit var navigator: NavController
+    private lateinit var homeWatcher: HomeWatcher
     private val subscribers: MutableSet<BaseFragment> = mutableSetOf()
 
     fun attachSubscriber(s: BaseFragment) {
@@ -38,6 +40,8 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
         settings = getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
         settings.registerOnSharedPreferenceChangeListener(this)
         navigator = findNavController(this, R.id.nav_host_fragment)
+        homeWatcher = HomeWatcher(this)
+        homeWatcher.setOnHomePressedListener(this)
     }
 
     override fun onResume() {
@@ -46,6 +50,16 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
         toggleStatusBar()
     }
 
+    override fun onStart() {
+        super.onStart()
+        homeWatcher.startWatch()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        homeWatcher.stopWatch()
+    }
+
     override fun onWindowFocusChanged(hasFocus: Boolean) {
         super.onWindowFocusChanged(hasFocus)
         if (hasFocus) toggleStatusBar()
@@ -73,6 +87,10 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
         dispatchBack()
     }
 
+    override fun onHomePressed() {
+        navigator.popBackStack(R.id.homeFragment, false)
+    }
+
     override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
         when (requestCode) {
             Permissions.RECORD_AUDIO -> {

+ 37 - 5
app/src/main/java/com/sduduzog/slimlauncher/ui/main/NotesFragment.kt

@@ -3,6 +3,9 @@ package com.sduduzog.slimlauncher.ui.main
 import android.Manifest
 import android.content.pm.PackageManager
 import android.os.Bundle
+import android.os.Handler
+import android.os.SystemClock
+import android.text.format.DateUtils
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
@@ -28,6 +31,20 @@ class NotesFragment : BaseFragment(), OnShitDoneToNotesListener {
 
     private lateinit var viewModel: MainViewModel
     private val voiceRecorder = VoiceRecorder.getInstance()
+    private val customHandler = Handler()
+    private var timeInMilliseconds = 0L
+    private var startTime = 0L
+    private var updateTime = 0L
+    private val updateTimerThread = object : Runnable {
+        override fun run() {
+            timeInMilliseconds = SystemClock.uptimeMillis()
+            updateTime = timeInMilliseconds - startTime
+            val time = DateUtils.formatElapsedTime(updateTime / 1000)
+            notes_fragment_create_note.text = getString(R.string.notes_fragment_stop_recording)
+            notes_fragment_counter.text = getString(R.string.notes_fragment_counter, time)
+            customHandler.postDelayed(this, 100)
+        }
+    }
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         return inflater.inflate(R.layout.notes_fragment, container, false)
@@ -89,19 +106,27 @@ class NotesFragment : BaseFragment(), OnShitDoneToNotesListener {
         voiceRecorder.stateLiveData.observe(this, Observer {
             it?.let { state ->
                 when (state) {
-                    VoiceRecorder.Companion.State.RECORDING -> {
-                        notes_fragment_create_note.text = getString(R.string.notes_fragment_stop_recording)
-                    }
+                    VoiceRecorder.Companion.State.RECORDING -> startTimer()
                     VoiceRecorder.Companion.State.IDLE -> {
                         notes_fragment_create_note.text = getString(R.string.notes_fragment_create_new_note)
+                        stopTimer()
                     }
-                    VoiceRecorder.Companion.State.ERROR -> {
-                    }
+                    VoiceRecorder.Companion.State.ERROR -> stopTimer()
                 }
             }
         })
     }
 
+    private fun startTimer() {
+        startTime = SystemClock.uptimeMillis()
+        customHandler.postDelayed(updateTimerThread, 0)
+        notes_fragment_counter.visibility = View.VISIBLE
+    }
+
+    private fun stopTimer() {
+        customHandler.removeCallbacks(updateTimerThread)
+        notes_fragment_counter.visibility = View.GONE
+    }
 
     override fun onStart() {
         super.onStart()
@@ -111,9 +136,11 @@ class NotesFragment : BaseFragment(), OnShitDoneToNotesListener {
     override fun onStop() {
         super.onStop()
         voiceRecorder.onStop()
+        customHandler.removeCallbacks(updateTimerThread)
     }
 
     override fun onView(note: Note) {
+        if (voiceRecorder.state == VoiceRecorder.Companion.State.RECORDING) return
         val bundle = Bundle()
         bundle.putLong(getString(R.string.nav_key_note), note.id)
         if (note.type == Note.TYPE_TEXT)
@@ -125,6 +152,11 @@ class NotesFragment : BaseFragment(), OnShitDoneToNotesListener {
     }
 
     override fun onDelete(note: Note) {
+        if (voiceRecorder.state == VoiceRecorder.Companion.State.RECORDING) {
+            notes_fragment_list.adapter?.notifyDataSetChanged()
+            return
+        }
+        if (note.type == Note.TYPE_VOICE) context?.deleteFile(note.path)
         viewModel.remove(note)
     }
 }

+ 29 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/notes/VoiceNoteFragment.kt

@@ -2,9 +2,11 @@ package com.sduduzog.slimlauncher.ui.notes
 
 import android.media.MediaPlayer
 import android.os.Bundle
+import android.text.format.DateUtils
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import androidx.appcompat.widget.PopupMenu
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProviders
 import com.sduduzog.slimlauncher.R
@@ -50,6 +52,12 @@ class VoiceNoteFragment : BaseFragment() {
                 voice_note_fragment_play.text = getString(R.string.voice_note_fragment_pause)
             }
         }
+        voice_note_fragment_stop.setOnClickListener {
+            mediaPlayer?.stop()
+            mediaPlayer?.prepare()
+            showDuration()
+            voice_note_fragment_play.text = getString(R.string.voice_note_fragment_play)
+        }
     }
 
     override fun onStop() {
@@ -67,5 +75,26 @@ class VoiceNoteFragment : BaseFragment() {
         mediaPlayer = MediaPlayer()
         mediaPlayer?.setDataSource(note.path)
         mediaPlayer?.prepare()
+        showDuration()
+        voice_note_fragment_options.setOnClickListener {
+            showPopupMenu(it).setOnMenuItemClickListener {
+
+                true
+            }
+        }
+    }
+
+    private fun showDuration() {
+        mediaPlayer?.let {
+            val duration = it.duration
+            voice_note_fragment_counter.text = DateUtils.formatElapsedTime(duration.toLong() / 1000)
+        }
+    }
+
+    private fun showPopupMenu(view: View): PopupMenu {
+        val popup = PopupMenu(context!!, view)
+        popup.menuInflater.inflate(R.menu.voice_note_popup_menu, popup.menu)
+        popup.show()
+        return popup
     }
 }

+ 49 - 0
app/src/main/java/com/sduduzog/slimlauncher/utils/HomeWatcher.kt

@@ -0,0 +1,49 @@
+package com.sduduzog.slimlauncher.utils
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+
+class HomeWatcher(private val context: Context) {
+
+    private var listener: OnHomePressedListener? = null
+    private var receiver: InnerReceiver? = null
+    private val filter = IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
+
+    fun setOnHomePressedListener(listener: OnHomePressedListener) {
+        this.listener = listener
+        receiver = InnerReceiver()
+    }
+
+    fun startWatch() {
+        receiver?.let {
+            context.registerReceiver(it, filter)
+        }
+    }
+
+    fun stopWatch() {
+        receiver?.let {
+            context.unregisterReceiver(it)
+        }
+    }
+
+    @Suppress("PrivatePropertyName")
+    inner class InnerReceiver : BroadcastReceiver() {
+
+        private val SYSTEM_DIALOG_REASON_KEY = "reason"
+        private val SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"
+
+        override fun onReceive(context: Context?, intent: Intent?) {
+            if (intent == null) return
+            if (intent.action != Intent.ACTION_CLOSE_SYSTEM_DIALOGS) return
+            val reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY) ?: return
+            if (reason != SYSTEM_DIALOG_REASON_HOME_KEY) return
+            listener?.onHomePressed()
+        }
+    }
+
+    interface OnHomePressedListener {
+        fun onHomePressed()
+    }
+}

+ 2 - 2
app/src/main/java/com/sduduzog/slimlauncher/utils/VoiceRecorder.kt

@@ -23,8 +23,8 @@ class VoiceRecorder private constructor() {
 
     fun startRecording(fileName: String) {
         val timestamp = Date().time
-        val title = "Voice note : ${DateFormat.getDateInstance(DateFormat.SHORT).format(Date(timestamp))}"
-        val body = "Recorded at ${DateFormat.getTimeInstance(DateFormat.SHORT).format(Date(timestamp))}"
+        val title = "VN-$timestamp"
+        val body = "Recorded at ${DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(Date(timestamp))}"
         val path = "$fileName/$timestamp.3gp"
         note = Note(timestamp, body, title, timestamp, Note.TYPE_VOICE, path)
         mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)

+ 14 - 1
app/src/main/res/layout/notes_fragment.xml

@@ -43,6 +43,19 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/notes_fragment_create_note"
-        tools:listitem="@layout/notes_fragment_list_item" />
+        tools:listitem="@layout/notes_fragment_list_item">
+
+    </androidx.recyclerview.widget.RecyclerView>
+
+    <TextView
+        android:id="@+id/notes_fragment_counter"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:background="?attr/colorPrimary"
+        android:gravity="center"
+        android:textSize="@dimen/_68ssp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/notes_fragment_create_note"
+        tools:visibility="gone" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 10 - 11
app/src/main/res/layout/voice_note_fragment.xml

@@ -18,23 +18,23 @@
         android:padding="12dp"
         android:textAppearance="@style/Base.AlertDialog.AppCompat"
         android:textSize="18sp"
-        app:layout_constraintEnd_toStartOf="@+id/voice_note_fragment_save"
+        app:layout_constraintEnd_toStartOf="@+id/voice_note_fragment_options"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-    <TextView
-        android:id="@+id/voice_note_fragment_save"
+    <ImageView
+        android:id="@+id/voice_note_fragment_options"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="16dp"
         android:layout_marginEnd="16dp"
         android:layout_marginRight="16dp"
-        android:padding="12dp"
-
-        android:text="SHARE"
+        android:padding="8dp"
+        app:layout_constraintTop_toTopOf="parent"
         android:textSize="18sp"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        app:srcCompat="@drawable/ic_more_vert"
+        tools:ignore="ContentDescription" />
 
     <TextView
         android:id="@+id/voice_note_fragment_body"
@@ -51,7 +51,6 @@
         android:id="@+id/voice_note_fragment_counter"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="00:00"
         android:textAppearance="@style/Base.AlertDialog.AppCompat"
         android:textSize="@dimen/_64ssp"
         app:layout_constraintBottom_toBottomOf="parent"
@@ -64,18 +63,18 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:padding="@dimen/_8sdp"
-        android:text="PLAY"
+        android:text="@string/voice_note_fragment_play"
         android:textAppearance="@style/Base.AlertDialog.AppCompat"
         android:textSize="@dimen/_18ssp"
         app:layout_constraintStart_toStartOf="@+id/voice_note_fragment_counter"
         app:layout_constraintTop_toBottomOf="@+id/voice_note_fragment_counter" />
 
     <TextView
-        android:id="@+id/textView3"
+        android:id="@+id/voice_note_fragment_stop"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:padding="@dimen/_8sdp"
-        android:text="STOP"
+        android:text="@string/voice_note_fragment_stop"
         android:textAppearance="@style/Base.AlertDialog.AppCompat"
         android:textSize="@dimen/_18ssp"
         app:layout_constraintRight_toRightOf="@+id/voice_note_fragment_counter"

+ 13 - 0
app/src/main/res/menu/voice_note_popup_menu.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/vn_menu_rename"
+        android:title="@string/menu_rename" />
+    <item
+        android:id="@+id/vn_menu_share"
+        android:title="@string/menu_share" />
+    <item
+        android:id="@+id/vn_menu_delete"
+        android:title="@string/menu_delete" />
+</menu>

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

@@ -46,7 +46,8 @@
     <string name="menu_remove">Remove</string>
     <string name="choose_theme_dialog_title">Choose Theme</string>
     <string name="notes_fragment_create_new_note">CREATE</string>
-    <string name="notes_fragment_stop_recording">STOP</string>
+    <string name="notes_fragment_counter">%s</string>
+    <string name="notes_fragment_stop_recording">STOP RECORDING</string>
     <string name="add_apps_fragment_search_apps">Search apps</string>
     <string name="tasks_fragment_list_item_complete">&lt;strike>%s&lt;/strike></string>
     <string name="tasks_fragment_sort">Sort</string>
@@ -58,5 +59,8 @@
     <string name="nav_key_note">note</string>
     <string name="voice_note_fragment_pause">PAUSE</string>
     <string name="voice_note_fragment_play">PLAY</string>
+    <string name="menu_share">Share</string>
+    <string name="menu_delete">Delete</string>
+    <string name="voice_note_fragment_stop">STOP</string>
 
 </resources>