Просмотр исходного кода

Adds search field options (#143)

Co-authored-by: Joshua Kuestersteffen <jkuester@kuester7.com>
Hayri Bakici 2 лет назад
Родитель
Сommit
b87f65cb1c
24 измененных файлов с 646 добавлено и 107 удалено
  1. 1 1
      app/build.gradle.kts
  2. 28 0
      app/src/main/java/com/sduduzog/slimlauncher/datasource/coreprefs/CorePreferencesRepository.kt
  3. 35 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/ChooseSearchBarPositionDialog.kt
  4. 23 5
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt
  5. 35 9
      app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeAppDrawerFragment.kt
  6. 94 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeSearchFieldFragment.kt
  7. 2 10
      app/src/main/java/com/sduduzog/slimlauncher/ui/options/OptionsFragment.kt
  8. 21 0
      app/src/main/java/com/sduduzog/slimlauncher/utils/Utils.kt
  9. 7 0
      app/src/main/proto/core_preferences.proto
  10. 11 13
      app/src/main/res/layout/customize_app_drawer_fragment.xml
  11. 51 0
      app/src/main/res/layout/customize_app_drawer_fragment_search_field_options.xml
  12. 12 0
      app/src/main/res/layout/home_fragment_bottom.xml
  13. 44 46
      app/src/main/res/layout/home_fragment_content.xml
  14. 13 0
      app/src/main/res/layout/home_fragment_default.xml
  15. 18 22
      app/src/main/res/layout/options_fragment.xml
  16. 9 1
      app/src/main/res/navigation/nav_graph.xml
  17. 13 0
      app/src/main/res/values-de/strings.xml
  18. 1 0
      app/src/main/res/values-fr/strings.xml
  19. 1 0
      app/src/main/res/values-it/strings.xml
  20. 1 0
      app/src/main/res/values-nl/strings.xml
  21. 1 0
      app/src/main/res/values-ru/strings.xml
  22. 13 0
      app/src/main/res/values/strings.xml
  23. 2 0
      app/src/main/res/xml/home_motion_scene.xml
  24. 210 0
      app/src/main/res/xml/home_motion_scene_bottom.xml

+ 1 - 1
app/build.gradle.kts

@@ -78,7 +78,7 @@ dependencies {
     implementation("androidx.constraintlayout:constraintlayout:2.1.4")
     implementation("androidx.datastore:datastore:1.0.0")
     implementation("androidx.datastore:datastore-core:1.0.0")
-    implementation("com.google.protobuf:protobuf-javalite:3.10.0")
+    implementation("com.google.protobuf:protobuf-javalite:3.23.3")
 
     // Arch Components
     implementation("androidx.core:core-ktx:1.9.0")

+ 28 - 0
app/src/main/java/com/sduduzog/slimlauncher/datasource/coreprefs/CorePreferencesRepository.kt

@@ -6,6 +6,7 @@ import androidx.lifecycle.LifecycleCoroutineScope
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.asLiveData
 import com.jkuester.unlauncher.datastore.CorePreferences
+import com.jkuester.unlauncher.datastore.SearchBarPosition
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.first
@@ -57,4 +58,31 @@ class CorePreferencesRepository(
             }
         }
     }
+
+    private fun updateShowSearchBar(showSearchBar: Boolean) {
+        lifecycleScope.launch {
+            corePreferencesStore.updateData {
+                it.toBuilder().setShowSearchBar(showSearchBar).build()
+            }
+        }
+    }
+
+    var showSearchField: Boolean
+        // when upgrading from an older version the property showSearchBar is null
+        // we therefore set default state to true.
+        // This has the reason that protobuf 3 does not allow default values,
+        // see https://stackoverflow.com/a/62435235,
+        // hence making the showSearchBar attribute optional and allow it to be null.
+        // With that we can use a logical implication: hasShowSearchBar -> showSearchBar,
+        // returning true, when the showSearchBar attribute is null.
+        get() = !get().hasShowSearchBar() || get().showSearchBar
+        set(value) = updateShowSearchBar(value)
+
+    fun updateSearchBarPosition(searchBarPosition: SearchBarPosition) {
+        lifecycleScope.launch {
+            corePreferencesStore.updateData {
+                it.toBuilder().setSearchBarPosition(searchBarPosition).build()
+            }
+        }
+    }
 }

+ 35 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/ChooseSearchBarPositionDialog.kt

@@ -0,0 +1,35 @@
+package com.sduduzog.slimlauncher.ui.dialogs
+
+import android.app.AlertDialog
+import android.app.Dialog
+import android.os.Bundle
+import androidx.fragment.app.DialogFragment
+import com.jkuester.unlauncher.datastore.SearchBarPosition
+import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.datasource.UnlauncherDataSource
+import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class ChooseSearchBarPositionDialog : DialogFragment() {
+
+    @Inject
+    lateinit var unlauncherDataSource: UnlauncherDataSource
+
+    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+        val builder = AlertDialog.Builder(requireContext())
+
+        val repo = unlauncherDataSource.corePreferencesRepo
+        val active = repo.get().searchBarPosition.number
+        builder.setTitle(R.string.choose_search_bar_position_dialog_title)
+        builder.setSingleChoiceItems(R.array.search_bar_position_array, active) { dialogInterface, i ->
+            dialogInterface.dismiss()
+            repo.updateSearchBarPosition(SearchBarPosition.forNumber(i))
+        }
+        return builder.create()
+    }
+
+    companion object {
+        fun getSearchBarPositionChooser(): ChooseSearchBarPositionDialog = ChooseSearchBarPositionDialog()
+    }
+}

+ 23 - 5
app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt

@@ -23,6 +23,7 @@ import androidx.fragment.app.viewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.Navigation
 import androidx.recyclerview.widget.LinearLayoutManager
+import com.jkuester.unlauncher.datastore.SearchBarPosition
 import com.jkuester.unlauncher.datastore.UnlauncherApp
 import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.adapters.AppDrawerAdapter
@@ -35,7 +36,8 @@ import com.sduduzog.slimlauncher.ui.dialogs.RenameAppDisplayNameDialog
 import com.sduduzog.slimlauncher.utils.BaseFragment
 import com.sduduzog.slimlauncher.utils.OnLaunchAppListener
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.home_fragment.*
+import kotlinx.android.synthetic.main.home_fragment_default.*
+import kotlinx.android.synthetic.main.home_fragment_content.*
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import java.text.DateFormat
@@ -54,7 +56,16 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
     private lateinit var receiver: BroadcastReceiver
     private lateinit var appDrawerAdapter: AppDrawerAdapter
 
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = inflater.inflate(R.layout.home_fragment, container, false)
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+        val coreRepository = unlauncherDataSource.corePreferencesRepo
+        val layout = when (coreRepository.get().searchBarPosition) {
+            SearchBarPosition.bottom -> R.layout.home_fragment_bottom
+            SearchBarPosition.UNRECOGNIZED,
+            SearchBarPosition.top -> R.layout.home_fragment_default
+            else -> R.layout.home_fragment_default
+        }
+        return inflater.inflate(layout, container, false)
+    }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
@@ -81,12 +92,14 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
             }
         }
 
-        appDrawerAdapter =
-            AppDrawerAdapter(AppDrawerListener(), viewLifecycleOwner, unlauncherAppsRepo)
+        appDrawerAdapter = AppDrawerAdapter(AppDrawerListener(), viewLifecycleOwner, unlauncherAppsRepo)
 
         setEventListeners()
 
         app_drawer_fragment_list.adapter = appDrawerAdapter
+
+        val showSearchBar = unlauncherDataSource.corePreferencesRepo.showSearchField
+        app_drawer_edit_text.visibility = if (showSearchBar) View.VISIBLE else View.GONE
     }
 
     override fun onStart() {
@@ -203,8 +216,13 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
                     }
 
                     motionLayout?.endState -> {
+                        val repository = unlauncherDataSource.corePreferencesRepo
+                        val showSearchField = repository.showSearchField
+                        val activateKeyboard = repository.get().activateKeyboardInDrawer
+
                         // Check for preferences to open the keyboard
-                        if (unlauncherDataSource.corePreferencesRepo.get().activateKeyboardInDrawer) {
+                        // only if the search field is shown
+                        if (showSearchField && activateKeyboard) {
                             app_drawer_edit_text.requestFocus()
                             // show the keyboard and set focus to the EditText when swiping down
                             inputMethodManager.showSoftInput(

+ 35 - 9
app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeAppDrawerFragment.kt

@@ -5,15 +5,20 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.navigation.Navigation
+import com.jkuester.unlauncher.datastore.SearchBarPosition
 import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.datasource.UnlauncherDataSource
 import com.sduduzog.slimlauncher.utils.BaseFragment
+import com.sduduzog.slimlauncher.utils.createTitleAndSubtitleText
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment.*
+import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment
+import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment_search_options
+import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment_visible_apps
 import javax.inject.Inject
 
 @AndroidEntryPoint
 class CustomizeAppDrawerFragment : BaseFragment() {
+
     @Inject
     lateinit var unlauncherDataSource: UnlauncherDataSource
 
@@ -31,16 +36,37 @@ class CustomizeAppDrawerFragment : BaseFragment() {
         customize_app_drawer_fragment_visible_apps
             .setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_customiseAppDrawerFragment_to_customiseAppDrawerAppListFragment))
 
-        setupKeyboardSwitch()
+        setupSearchFieldOptionsButton()
     }
 
-    private fun setupKeyboardSwitch() {
-        val prefsRepo = unlauncherDataSource.corePreferencesRepo
-        customize_app_drawer_open_keyboard_switch.setOnCheckedChangeListener { _, checked ->
-            prefsRepo.updateActivateKeyboardInDrawer(checked)
-        }
-        prefsRepo.liveData().observe(viewLifecycleOwner) {
-            customize_app_drawer_open_keyboard_switch.isChecked = it.activateKeyboardInDrawer
+    private fun setupSearchFieldOptionsButton() {
+        customize_app_drawer_fragment_search_options.setOnClickListener(
+            Navigation.createNavigateOnClickListener(R.id.action_customiseAppDrawerFragment_to_customizeSearchFieldFragment)
+        )
+        val preferencesRepository = unlauncherDataSource.corePreferencesRepo
+        val title = getText(R.string.customize_app_drawer_fragment_search_field_options)
+        preferencesRepository.liveData().observe(viewLifecycleOwner) {
+            val subtitle = if (!it.hasShowSearchBar() || it.showSearchBar) {
+                val pos =
+                    if (it.searchBarPosition == SearchBarPosition.UNRECOGNIZED) {
+                        SearchBarPosition.top.number
+                    } else {
+                        it.searchBarPosition.number
+                    }
+                val positionText = resources.getStringArray(R.array.search_bar_position_array)[pos]
+                val keyboardShownText =
+                    if (it.activateKeyboardInDrawer) getText(R.string.shown) else getText(R.string.hidden)
+                getString(
+                    R.string.customize_app_drawer_fragment_search_field_options_subtitle_status_shown,
+                    positionText,
+                    keyboardShownText
+                )
+            } else {
+                getText(R.string.customize_app_drawer_fragment_search_field_options_subtitle_status_hidden)
+            }
+
+            customize_app_drawer_fragment_search_options.text =
+                createTitleAndSubtitleText(requireContext(), title, subtitle)
         }
     }
 }

+ 94 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeSearchFieldFragment.kt

@@ -0,0 +1,94 @@
+package com.sduduzog.slimlauncher.ui.options
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.datasource.UnlauncherDataSource
+import com.sduduzog.slimlauncher.ui.dialogs.ChooseSearchBarPositionDialog
+import com.sduduzog.slimlauncher.utils.BaseFragment
+import com.sduduzog.slimlauncher.utils.createTitleAndSubtitleText
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_fragment_search_field_options
+
+import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_fragment_search_field_position
+import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_fragment_show_search_field_switch
+import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_open_keyboard_switch
+
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class CustomizeSearchFieldFragment : BaseFragment() {
+
+    @Inject
+    lateinit var unlauncherDataSource: UnlauncherDataSource
+
+    override fun getFragmentView(): ViewGroup = customize_app_drawer_fragment_search_field_options
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? = inflater.inflate(
+        R.layout.customize_app_drawer_fragment_search_field_options,
+        container,
+        false
+    )
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        setupShowSearchBarSwitch()
+        setupSearchBarPositionOption()
+        setupKeyboardSwitch()
+    }
+
+    private fun setupShowSearchBarSwitch() {
+        val prefsRepo = unlauncherDataSource.corePreferencesRepo
+        customize_app_drawer_fragment_show_search_field_switch.setOnCheckedChangeListener { _, checked ->
+            prefsRepo.showSearchField = checked
+            enableSearchBarOptions(checked)
+        }
+        prefsRepo.liveData().observe(viewLifecycleOwner) {
+            val checked = prefsRepo.showSearchField
+            customize_app_drawer_fragment_show_search_field_switch.isChecked = checked
+            enableSearchBarOptions(checked)
+        }
+    }
+
+    private fun enableSearchBarOptions(enabled: Boolean) {
+        customize_app_drawer_fragment_search_field_position.isEnabled = enabled
+        customize_app_drawer_open_keyboard_switch.isEnabled = enabled
+    }
+
+    private fun setupSearchBarPositionOption() {
+        val prefRepo = unlauncherDataSource.corePreferencesRepo
+        customize_app_drawer_fragment_search_field_position.setOnClickListener {
+            val positionDialog = ChooseSearchBarPositionDialog.getSearchBarPositionChooser()
+            positionDialog.showNow(childFragmentManager, "POSITION_CHOOSER")
+        }
+        prefRepo.liveData().observe(viewLifecycleOwner) {
+            val position = it.searchBarPosition.number
+            val title = getText(R.string.customize_app_drawer_fragment_search_bar_position)
+            val subtitle = resources.getTextArray(R.array.search_bar_position_array)[position]
+            customize_app_drawer_fragment_search_field_position.text =
+                createTitleAndSubtitleText(requireContext(), title, subtitle)
+        }
+    }
+
+    private fun setupKeyboardSwitch() {
+        val prefsRepo = unlauncherDataSource.corePreferencesRepo
+        customize_app_drawer_open_keyboard_switch.setOnCheckedChangeListener { _, checked ->
+            prefsRepo.updateActivateKeyboardInDrawer(checked)
+        }
+        prefsRepo.liveData().observe(viewLifecycleOwner) {
+            customize_app_drawer_open_keyboard_switch.isChecked = it.activateKeyboardInDrawer
+        }
+        customize_app_drawer_open_keyboard_switch.text =
+            createTitleAndSubtitleText(
+                requireContext(), R.string.customize_app_drawer_fragment_open_keyboard,
+                R.string.customize_app_drawer_fragment_open_keyboard_subtitle
+            )
+    }
+}

+ 2 - 10
app/src/main/java/com/sduduzog/slimlauncher/ui/options/OptionsFragment.kt

@@ -17,6 +17,7 @@ import com.sduduzog.slimlauncher.datasource.UnlauncherDataSource
 import com.sduduzog.slimlauncher.ui.dialogs.ChangeThemeDialog
 import com.sduduzog.slimlauncher.ui.dialogs.ChooseTimeFormatDialog
 import com.sduduzog.slimlauncher.utils.BaseFragment
+import com.sduduzog.slimlauncher.utils.createTitleAndSubtitleText
 import com.sduduzog.slimlauncher.utils.isActivityDefaultLauncher
 import dagger.hilt.android.AndroidEntryPoint
 import kotlinx.android.synthetic.main.options_fragment.*
@@ -103,15 +104,6 @@ class OptionsFragment : BaseFragment() {
         // have a title text and a subtitle text to indicate that adapting the
         // wallpaper can only be done when app it the default launcher
         val subTitleText = getText(R.string.customize_app_drawer_fragment_auto_theme_wallpaper_subtext_no_default_launcher)
-
-        val spanBuilder = SpannableStringBuilder("$titleText\n$subTitleText")
-        spanBuilder.setSpan(TextAppearanceSpan(context, R.style.TextAppearance_AppCompat_Large), 0, titleText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
-        spanBuilder.setSpan(
-            TextAppearanceSpan(context, R.style.TextAppearance_AppCompat_Small),
-            titleText.length + 1,
-            titleText.length + 1 + subTitleText.length,
-            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
-        )
-        return spanBuilder
+        return createTitleAndSubtitleText(requireContext(), titleText, subTitleText)
     }
 }

+ 21 - 0
app/src/main/java/com/sduduzog/slimlauncher/utils/Utils.kt

@@ -7,8 +7,13 @@ import android.content.res.Configuration
 import android.graphics.Insets
 import android.graphics.Rect
 import android.os.Build
+import android.text.SpannableStringBuilder
+import android.text.Spanned
+import android.text.style.TextAppearanceSpan
 import android.util.DisplayMetrics
 import android.view.WindowInsets
+import androidx.annotation.StringRes
+import com.sduduzog.slimlauncher.R
 
 
 private fun isAppDefaultLauncher(context: Context?): Boolean {
@@ -70,4 +75,20 @@ fun getScreenHeight(activity: Activity): Int {
         activity.windowManager.defaultDisplay.getMetrics(outMetrics)
         outMetrics.heightPixels
     }
+}
+
+fun createTitleAndSubtitleText(context: Context, @StringRes titleRes: Int, @StringRes subtitleRes: Int) : CharSequence
+    = createTitleAndSubtitleText(context, context.getString(titleRes), context.getString(subtitleRes))
+
+fun createTitleAndSubtitleText(context: Context, title: CharSequence, subtitle: CharSequence) : CharSequence {
+    val spanBuilder = SpannableStringBuilder("$title\n$subtitle")
+    spanBuilder.setSpan(TextAppearanceSpan(context, R.style.TextAppearance_AppCompat_Large),
+        0, title.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+    spanBuilder.setSpan(
+        TextAppearanceSpan(context, R.style.TextAppearance_AppCompat_Small),
+        title.length + 1,
+        title.length + 1 + subtitle.length,
+        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+    )
+    return spanBuilder
 }

+ 7 - 0
app/src/main/proto/core_preferences.proto

@@ -6,4 +6,11 @@ option java_multiple_files = true;
 message CorePreferences {
   bool activate_keyboard_in_drawer = 1;
   bool keep_device_wallpaper = 2;
+  optional bool showSearchBar = 3;
+  SearchBarPosition searchBarPosition = 4;
+}
+
+enum SearchBarPosition {
+  top = 0;
+  bottom = 1;
 }

+ 11 - 13
app/src/main/res/layout/customize_app_drawer_fragment.xml

@@ -11,30 +11,28 @@
         android:id="@+id/customize_app_drawer_fragment_visible_apps"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textAppearance="@style/TextAppearance.AppCompat"
         android:layout_marginStart="@dimen/_16sdp"
         android:layout_marginLeft="@dimen/_16sdp"
         android:layout_marginTop="32dp"
         android:layout_marginEnd="@dimen/_16sdp"
         android:layout_marginRight="@dimen/_16sdp"
+        android:text="@string/customize_app_drawer_fragment_visible_apps"
+        android:textAppearance="@style/TextAppearance.AppCompat"
         android:textSize="@dimen/_20ssp"
-        app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        android:text="@string/customize_app_drawer_fragment_visible_apps" />
+        app:layout_constraintTop_toTopOf="parent" />
 
-    <androidx.appcompat.widget.SwitchCompat
-        android:id="@+id/customize_app_drawer_open_keyboard_switch"
-        android:layout_width="match_parent"
+    <TextView
+        android:id="@+id/customize_app_drawer_fragment_search_options"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/_16sdp"
-        android:layout_marginLeft="@dimen/_16sdp"
         android:layout_marginTop="32dp"
         android:layout_marginEnd="@dimen/_16sdp"
-        android:layout_marginRight="@dimen/_16sdp"
-        android:layout_marginBottom="32dp"
-        android:text="@string/customize_app_drawer_fragment_open_keyboard"
+        android:text="@string/customize_app_drawer_fragment_search_field_options"
         android:textAppearance="@style/TextAppearance.AppCompat"
         android:textSize="@dimen/_20ssp"
-        app:layout_constraintTop_toBottomOf="@id/customize_app_drawer_fragment_visible_apps"
-        app:layout_constraintStart_toStartOf="parent"/>
+        app:layout_constraintStart_toStartOf="@id/customize_app_drawer_fragment_visible_apps"
+        app:layout_constraintTop_toBottomOf="@id/customize_app_drawer_fragment_visible_apps" />
+
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 51 - 0
app/src/main/res/layout/customize_app_drawer_fragment_search_field_options.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout 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/customize_app_drawer_fragment_search_field_options"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ui.options.CustomizeSearchFieldFragment">
+
+    <TextView
+        android:id="@+id/customize_app_drawer_fragment_search_field_position"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="32dp"
+        android:text="@string/customize_app_drawer_fragment_search_bar_position"
+        android:textAppearance="@style/TextAppearance.AppCompat"
+        android:textSize="@dimen/_20ssp"
+        app:layout_constraintStart_toStartOf="@id/customize_app_drawer_fragment_show_search_field_switch"
+        app:layout_constraintTop_toBottomOf="@id/customize_app_drawer_fragment_show_search_field_switch" />
+
+    <androidx.appcompat.widget.SwitchCompat
+        android:id="@+id/customize_app_drawer_fragment_show_search_field_switch"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/_16sdp"
+        android:layout_marginLeft="@dimen/_16sdp"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="@dimen/_16sdp"
+        android:layout_marginRight="@dimen/_16sdp"
+        android:text="@string/customize_app_drawer_fragment_show_search_bar"
+        android:textAppearance="@style/TextAppearance.AppCompat"
+        android:textSize="@dimen/_20ssp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.appcompat.widget.SwitchCompat
+        android:id="@+id/customize_app_drawer_open_keyboard_switch"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/_16sdp"
+        android:layout_marginLeft="@dimen/_16sdp"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="@dimen/_16sdp"
+        android:layout_marginRight="@dimen/_16sdp"
+        android:layout_marginBottom="32dp"
+        android:text="@string/customize_app_drawer_fragment_open_keyboard"
+        android:textAppearance="@style/TextAppearance.AppCompat"
+        android:textSize="@dimen/_20ssp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/customize_app_drawer_fragment_search_field_position" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 12 - 0
app/src/main/res/layout/home_fragment_bottom.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/home_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    app:layoutDescription="@xml/home_motion_scene_bottom">
+
+    <include layout="@layout/home_fragment_content" />
+</androidx.constraintlayout.motion.widget.MotionLayout>

+ 44 - 46
app/src/main/res/layout/home_fragment.xml → app/src/main/res/layout/home_fragment_content.xml

@@ -1,11 +1,49 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<merge 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/home_fragment"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    app:layoutDescription="@xml/home_motion_scene">
+    tools:showIn="@layout/home_fragment_default">
+
+
+    <EditText
+        android:id="@+id/app_drawer_edit_text"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
+        android:ems="10"
+        android:hint="@string/add_apps_fragment_search_apps"
+        android:imeOptions="actionDone"
+        android:inputType="none|textNoSuggestions|textCapWords"
+        android:textSize="@dimen/_18ssp"
+        tools:ignore="Autofill,LabelFor" />
+
+    <ImageView
+        android:id="@+id/home_fragment_call"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/_8sdp"
+        app:srcCompat="@drawable/ic_call"
+        tools:ignore="ContentDescription" />
+
+    <ImageView
+        android:id="@+id/home_fragment_camera"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/_8sdp"
+        app:srcCompat="@drawable/ic_photo_camera"
+        tools:ignore="ContentDescription" />
+
+    <ImageView
+        android:id="@+id/home_fragment_options"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/_8sdp"
+        app:srcCompat="@drawable/ic_cog"
+        tools:ignore="ContentDescription" />
 
     <TextView
         android:id="@+id/home_fragment_time"
@@ -41,46 +79,6 @@
         tools:itemCount="3"
         tools:listitem="@layout/main_fragment_list_item" />
 
-    <ImageView
-        android:id="@+id/home_fragment_options"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="@dimen/_8sdp"
-        app:srcCompat="@drawable/ic_cog"
-        tools:ignore="ContentDescription"/>
-
-    <ImageView
-        android:id="@+id/home_fragment_call"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="@dimen/_8sdp"
-        app:srcCompat="@drawable/ic_call"
-        tools:ignore="ContentDescription" />
-
-    <ImageView
-        android:id="@+id/home_fragment_camera"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="@dimen/_8sdp"
-        app:srcCompat="@drawable/ic_photo_camera"
-        tools:ignore="ContentDescription" />
-
-    <EditText
-        android:id="@+id/app_drawer_edit_text"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="8dp"
-        android:layout_marginLeft="8dp"
-        android:layout_marginTop="32dp"
-        android:layout_marginEnd="8dp"
-        android:layout_marginRight="8dp"
-        android:ems="10"
-        android:hint="@string/add_apps_fragment_search_apps"
-        android:imeOptions="actionDone"
-        android:inputType="none|textNoSuggestions|textCapWords"
-        android:textSize="@dimen/_18ssp"
-        tools:ignore="Autofill,LabelFor" />
-
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/app_drawer_fragment_list"
         android:layout_width="0dp"
@@ -91,4 +89,4 @@
         android:layout_marginRight="8dp"
         app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
         tools:listitem="@layout/add_app_fragment_list_item" />
-</androidx.constraintlayout.motion.widget.MotionLayout>
+</merge>

+ 13 - 0
app/src/main/res/layout/home_fragment_default.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.motion.widget.MotionLayout 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/home_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    app:layoutDescription="@xml/home_motion_scene"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+
+    <include layout="@layout/home_fragment_content" />
+</androidx.constraintlayout.motion.widget.MotionLayout>

+ 18 - 22
app/src/main/res/layout/options_fragment.xml

@@ -27,20 +27,20 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
-    <TextView
-        android:id="@+id/options_fragment_device_settings"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/options_fragment_device_settings"
-        android:textAppearance="@style/TextAppearance.AppCompat"
-        android:layout_marginStart="24dp"
-        android:layout_marginTop="32dp"
-        android:textSize="@dimen/_20ssp"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintBottom_toTopOf="@+id/options_fragment_change_theme"
-        app:layout_constraintVertical_bias="0.17000002"
-        app:layout_constraintVertical_chainStyle="packed"
-        app:layout_constraintTop_toBottomOf="@+id/textView5" />
+        <TextView
+            android:id="@+id/options_fragment_device_settings"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="24dp"
+            android:layout_marginTop="32dp"
+            android:text="@string/options_fragment_device_settings"
+            android:textAppearance="@style/TextAppearance.AppCompat"
+            android:textSize="@dimen/_20ssp"
+            app:layout_constraintBottom_toTopOf="@+id/options_fragment_change_theme"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/textView5"
+            app:layout_constraintVertical_bias="0.17000002"
+            app:layout_constraintVertical_chainStyle="packed" />
 
         <TextView
             android:id="@+id/options_fragment_change_theme"
@@ -125,17 +125,13 @@
             android:id="@+id/options_fragment_auto_device_theme_wallpaper"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginStart="@dimen/_16sdp"
-            android:layout_marginLeft="@dimen/_16sdp"
             android:layout_marginTop="32dp"
-            android:layout_marginEnd="@dimen/_16sdp"
-            android:layout_marginRight="@dimen/_16sdp"
-            android:layout_marginBottom="32dp"
             android:text="@string/customize_app_drawer_fragment_auto_theme_wallpaper_text"
             android:textAppearance="@style/TextAppearance.AppCompat"
-            android:textSize="@dimen/_18ssp"
-            app:layout_constraintTop_toBottomOf="@id/options_fragment_customize_app_drawer"
-            app:layout_constraintStart_toStartOf="parent"/>
+            android:textSize="@dimen/_20ssp"
+            android:layout_marginStart="@dimen/_16sdp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/options_fragment_customize_app_drawer" />
     </androidx.constraintlayout.widget.ConstraintLayout>
 
 </ScrollView>

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

@@ -9,7 +9,7 @@
         android:id="@+id/homeFragment"
         android:name="com.sduduzog.slimlauncher.ui.main.HomeFragment"
         android:label="home_fragment"
-        tools:layout="@layout/home_fragment">
+        tools:layout="@layout/home_fragment_default">
         <action
             android:id="@+id/action_homeFragment_to_optionsFragment"
             app:destination="@id/optionsFragment" />
@@ -56,11 +56,19 @@
         <action
             android:id="@+id/action_customiseAppDrawerFragment_to_customiseAppDrawerAppListFragment"
             app:destination="@id/customiseAppDrawerAppListFragment" />
+        <action
+            android:id="@+id/action_customiseAppDrawerFragment_to_customizeSearchFieldFragment"
+            app:destination="@id/customizeSearchFieldFragment" />
     </fragment>
     <fragment
         android:id="@+id/customiseAppDrawerAppListFragment"
         android:name="com.sduduzog.slimlauncher.ui.options.CustomizeAppDrawerAppListFragment"
         android:label="customise_app_drawer_app_list_fragment"
         tools:layout="@layout/customize_app_drawer_app_list_fragment" />
+    <fragment
+        android:id="@+id/customizeSearchFieldFragment"
+        android:name="com.sduduzog.slimlauncher.ui.options.CustomizeSearchFieldFragment"
+        android:label="customize_app_drawer_search_field_fragment"
+        tools:layout="@layout/customize_app_drawer_fragment_search_field_options" />
 
 </navigation>

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

@@ -24,6 +24,8 @@
     <string name="choose_theme_dialog_title">Stil auswählen</string>
     <string name="app_name">Unlauncher</string>
     <string name="choose_time_format_dialog_title">Zeitformat</string>
+    <string name="shown">angezeigt</string>
+    <string name="hidden">versteckt</string>
     <string name="customise_apps_fragment_add">Hinzufügen</string>
     <string name="customise_apps_fragment_remove_all">Alle entfernen</string>
     <string name="main_fragment_options">Einstellungen</string>
@@ -39,11 +41,22 @@
     <string name="options_fragment_toggle_status_bar">Statusleiste umschalten</string>
     <string name="options_fragment_hide_status_bar">Statusleiste verstecken</string>
     <string name="options_fragment_show_status_bar">Statusleiste zeigen</string>
+    <string name="customize_app_drawer_fragment_search_field_options">Suchfeldoptionen</string>
+    <string name="customize_app_drawer_fragment_search_field_options_subtitle_status_hidden">Suchfeld nicht sichtbar</string>
+    <string name="customize_app_drawer_fragment_search_field_options_subtitle_status_shown">Suchfeldposition %s, Tastatur %s</string>
+    <string name="customize_app_drawer_fragment_show_search_bar">Suchfeld anzeigen</string>
+    <string name="customize_app_drawer_fragment_search_bar_position">Position</string>
+    <string-array name="search_bar_position_array">
+        <item>Oben</item>
+        <item>Unten</item>
+    </string-array>
     <string name="customize_app_drawer_fragment_open_keyboard">Tastatur anzeigen</string>
     <string name="customize_app_drawer_fragment_visible_apps">Appsichtbarkeit einstellen</string>
     <string name="customize_app_drawer_fragment_auto_theme_wallpaper_text">Themenhintergrund verwenden</string>
     <string name="customize_app_drawer_fragment_auto_theme_wallpaper_subtext_no_default_launcher">Unlauncher muss die standard Start-App sein</string>
+    <string name="choose_search_bar_position_dialog_title">Setze Position des Suchfelds</string>
     <string name="menu_reset">Zurücksetzen</string>
+    <string name="customize_app_drawer_fragment_open_keyboard_subtitle">Tastatur anzeigen, wenn der App-Drawer angezeigt wird</string>
     <string name="remove_all_apps_dialog_title">Alle Apps entfernen</string>
     <string name="remove_all_apps_dialog_message">"Alle Apps bleiben installiert."
         "Bitte das Leeren der Liste bestätigen."</string>

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

@@ -29,6 +29,7 @@
     <string name="options_fragment_toggle_status_bar">Afficher/Cacher la Barre de Statut</string>
     <string name="options_fragment_hide_status_bar">Cacher la Barre de Statut</string>
     <string name="options_fragment_show_status_bar">Afficher la Barre de Statut</string>
+    <string name="customize_app_drawer_fragment_search_bar_position">Position</string>
     <string name="customise_apps_fragment_add">Ajouter</string>
     <string name="menu_rename">Renommer</string>
     <string name="menu_remove">Supprimer</string>

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

@@ -29,6 +29,7 @@
     <string name="options_fragment_toggle_status_bar">Mostra/nascondi barra di stato</string>
     <string name="options_fragment_hide_status_bar">Nascondi la barra di stato</string>
     <string name="options_fragment_show_status_bar">Mostra la barra di stato</string>
+    <string name="customize_app_drawer_fragment_search_bar_position">Posizione</string>
     <string name="customise_apps_fragment_add">Aggiungi</string>
     <string name="menu_rename">Rinomina</string>
     <string name="menu_remove">Rimuovi</string>

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

@@ -32,6 +32,7 @@
     <string name="options_fragment_toggle_status_bar">Statusbalk tonen/verbergen</string>
     <string name="options_fragment_hide_status_bar">Statusbalk verbergen</string>
     <string name="options_fragment_show_status_bar">Statusbalk tonen</string>
+    <string name="customize_app_drawer_fragment_search_bar_position">Positie</string>
     <string name="customise_apps_fragment_add">Toevoegen</string>
     <string name="menu_rename">Naam wijzigen</string>
     <string name="menu_remove">Verwijderen</string>

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

@@ -2,6 +2,7 @@
 <resources>
     <string name="choose_theme_dialog_title">Выбрать тему</string>
     <string name="choose_time_format_dialog_title">Выбрать формат времени</string>
+    <string name="customize_app_drawer_fragment_search_bar_position">Положение</string>
     <string name="customise_apps_fragment_add">Добавить</string>
     <string name="customise_apps_fragment_remove_all">Удалить все</string>
     <string name="main_fragment_options">Настройки</string>

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

@@ -47,10 +47,23 @@
     <string name="customize_app_drawer_fragment_auto_theme_wallpaper_text">Set theme background as wallpaper</string>
     <string name="customize_app_drawer_fragment_auto_theme_wallpaper_subtext_no_default_launcher">App needs to be default launcher</string>
     <string name="customize_app_drawer_fragment_visible_apps">Visible Apps</string>
+    <string name="customize_app_drawer_fragment_search_field_options">Search Field Options</string>
+    <string name="customize_app_drawer_fragment_search_field_options_subtitle_status_hidden">Search Field is hidden</string>
+    <string name="customize_app_drawer_fragment_search_field_options_subtitle_status_shown">%s position, keyboard is %s</string>
+    <string name="customize_app_drawer_fragment_show_search_bar">Show Search Field</string>
+    <string name="customize_app_drawer_fragment_search_bar_position">Position</string>
+    <string name="customize_app_drawer_fragment_open_keyboard_subtitle">Display keyboard when showing the app drawer</string>
+    <string-array name="search_bar_position_array">
+        <item>Top</item>
+        <item>Bottom</item>
+    </string-array>
+    <string name="shown">shown</string>
+    <string name="hidden">hidden</string>
     <string name="customise_apps_fragment_add">Add</string>
     <string name="menu_rename">Rename</string>
     <string name="menu_remove">Remove</string>
     <string name="choose_theme_dialog_title">Choose Theme</string>
+    <string name="choose_search_bar_position_dialog_title">Set position of the Search Field</string>
     <string name="add_apps_fragment_search_apps">Search apps</string>
     <string name="customise_apps_fragment_remove_all">Remove all</string>
     <string name="menu_reset">Reset</string>

+ 2 - 0
app/src/main/res/xml/home_motion_scene.xml

@@ -95,6 +95,7 @@
             android:layout_marginTop="32dp"
             android:layout_marginEnd="8dp"
             android:layout_marginRight="8dp"
+            app:visibilityMode="ignore"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="parent" />
@@ -189,6 +190,7 @@
             android:layout_marginTop="32dp"
             android:layout_marginEnd="8dp"
             android:layout_marginRight="8dp"
+            app:visibilityMode="ignore"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

+ 210 - 0
app/src/main/res/xml/home_motion_scene_bottom.xml

@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:motion="http://schemas.android.com/apk/res-auto">
+    <Transition
+        motion:constraintSetEnd="@+id/home_motion_02"
+        motion:constraintSetStart="@+id/home_motion_01"
+        motion:duration="250">
+        <OnSwipe
+            motion:dragDirection="dragUp"
+            motion:touchAnchorId="@+id/home_fragment_list"
+            motion:touchAnchorSide="bottom" />
+    </Transition>
+
+    <ConstraintSet android:id="@+id/home_motion_01">
+        <Constraint
+            android:id="@+id/home_fragment_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/_42sdp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.506"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@+id/home_fragment_date"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="@dimen/_4sdp"
+            android:textSize="@dimen/_12sdp"
+            app:layout_constraintEnd_toEndOf="@+id/home_fragment_time"
+            app:layout_constraintStart_toStartOf="@+id/home_fragment_time"
+            app:layout_constraintTop_toBottomOf="@+id/home_fragment_time" />
+        <Constraint
+            android:id="@+id/home_fragment_list"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/_16sdp"
+            android:layout_marginLeft="@dimen/_16sdp"
+            android:layout_marginTop="8dp"
+            android:layout_marginEnd="@dimen/_16sdp"
+            android:layout_marginRight="@dimen/_16sdp"
+            app:layout_constraintBottom_toTopOf="@+id/home_fragment_list_exp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.0"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/home_fragment_date"
+            app:layout_constraintVertical_bias="0.3"
+            app:layout_constraintVertical_chainStyle="packed" />
+        <Constraint
+            android:id="@+id/home_fragment_list_exp"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/_16sdp"
+            android:layout_marginLeft="@dimen/_16sdp"
+            android:layout_marginEnd="@dimen/_16sdp"
+            android:layout_marginRight="@dimen/_16sdp"
+            android:layout_marginBottom="@dimen/_8sdp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.0"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/home_fragment_list" />
+        <Constraint
+            android:id="@+id/home_fragment_options"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/_8sdp"
+            android:alpha="1"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/home_fragment_camera"
+            app:layout_constraintStart_toEndOf="@+id/home_fragment_call" />
+        <Constraint
+            android:id="@+id/home_fragment_call"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/_8sdp"
+            android:layout_marginBottom="@dimen/_8sdp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+        <Constraint
+            android:id="@+id/home_fragment_camera"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="@dimen/_8sdp"
+            android:layout_marginBottom="@dimen/_8sdp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent" />
+        <Constraint
+            android:id="@+id/app_drawer_edit_text"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:layout_marginLeft="8dp"
+            android:layout_marginTop="32dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginRight="8dp"
+            app:visibilityMode="ignore"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/app_drawer_fragment_list" />
+        <Constraint
+            android:id="@+id/app_drawer_fragment_list"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginStart="8dp"
+            android:layout_marginLeft="8dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginRight="8dp"
+            android:alpha="-1"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="parent" />
+    </ConstraintSet>
+
+    <ConstraintSet android:id="@+id/home_motion_02">
+        <Constraint
+            android:id="@+id/home_fragment_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/_64sdp"
+            android:alpha="-1"
+            app:layout_constraintBottom_toTopOf="@+id/home_fragment_date"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent" />
+        <Constraint
+            android:id="@+id/home_fragment_date"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:alpha="-1"
+            app:layout_constraintBottom_toTopOf="parent"
+            app:layout_constraintEnd_toEndOf="@+id/home_fragment_time"
+            app:layout_constraintStart_toStartOf="@+id/home_fragment_time" />
+        <Constraint
+            android:id="@+id/home_fragment_list"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/_16sdp"
+            android:layout_marginLeft="@dimen/_16sdp"
+            android:layout_marginEnd="@dimen/_16sdp"
+            android:layout_marginRight="@dimen/_16sdp"
+            android:alpha="-1"
+            app:layout_constraintBottom_toTopOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent" />
+        <Constraint
+            android:id="@+id/home_fragment_list_exp"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/_16sdp"
+            android:layout_marginLeft="@dimen/_16sdp"
+            android:layout_marginEnd="@dimen/_16sdp"
+            android:layout_marginRight="@dimen/_16sdp"
+            android:layout_marginBottom="@dimen/_8sdp"
+            android:alpha="-1"
+            app:layout_constraintBottom_toTopOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent" />
+        <Constraint
+            android:id="@+id/home_fragment_options"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:alpha="-3"
+            app:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@+id/home_fragment_call"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/_8sdp"
+            android:alpha="-1"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@+id/home_fragment_camera"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="@dimen/_8sdp"
+            android:alpha="-1"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@+id/app_drawer_edit_text"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:layout_marginLeft="8dp"
+            android:layout_marginTop="32dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginRight="8dp"
+            app:visibilityMode="ignore"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent" />
+        <Constraint
+            android:id="@+id/app_drawer_fragment_list"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginStart="8dp"
+            android:layout_marginLeft="8dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginRight="8dp"
+            app:layout_constraintBottom_toTopOf="@id/app_drawer_edit_text"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+    </ConstraintSet>
+</MotionScene>