Przeglądaj źródła

Rename home apps, drag handlebars instead of long click

sduduzog 7 lat temu
rodzic
commit
2ed2b80a96

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

@@ -53,7 +53,8 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
     override fun onBackPressed() {
         if (currentLabel != label)
             super.onBackPressed()
-        else onBackPressedListener?.onBackPressed()
+        else onBackPressedListener?.onBackPress()
+        onBackPressedListener?.onBackPressed()
     }
 
     override fun onNavigated(controller: NavController, destination: NavDestination) {
@@ -102,6 +103,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
     }
 
     interface OnBackPressedListener {
+        fun onBackPress()
         fun onBackPressed()
     }
 }

+ 4 - 0
app/src/main/java/com/sduduzog/slimlauncher/data/DataRepository.kt

@@ -47,6 +47,10 @@ class DataRepository(application: Application) {
         RefreshAppsAsyncTask(appDao).execute(pm)
     }
 
+    fun renameApp(app: HomeApp) {
+        UpdateAppsAsyncTask(appDao).execute(app)
+    }
+
     fun saveNote(note: Note){
         SaveNoteAsyncTask(noteDao).execute(note)
     }

+ 0 - 1
app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeAppsAdapter.kt

@@ -22,7 +22,6 @@ class HomeAppsAdapter(private var fragment: MainFragment)
     private var viewModel = ViewModelProviders.of(fragment).get(MainViewModel::class.java)
 
     init {
-        Log.d("HomeAppsAdapter", "onCreateView")
         viewModel.homeApps.observe(fragment, Observer {
             if (it != null) {
                 apps = it

+ 21 - 10
app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainFragment.kt

@@ -20,7 +20,8 @@ import androidx.navigation.Navigation
 import com.daasuu.ei.Ease
 import com.daasuu.ei.EasingInterpolator
 import com.google.android.material.bottomsheet.BottomSheetBehavior
-import com.google.android.material.bottomsheet.BottomSheetBehavior.*
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HALF_EXPANDED
 import com.sduduzog.slimlauncher.MainActivity
 import com.sduduzog.slimlauncher.R
 import kotlinx.android.synthetic.main.main_bottom_sheet.*
@@ -29,7 +30,7 @@ import java.text.SimpleDateFormat
 import java.util.*
 
 
-class MainFragment : Fragment() {
+class MainFragment : Fragment(), MainActivity.OnBackPressedListener {
 
     @Suppress("PropertyName")
     val TAG: String = "MainFragment"
@@ -68,11 +69,14 @@ class MainFragment : Fragment() {
     override fun onAttach(context: Context?) {
         super.onAttach(context)
         with(context as MainActivity) {
-            this.onBackPressedListener = object : MainActivity.OnBackPressedListener {
-                override fun onBackPressed() {
-                    sheetBehavior.state = STATE_COLLAPSED
-                }
-            }
+            this.onBackPressedListener = this@MainFragment
+        }
+    }
+
+    override fun onDetach() {
+        super.onDetach()
+        with(context as MainActivity) {
+            this.onBackPressedListener = null
         }
     }
 
@@ -81,6 +85,14 @@ class MainFragment : Fragment() {
         activity?.unregisterReceiver(receiver)
     }
 
+    override fun onBackPress() {
+        sheetBehavior.state = STATE_COLLAPSED
+    }
+
+    override fun onBackPressed() {
+        // Do nothing
+    }
+
     private fun setEventListeners() {
         clockTextView.setOnClickListener {
             try {
@@ -110,8 +122,7 @@ class MainFragment : Fragment() {
         ivCall.setOnLongClickListener {
             if (isChecked) {
                 try {
-                    val intent = Intent(Intent.ACTION_MAIN)
-                    intent.addCategory(Intent.CATEGORY_APP_CONTACTS)
+                    val intent = Intent(Intent.ACTION_DIAL, null)
                     startActivity(intent)
                 } catch (e: ActivityNotFoundException) {
                     Log.e(TAG, "$e")
@@ -133,7 +144,7 @@ class MainFragment : Fragment() {
         }
     }
 
-    private fun setupBottomSheet(){
+    private fun setupBottomSheet() {
         bottomSheet.setOnClickListener {
             // Do nothing
         }

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

@@ -38,6 +38,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
     fun addToHomeScreen(app: HomeApp) {
         _repository.insertHomeApp(app)
     }
+    fun renameApp(app: HomeApp){
+        _repository.renameApp(app)
+    }
 
     fun addToHomeScreen(apps: List<App>) {
         for (i in apps.indices){

+ 18 - 1
app/src/main/java/com/sduduzog/slimlauncher/ui/main/notes/NoteFragment.kt

@@ -10,6 +10,8 @@ import android.view.ViewGroup
 import android.view.inputmethod.InputMethodManager
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProviders
+import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.sduduzog.slimlauncher.MainActivity
 import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.data.Note
 import com.sduduzog.slimlauncher.ui.main.DoubleClickListener
@@ -18,7 +20,7 @@ import java.security.MessageDigest
 import java.util.*
 
 
-class NoteFragment : Fragment() {
+class NoteFragment : Fragment(), MainActivity.OnBackPressedListener {
 
     @Suppress("PropertyName")
     val TAG: String = "NoteFragment"
@@ -82,6 +84,21 @@ class NoteFragment : Fragment() {
         saveNote()
     }
 
+    override fun onAttach(context: Context?) {
+        super.onAttach(context)
+        with(context as MainActivity) {
+            this.onBackPressedListener = this@NoteFragment
+        }
+    }
+
+    override fun onBackPress() {
+        // Do nothing
+    }
+
+    override fun onBackPressed() {
+        Log.d(TAG, "onBackPressed")
+    }
+
     private fun editBody() {
         textBody.visibility = View.INVISIBLE
         bodyEditText.visibility = View.VISIBLE

+ 42 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/RenameAppDialog.kt

@@ -0,0 +1,42 @@
+package com.sduduzog.slimlauncher.ui.main.settings
+
+import android.app.Dialog
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.widget.EditText
+import androidx.appcompat.app.AlertDialog
+import androidx.fragment.app.DialogFragment
+import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.data.HomeApp
+import com.sduduzog.slimlauncher.ui.main.MainViewModel
+import kotlinx.android.synthetic.main.settings_fragment.*
+
+class RenameAppDialog : DialogFragment() {
+
+    private lateinit var app: HomeApp
+    private lateinit var model: MainViewModel
+
+    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+        val view = LayoutInflater.from(context).inflate(R.layout.settings_rename_app, settingsAppList)
+        val editText = view.findViewById<EditText>(R.id.rename_editText)
+        editText.text.append(app.appName)
+        val builder = AlertDialog.Builder(context!!)
+        builder.setTitle("Rename ${app.appName}")
+        builder.setView(view)
+        builder.setPositiveButton("DONE") { _, _ ->
+            app.appName = editText.text.toString()
+            model.renameApp(app)
+        }
+        return builder.create()
+    }
+
+    companion object {
+        fun rename(app: HomeApp, model: MainViewModel): RenameAppDialog {
+            return RenameAppDialog().apply {
+                this.model = model
+                this.app = app
+            }
+        }
+    }
+}

+ 5 - 3
app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/SettingsFragment.kt

@@ -18,8 +18,6 @@ import kotlinx.android.synthetic.main.settings_fragment.*
 
 class SettingsFragment : Fragment() {
 
-    private lateinit var adapter: SettingsListAdapter
-
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                               savedInstanceState: Bundle?): View? {
         return inflater.inflate(R.layout.settings_fragment, container, false)
@@ -27,7 +25,7 @@ class SettingsFragment : Fragment() {
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
-        adapter = SettingsListAdapter(this)
+        val adapter = SettingsListAdapter(this)
         settingsAppList.adapter = adapter
         val listener: OnItemActionListener = adapter
 
@@ -64,12 +62,16 @@ class SettingsFragment : Fragment() {
                 //adapter.deleteAppFromList(viewHolder.adapterPosition)
                 listener.onViewSwiped(viewHolder.adapterPosition)
             }
+
+            override fun isLongPressDragEnabled() = false
         }
 
         val itemTouchHelper = ItemTouchHelper(simpleItemTouchCallback)
 
         itemTouchHelper.attachToRecyclerView(settingsAppList)
 
+        adapter.setItemTouchHelper(itemTouchHelper)
+
         buttonChangeTheme.setOnClickListener {
             val themeChooserDialog = ThemeChooserDialog.getThemeChooser()
             themeChooserDialog.showNow(fragmentManager, "THEME_CHOOSER")

+ 29 - 3
app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/SettingsListAdapter.kt

@@ -1,15 +1,20 @@
 package com.sduduzog.slimlauncher.ui.main.settings
 
+import android.annotation.SuppressLint
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
+import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
 import android.widget.Button
+import android.widget.ImageView
 import android.widget.TextView
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProviders
 import androidx.navigation.Navigation
+import androidx.recyclerview.widget.ItemTouchHelper
 import androidx.recyclerview.widget.RecyclerView
 import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.data.HomeApp
@@ -23,8 +28,11 @@ class SettingsListAdapter(private val fragment: Fragment) : RecyclerView.Adapter
     private var displayedApps: ArrayList<HomeApp> = arrayListOf()
     private var viewModel: MainViewModel = ViewModelProviders.of(fragment).get(MainViewModel::class.java)
 
+    private lateinit var touchHelper: ItemTouchHelper
+
     init {
         viewModel.homeApps.observe(fragment, Observer {
+            Log.d("Adapter", "$it")
             updateApps(it.orEmpty())
         })
     }
@@ -35,6 +43,7 @@ class SettingsListAdapter(private val fragment: Fragment) : RecyclerView.Adapter
         return AppViewHolder(view)
     }
 
+    @SuppressLint("ClickableViewAccessibility")
     override fun onBindViewHolder(holder: AppViewHolder, position: Int) {
         if (position < displayedApps.size) {
             val app = displayedApps[position]
@@ -42,10 +51,22 @@ class SettingsListAdapter(private val fragment: Fragment) : RecyclerView.Adapter
                 holder.itemText.text = this.appName
             }
             holder.itemButton.visibility = View.GONE
+            holder.itemDragger.visibility = View.VISIBLE
+            holder.itemDragger.setOnTouchListener { view, motionEvent ->
+                if (motionEvent.actionMasked == MotionEvent.ACTION_DOWN) {
+                    touchHelper.startDrag(holder)
+                }
+                false
+            }
+            holder.itemView.setOnLongClickListener {
+                RenameAppDialog.rename(app, viewModel).show(fragment.childFragmentManager, "SettingsListAdapter")
+                true
+            }
         } else {
             holder.itemText.text = fragment.getString(R.string.settings_list_item_text)
             holder.itemText.alpha = .3f
             holder.itemButton.visibility = View.VISIBLE
+            holder.itemDragger.visibility = View.GONE
             val bundle = Bundle()
             bundle.putInt("index", position)
             holder.itemButton.setOnClickListener(
@@ -62,13 +83,13 @@ class SettingsListAdapter(private val fragment: Fragment) : RecyclerView.Adapter
         displayedApps.addAll(newList)
         if (size > newList.size) {
             notifyItemRemoved(deletedFrom)
-        }
-        else if (size < newList.size) notifyItemRangeChanged(size, displayedApps.size - size)
+        } else if (size < newList.size) notifyItemRangeChanged(size, displayedApps.size - size)
+        else notifyDataSetChanged()
 
     }
 
     override fun onViewMoved(oldPosition: Int, newPosition: Int): Boolean {
-        if ((oldPosition < displayedApps.size) and (newPosition < displayedApps.size)){
+        if ((oldPosition < displayedApps.size) and (newPosition < displayedApps.size)) {
             val app1 = displayedApps[oldPosition]
             val app2 = displayedApps[newPosition]
             app1.sortingIndex = newPosition
@@ -94,9 +115,14 @@ class SettingsListAdapter(private val fragment: Fragment) : RecyclerView.Adapter
         viewModel.updateApps(displayedApps)
     }
 
+    fun setItemTouchHelper(touchHelper: ItemTouchHelper) {
+        this.touchHelper = touchHelper
+    }
+
     inner class AppViewHolder(view: View)// Bind item views here
         : RecyclerView.ViewHolder(view) {
         val itemText: TextView = view.findViewById(R.id.item_text)
         val itemButton: Button = view.findViewById(R.id.item_button)
+        val itemDragger: ImageView = view.findViewById(R.id.item_dragger)
     }
 }

+ 9 - 0
app/src/main/res/drawable/ic_drag_handle.xml

@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?android:colorForeground"
+        android:pathData="M20,9H4v2h16V9zM4,15h16v-2H4v2z"/>
+</vector>

+ 15 - 0
app/src/main/res/layout/settings_list_item.xml

@@ -45,4 +45,19 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="@+id/item_text" />
 
+    <ImageView
+        android:id="@+id/item_dragger"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginBottom="8dp"
+        android:alpha="0.5"
+        android:padding="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/ic_drag_handle"
+        android:contentDescription="@string/settings_itrem_icon_gradder" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 18 - 0
app/src/main/res/layout/settings_rename_app.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="vertical" android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <EditText
+        android:id="@+id/rename_editText"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="20dp"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="20dp"
+        android:layout_marginBottom="0dp"
+        android:ems="10"
+        android:inputType="textPersonName"
+        tools:ignore="Autofill,LabelFor" />
+</LinearLayout>

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

@@ -103,5 +103,6 @@
     <string name="notes_date_placeholder">Edited at %s</string>
 
     <string name="dialer_chevron">deleter</string>
+    <string name="settings_itrem_icon_gradder">Dragger</string>
 
 </resources>