Sfoglia il codice sorgente

chore: blocked thought

beautusg 7 anni fa
parent
commit
af9b64f7a2

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

@@ -4,6 +4,7 @@
     package="com.sduduzog.slimlauncher">
 
     <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
 
     <application
         android:allowBackup="false"

+ 14 - 0
app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt

@@ -1,6 +1,7 @@
 package com.sduduzog.slimlauncher
 
 import android.content.SharedPreferences
+import android.content.pm.PackageManager
 import android.content.res.Resources
 import android.os.Bundle
 import android.view.View
@@ -8,6 +9,8 @@ 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.Permissions
+import com.sduduzog.slimlauncher.utils.VoiceRecorder
 
 
 class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
@@ -70,6 +73,17 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
         dispatchBack()
     }
 
+    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
+        when (requestCode) {
+            Permissions.RECORD_AUDIO -> {
+                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    VoiceRecorder.getInstance().startRecording(filesDir.absolutePath)
+                }
+                return
+            }
+        }
+    }
+
     private fun showSystemUI() {
         window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
     }

+ 16 - 4
app/src/main/java/com/sduduzog/slimlauncher/data/BaseDatabase.kt

@@ -11,7 +11,7 @@ import com.sduduzog.slimlauncher.data.model.Note
 import com.sduduzog.slimlauncher.data.model.Task
 
 
-@Database(entities = [HomeApp::class, Note::class, Task::class], version = 4, exportSchema = false)
+@Database(entities = [HomeApp::class, Note::class, Task::class], version = 5, exportSchema = false)
 abstract class BaseDatabase : RoomDatabase() {
 
     abstract fun baseDao(): BaseDao
@@ -26,7 +26,12 @@ abstract class BaseDatabase : RoomDatabase() {
                 if (INSTANCE == null) {
                     INSTANCE = Room.databaseBuilder(context.applicationContext,
                             BaseDatabase::class.java, "app_database")
-                            .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4)
+                            .addMigrations(
+                                    MIGRATION_1_2,
+                                    MIGRATION_2_3,
+                                    MIGRATION_3_4,
+                                    MIGRATION_4_5
+                            )
                             .build()
                 }
                 return INSTANCE
@@ -35,13 +40,13 @@ abstract class BaseDatabase : RoomDatabase() {
 
         private val MIGRATION_1_2 = object : Migration(1, 2) {
             override fun migrate(database: SupportSQLiteDatabase) {
-                database.execSQL("ALTER TABLE home_apps ADD COLUMN sorting_index INTEGER NOT NULL DEFAULT 0")
+                database.execSQL("ALTER TABLE `home_apps` ADD COLUMN `sorting_index` INTEGER NOT NULL DEFAULT 0")
                 val cursor = database.query("SELECT package_name FROM home_apps")
                 cursor.moveToFirst()
                 var index = 0
                 while (!cursor.isAfterLast) {
                     val column = cursor.getString(cursor.getColumnIndex("package_name"))
-                    database.execSQL("UPDATE home_apps SET sorting_index=$index WHERE package_name='$column'")
+                    database.execSQL("UPDATE `home_apps` SET `sorting_index`=$index WHERE `package_name`='$column'")
                     cursor.moveToNext()
                     index++
                 }
@@ -60,5 +65,12 @@ abstract class BaseDatabase : RoomDatabase() {
                 database.execSQL("CREATE TABLE IF NOT EXISTS `tasks` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `body` TEXT NOT NULL, `is_complete` INTEGER NOT NULL, `sorting_index` INTEGER NOT NULL)")
             }
         }
+
+        private val MIGRATION_4_5 = object : Migration(4, 5) {
+            override fun migrate(database: SupportSQLiteDatabase) {
+                database.execSQL("ALTER TABLE `notes` ADD COLUMN `is_voice` INTEGER NOT NULL DEFAULT 0")
+                database.execSQL("ALTER TABLE `notes` ADD COLUMN `path` TEXT")
+            }
+        }
     }
 }

+ 1 - 0
app/src/main/java/com/sduduzog/slimlauncher/data/Repository.kt

@@ -8,6 +8,7 @@ import com.sduduzog.slimlauncher.data.model.Note
 import com.sduduzog.slimlauncher.data.model.Task
 
 class Repository(application: Application) {
+
     private val database: BaseDatabase = BaseDatabase.getDatabase(application)!!
 
     private val baseDao: BaseDao = database.baseDao()

+ 11 - 8
app/src/main/java/com/sduduzog/slimlauncher/data/model/Note.kt

@@ -11,11 +11,14 @@ data class Note(
         @field:ColumnInfo(name = "body")
         var body: String,
         @field:ColumnInfo(name = "edited")
-        var edited: Long = -1L
-) : Serializable {
-    @field:ColumnInfo(name = "id")
-    @PrimaryKey(autoGenerate = true)
-    var id: Int? = null
-    @field:ColumnInfo(name = "title")
-    var title: String? = null
-}
+        var edited: Long = -1L,
+        @field:ColumnInfo(name = "is_voice")
+        var is_voice: Boolean = false,
+        @field:ColumnInfo(name = "id")
+        @PrimaryKey(autoGenerate = true)
+        var id: Int? = null,
+        @field:ColumnInfo(name = "title")
+        var title: String? = null,
+        @field:ColumnInfo(name = "path")
+        var path: String? = null
+) : Serializable

+ 3 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/NoteFragment.kt

@@ -41,6 +41,9 @@ class NoteFragment : BaseFragment() {
         val bundle = Bundle()
         bundle.putSerializable(getString(R.string.nav_key_note), note)
         note_fragment_edit.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_noteFragment_to_editNoteFragment, bundle))
+        if (note.is_voice) {
+
+        }
     }
 
     override fun onBack(): Boolean = false

+ 54 - 11
app/src/main/java/com/sduduzog/slimlauncher/ui/main/NotesFragment.kt

@@ -1,9 +1,14 @@
 package com.sduduzog.slimlauncher.ui.main
 
+import android.Manifest
+import android.content.pm.PackageManager
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProviders
 import androidx.navigation.Navigation
@@ -13,41 +18,35 @@ import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.adapters.NotesAdapter
 import com.sduduzog.slimlauncher.data.MainViewModel
 import com.sduduzog.slimlauncher.data.model.Note
-import com.sduduzog.slimlauncher.utils.BaseFragment
-import com.sduduzog.slimlauncher.utils.OnItemActionListener
-import com.sduduzog.slimlauncher.utils.OnShitDoneToNotesListener
+import com.sduduzog.slimlauncher.utils.*
 import kotlinx.android.synthetic.main.notes_fragment.*
 
+
 class NotesFragment : BaseFragment(), OnShitDoneToNotesListener {
 
     override fun getFragmentView(): ViewGroup = notes_fragment
 
     private lateinit var viewModel: MainViewModel
+    private val voiceRecorder = VoiceRecorder.getInstance()
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         return inflater.inflate(R.layout.notes_fragment, container, false)
     }
 
-
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
         val adapter = NotesAdapter(this)
         activity?.let {
             viewModel = ViewModelProviders.of(it).get(MainViewModel::class.java)
         } ?: throw Error("Activity null, something here is fucked up")
-
         viewModel.notes.observe(this, Observer {
             it?.let { list ->
                 adapter.setItems(list)
             }
         })
-
         notes_fragment_list.adapter = adapter
-
         val listener: OnItemActionListener = adapter
-
         val simpleItemTouchCallback = object : ItemTouchHelper.Callback() {
-
             override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
                 val swipeFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
                 return makeMovementFlags(0, swipeFlags)
@@ -62,13 +61,57 @@ class NotesFragment : BaseFragment(), OnShitDoneToNotesListener {
                 listener.onViewSwiped(viewHolder.adapterPosition)
             }
         }
-
         val itemTouchHelper = ItemTouchHelper(simpleItemTouchCallback)
         itemTouchHelper.attachToRecyclerView(notes_fragment_list)
+        notes_fragment_create_note.setOnClickListener {
+            if (voiceRecorder.state == VoiceRecorder.Companion.State.RECORDING) {
+                try {
+                    voiceRecorder.stopRecording()
+                    voiceRecorder.save(viewModel)
+                } catch (e: RuntimeException) {
+                    Log.e("check", "$e")
+                }
+            } else {
+                Navigation.findNavController(notes_fragment)
+                        .navigate(R.id.action_notesFragment_to_editNoteFragment)
+            }
+        }
+        notes_fragment_create_note.setOnLongClickListener {
+            val permissionCheck = ContextCompat.checkSelfPermission(activity!!,
+                    Manifest.permission.RECORD_AUDIO)
+            val isPermissionGranted = permissionCheck == PackageManager.PERMISSION_GRANTED
+            if (isPermissionGranted) voiceRecorder.startRecording(context!!.filesDir.absolutePath)
+            else ActivityCompat.requestPermissions(activity!!,
+                    arrayOf(Manifest.permission.RECORD_AUDIO),
+                    Permissions.RECORD_AUDIO)
+            true
+        }
+        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.IDLE -> {
+                        notes_fragment_create_note.text = getString(R.string.notes_fragment_create_new_note)
+                    }
+                    VoiceRecorder.Companion.State.ERROR -> {
+                    }
+                }
+            }
+        })
+    }
 
-        notes_fragment_create_note.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_notesFragment_to_editNoteFragment))
+
+    override fun onStart() {
+        super.onStart()
+        voiceRecorder.onStart()
     }
 
+    override fun onStop() {
+        super.onStop()
+        voiceRecorder.onStop()
+    }
 
     override fun onView(note: Note) {
         val bundle = Bundle()

+ 3 - 5
app/src/main/java/com/sduduzog/slimlauncher/ui/main/EditNoteFragment.kt → app/src/main/java/com/sduduzog/slimlauncher/ui/notes/EditNoteFragment.kt

@@ -1,8 +1,7 @@
-package com.sduduzog.slimlauncher.ui.main
+package com.sduduzog.slimlauncher.ui.notes
 
 import android.content.Context
 import android.os.Bundle
-import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -60,7 +59,6 @@ class EditNoteFragment : BaseFragment() {
             save()?.let {
                 val bundle = Bundle()
                 bundle.putSerializable(getString(R.string.nav_key_note), it)
-                Log.d("check", "$it")
                 Navigation.findNavController(edit_note_fragment).navigate(R.id.action_editNoteFragment_to_noteFragment, bundle)
             }
         }
@@ -77,13 +75,13 @@ class EditNoteFragment : BaseFragment() {
         val body = edit_note_fragment_body.text.toString()
         val title = edit_note_fragment_title.text.toString()
         val newNote = Note(body, Date().time)
-        newNote.title = title
+        newNote.title = title.trim()
         newNote.body = body.trim()
         newNote.id = note.id
         val currentDigest = hash(newNote.title + newNote.body)
         if (body.isEmpty()) return null
         if (initialDigest == currentDigest) return null
-        if (note.id == null) viewModel.add(newNote) else viewModel.update(newNote)
+        if (note.edited == -1L) viewModel.add(newNote) else viewModel.update(newNote)
         return newNote
     }
 }

+ 8 - 0
app/src/main/java/com/sduduzog/slimlauncher/utils/Permissions.kt

@@ -0,0 +1,8 @@
+package com.sduduzog.slimlauncher.utils
+
+open class Permissions {
+
+    companion object {
+        const val RECORD_AUDIO = 1
+    }
+}

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

@@ -0,0 +1,85 @@
+package com.sduduzog.slimlauncher.utils
+
+import android.media.MediaRecorder
+import android.util.Log
+import androidx.lifecycle.MutableLiveData
+import com.sduduzog.slimlauncher.data.MainViewModel
+import com.sduduzog.slimlauncher.data.model.Note
+import java.io.IOException
+import java.text.DateFormat
+import java.util.*
+
+
+class VoiceRecorder private constructor() {
+
+    var state: State = State.IDLE
+        set(value) {
+            stateLiveData.value = value
+            field = value
+        }
+    val stateLiveData = MutableLiveData<State>()
+    private var note: Note? = null
+    private var mediaRecorder: MediaRecorder? = null
+
+    fun startRecording(fileName: String) {
+        val timestamp = Date().time
+        val title = "Voice note : ${DateFormat.getDateInstance().format(Date(timestamp))}"
+        val body = "Recorded at ${DateFormat.getTimeInstance().format(Date(timestamp))}"
+        val path = "$fileName/$timestamp.3gp"
+        note = Note(body, timestamp, true).apply { this.title = title; this.path = path }
+        mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
+        mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
+        mediaRecorder?.setOutputFile(path)
+        mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
+        try {
+            mediaRecorder?.prepare()
+            mediaRecorder?.start()
+            state = State.RECORDING
+        } catch (e: IOException) {
+            note = null
+            state = State.ERROR
+        }
+    }
+
+    fun stopRecording() {
+        mediaRecorder?.stop()
+        mediaRecorder?.reset()
+        state = State.IDLE
+    }
+
+    fun save(viewModel: MainViewModel) {
+        viewModel.add(note!!)
+    }
+
+    fun onStart() {
+        state = State.IDLE
+        mediaRecorder = MediaRecorder()
+    }
+
+    fun onStop() {
+        Log.d("check", "on stop recording")
+        mediaRecorder?.release()
+        mediaRecorder = null
+    }
+
+    companion object {
+
+        @Volatile
+        private var INSTANCE: VoiceRecorder? = null
+
+        fun getInstance(): VoiceRecorder {
+            synchronized(VoiceRecorder::class.java) {
+                if (INSTANCE == null) {
+                    INSTANCE = VoiceRecorder()
+                }
+                return INSTANCE!!
+            }
+        }
+
+        enum class State {
+            RECORDING,
+            IDLE,
+            ERROR
+        }
+    }
+}

+ 1 - 1
app/src/main/res/layout/edit_note_fragment.xml

@@ -7,7 +7,7 @@
     android:layout_height="match_parent"
     android:fitsSystemWindows="true"
     android:scrollbarStyle="insideOverlay"
-    tools:context="com.sduduzog.slimlauncher.ui.main.EditNoteFragment">
+    tools:context="com.sduduzog.slimlauncher.ui.notes.EditNoteFragment">
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/edit_note_fragment_layout"

+ 2 - 0
app/src/main/res/layout/note_fragment.xml

@@ -48,5 +48,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@id/note_fragment_title" />
     </androidx.constraintlayout.widget.ConstraintLayout>
+
+
 </ScrollView>
 

+ 3 - 2
app/src/main/res/layout/notes_fragment_list_item.xml

@@ -3,19 +3,20 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
-    android:padding="@dimen/_12sdp">
+    android:padding="16dp">
 
     <TextView
         android:id="@+id/notes_fragment_list_item_title"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:textAppearance="@style/TextAppearance.AppCompat"
-        android:textSize="@dimen/_18ssp" />
+        android:textSize="18sp" />
 
     <TextView
         android:id="@+id/notes_fragment_list_item_snippet"
         android:layout_width="match_parent"
         android:ellipsize="end"
+        android:textSize="14sp"
         android:textAppearance="@style/TextAppearance.AppCompat"
         android:maxLines="5"
         android:layout_height="wrap_content" />

+ 59 - 0
app/src/main/res/layout/voice_note_fragment.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView 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:id="@+id/voice_note_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true"
+    android:scrollbarStyle="insideOverlay"
+    tools:context="com.sduduzog.slimlauncher.ui.notes.EditNoteFragment">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/voice_note_fragment_layout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <EditText
+            android:id="@+id/edit_note_fragment_title"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:background="@android:color/transparent"
+            android:hint="@string/edit_note_fragment_untitled"
+            android:inputType="textCapSentences"
+            android:padding="12dp"
+            android:singleLine="true"
+            android:textSize="18sp"
+            app:layout_constraintEnd_toStartOf="@+id/edit_note_fragment_save"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            tools:ignore="Autofill,TextFields" />
+
+        <TextView
+            android:id="@+id/edit_note_fragment_save"
+            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="@string/edit_note_fragment_save"
+            android:textSize="18sp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <EditText
+            android:id="@+id/edit_note_fragment_body"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:imeOptions="normal"
+            android:inputType="textMultiLine|textCapSentences"
+            android:padding="12dp"
+            android:textSize="14sp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/edit_note_fragment_title"
+            tools:ignore="Autofill,LabelFor" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</ScrollView>

+ 1 - 1
app/src/main/res/navigation/nav_graph.xml

@@ -71,7 +71,7 @@
         tools:layout="@layout/tasks_fragment" />
     <fragment
         android:id="@+id/editNoteFragment"
-        android:name="com.sduduzog.slimlauncher.ui.main.EditNoteFragment"
+        android:name="com.sduduzog.slimlauncher.ui.notes.EditNoteFragment"
         android:label="edit_note_fragment"
         tools:layout="@layout/edit_note_fragment">
         <action

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

@@ -46,6 +46,7 @@
     <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="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>

+ 3 - 2
docs/index.html

@@ -5,11 +5,12 @@
     <meta charset="UTF-8"/>
     <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
     <meta content="ie=edge" http-equiv="X-UA-Compatible"/>
-    <title>Slim Launcher</title>
+    <link href="./main.css" rel="stylesheet">
+    <title>Slim Launcher - Fewer distraction, more life</title>
 </head>
 
 <body>
-Hello there
+<h1>Hello there</h1>
 </body>
 
 </html>

BIN
docs/main.css