Jelajahi Sumber

Changed settings page
Changed database version with app index

sduduzog 7 tahun lalu
induk
melakukan
61ab97240d
27 mengubah file dengan 490 tambahan dan 229 penghapusan
  1. 5 5
      app/build.gradle
  2. 3 0
      app/src/main/AndroidManifest.xml
  3. 0 68
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/AppsFragment.kt
  4. 118 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/DummyActivity.kt
  5. 24 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt
  6. 0 43
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsListAdapter.kt
  7. 19 1
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppRoomDatabase.kt
  8. 3 1
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/HomeApp.kt
  9. 10 3
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/MainViewModel.kt
  10. 51 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/AppsFragment.kt
  11. 25 15
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/AppsListAdapter.kt
  12. 5 34
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/SettingsFragment.kt
  13. 80 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/SettingsListAdapter.kt
  14. 1 1
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/ThemeChooserDialog.kt
  15. 1 3
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/setup/SetupFragment.kt
  16. 16 18
      app/src/main/res/layout-v21/settings_fragment.xml
  17. 6 0
      app/src/main/res/layout/activity_dummy.xml
  18. 22 0
      app/src/main/res/layout/fragment_dummy.xml
  19. 13 0
      app/src/main/res/layout/home_framgent.xml
  20. 17 19
      app/src/main/res/layout/settings_fragment.xml
  21. 22 9
      app/src/main/res/layout/settings_list_item.xml
  22. 11 0
      app/src/main/res/menu/menu_dummy.xml
  23. 2 2
      app/src/main/res/navigation/nav_graph.xml
  24. 6 0
      app/src/main/res/values-w820dp/dimens.xml
  25. 4 0
      app/src/main/res/values/dimens.xml
  26. 21 7
      app/src/main/res/values/strings.xml
  27. 5 0
      app/src/test/java/com/sduduzog/slimlauncher/ExampleUnitTest.java

+ 5 - 5
app/build.gradle

@@ -37,7 +37,7 @@ dependencies {
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
 
     // Support Libraries
-    implementation 'androidx.appcompat:appcompat:1.0.0'
+    implementation 'androidx.appcompat:appcompat:1.0.2'
     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
     implementation 'androidx.cardview:cardview:1.0.0'
     implementation 'androidx.recyclerview:recyclerview:1.0.0'
@@ -46,11 +46,11 @@ dependencies {
     implementation 'com.google.android.material:material:1.0.0'
 
     // Arch Components
-    implementation 'androidx.core:core-ktx:1.0.0'
+    implementation 'androidx.core:core-ktx:1.0.1'
     implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
     implementation 'android.arch.navigation:navigation-fragment:1.0.0-alpha07'
-    implementation 'androidx.room:room-runtime:2.1.0-alpha01'
-    kapt "androidx.room:room-compiler:2.1.0-alpha01"
+    implementation 'androidx.room:room-runtime:2.1.0-alpha02'
+    kapt "androidx.room:room-compiler:2.1.0-alpha02"
     kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"
 
     // 3rd Party libs
@@ -59,7 +59,7 @@ dependencies {
     // Test libs
     testImplementation 'junit:junit:4.12'
     testImplementation 'org.mockito:mockito-core:2.19.0'
-    androidTestImplementation 'androidx.room:room-testing:2.1.0-alpha01'
+    androidTestImplementation 'androidx.room:room-testing:2.1.0-alpha02'
     androidTestImplementation 'androidx.test:runner:1.1.0'
     androidTestImplementation 'androidx.test:rules:1.1.0'
     androidTestImplementation 'androidx.annotation:annotation:1.0.0'

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

@@ -28,6 +28,9 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity
+            android:name=".ui.main.DummyActivity"
+            android:label="@string/title_activity_dummy" />
     </application>
 
 </manifest>

+ 0 - 68
app/src/main/java/com/sduduzog/slimlauncher/ui/main/AppsFragment.kt

@@ -1,68 +0,0 @@
-package com.sduduzog.slimlauncher.ui.main
-
-import android.content.Intent
-import android.content.pm.ResolveInfo
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProviders
-import androidx.navigation.Navigation
-import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.ui.main.model.App
-import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
-import kotlinx.android.synthetic.main.apps_fragment.*
-import java.util.*
-
-
-class AppsFragment : Fragment() {
-
-    private var apps: MutableList<App> = mutableListOf()
-    private lateinit var viewModel: MainViewModel
-    private lateinit var mAdapter: AppsListAdapter
-
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
-                              savedInstanceState: Bundle?): View? {
-        return inflater.inflate(R.layout.apps_fragment, container, false)
-    }
-
-    override fun onActivityCreated(savedInstanceState: Bundle?) {
-        super.onActivityCreated(savedInstanceState)
-        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
-        viewModel.apps.observe(this, Observer {
-            if (it != null) {
-                mAdapter.setList(it)
-            }
-        })
-        val pm = activity!!.packageManager
-        val main = Intent(Intent.ACTION_MAIN, null)
-
-        main.addCategory(Intent.CATEGORY_LAUNCHER)
-
-        val launchables = pm.queryIntentActivities(main, 0)
-        Collections.sort(launchables,
-                ResolveInfo.DisplayNameComparator(pm))
-        for (i in launchables.indices) {
-            val item = launchables[i]
-            val activity = item.activityInfo
-            val app = App(launchables[i].loadLabel(pm).toString(), activity.applicationInfo.packageName, activity.name)
-            apps.add(app)
-        }
-        mAdapter = AppsListAdapter(listOf(), InteractionHandler())
-        appList.adapter = mAdapter
-    }
-
-    inner class InteractionHandler : OnListFragmentInteractionListener {
-        override fun onListFragmentInteraction(app: App) {
-            viewModel.addToHomeScreen(app)
-            val nav = Navigation.findNavController(appList)
-            nav.popBackStack()
-        }
-    }
-
-    interface OnListFragmentInteractionListener {
-        fun onListFragmentInteraction(app: App)
-    }
-}

+ 118 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/DummyActivity.kt

@@ -0,0 +1,118 @@
+package com.sduduzog.slimlauncher.ui.main
+
+import android.os.Bundle
+import android.view.*
+import androidx.appcompat.app.AppCompatActivity
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+import com.sduduzog.slimlauncher.R
+import kotlinx.android.synthetic.main.activity_dummy.*
+import kotlinx.android.synthetic.main.fragment_dummy.view.*
+
+class DummyActivity : AppCompatActivity() {
+
+    /**
+     * The [androidx.viewpager.widget.PagerAdapter] that will provide
+     * fragments for each of the sections. We use a
+     * {@link FragmentPagerAdapter} derivative, which will keep every
+     * loaded fragment in memory. If this becomes too memory intensive, it
+     * may be best to switch to a
+     * androidx.fragment.app.FragmentStatePagerAdapter.
+     */
+    private var mSectionsPagerAdapter: SectionsPagerAdapter? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_dummy)
+        // Create the adapter that will return a fragment for each of the three
+        // primary sections of the activity.
+        mSectionsPagerAdapter = SectionsPagerAdapter(supportFragmentManager)
+
+        // Set up the ViewPager with the sections adapter.
+        container.adapter = mSectionsPagerAdapter
+
+
+    }
+
+
+    override fun onCreateOptionsMenu(menu: Menu): Boolean {
+        // Inflate the menu; this adds items to the action bar if it is present.
+        menuInflater.inflate(R.menu.menu_dummy, menu)
+        return true
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        // Handle action bar item clicks here. The action bar will
+        // automatically handle clicks on the Home/Up button, so long
+        // as you specify a parent activity in AndroidManifest.xml.
+        val id = item.itemId
+
+        if (id == R.id.action_settings) {
+            return true
+        }
+
+        return super.onOptionsItemSelected(item)
+    }
+
+
+    /**
+     * A [FragmentPagerAdapter] that returns a fragment corresponding to
+     * one of the sections/tabs/pages.
+     */
+    inner class SectionsPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
+
+        override fun getItem(position: Int): Fragment {
+            // getItem is called to instantiate the fragment for the given page.
+            // Return a PlaceholderFragment (defined as a static inner class below).
+            return PlaceholderFragment.newInstance(position + 1)
+        }
+
+        override fun getCount(): Int {
+            // Show 3 total pages.
+            return 3
+        }
+
+        override fun getPageTitle(position: Int): CharSequence? {
+            when (position) {
+                0 -> return "SECTION 1"
+                1 -> return "SECTION 2"
+                2 -> return "SECTION 3"
+            }
+            return null
+        }
+    }
+
+    /**
+     * A placeholder fragment containing a simple view.
+     */
+    class PlaceholderFragment : Fragment() {
+
+        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                                  savedInstanceState: Bundle?): View? {
+            val rootView = inflater.inflate(R.layout.fragment_dummy, container, false)
+            rootView.section_label.text = getString(R.string.section_format, arguments?.getInt(ARG_SECTION_NUMBER))
+            return rootView
+        }
+
+        companion object {
+            /**
+             * The fragment argument representing the section number for this
+             * fragment.
+             */
+            private val ARG_SECTION_NUMBER = "section_number"
+
+            /**
+             * Returns a new instance of this fragment for the given section
+             * number.
+             */
+            fun newInstance(sectionNumber: Int): PlaceholderFragment {
+                val fragment = PlaceholderFragment()
+                val args = Bundle()
+                args.putInt(ARG_SECTION_NUMBER, sectionNumber)
+                fragment.arguments = args
+                return fragment
+            }
+        }
+    }
+}

+ 24 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt

@@ -0,0 +1,24 @@
+package com.sduduzog.slimlauncher.ui.main
+
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.sduduzog.slimlauncher.R
+
+class HomeFragment : Fragment() {
+
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                              savedInstanceState: Bundle?): View? {
+        return inflater.inflate(R.layout.home_framgent, container, false)
+    }
+
+
+    companion object {
+        @JvmStatic
+        fun newInstance() = HomeFragment()
+    }
+}

+ 0 - 43
app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsListAdapter.kt

@@ -1,43 +0,0 @@
-package com.sduduzog.slimlauncher.ui.main
-
-import androidx.recyclerview.widget.RecyclerView
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import android.widget.TextView
-import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.ui.main.model.HomeApp
-
-class SettingsListAdapter(private var apps: List<HomeApp>, private val listener: SettingsFragment.OnListFragmentInteractionListener) : RecyclerView.Adapter<SettingsListAdapter.AppViewHolder>() {
-
-    private lateinit var inflater: LayoutInflater
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder {
-        inflater = LayoutInflater.from(parent.context)
-        val view = inflater.inflate(R.layout.settings_apps_list_item, parent, false)
-        return AppViewHolder(view)
-    }
-
-    override fun onBindViewHolder(holder: AppViewHolder, position: Int) {
-        holder.labelText.text = apps[position].appName
-        holder.removeButton.setOnClickListener {
-            listener.onRemove(apps[position])
-        }
-    }
-
-    override fun getItemCount(): Int {
-        return apps.size
-    }
-
-    internal fun setApps(apps: List<HomeApp>) {
-        this.apps = apps
-        notifyDataSetChanged()
-    }
-
-    inner class AppViewHolder(view: View)// Bind item views here
-        : RecyclerView.ViewHolder(view) {
-        val removeButton: Button = view.findViewById(R.id.settings_item_removeButton)
-        val labelText: TextView = view.findViewById(R.id.settings_list_item_textView)
-    }
-}

+ 19 - 1
app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppRoomDatabase.kt

@@ -4,8 +4,10 @@ import android.content.Context
 import androidx.room.Database
 import androidx.room.Room
 import androidx.room.RoomDatabase
+import androidx.room.migration.Migration
+import androidx.sqlite.db.SupportSQLiteDatabase
 
-@Database(entities = [App::class, HomeApp::class], version = 1, exportSchema = false)
+@Database(entities = [App::class, HomeApp::class], version = 2, exportSchema = false)
 abstract class AppRoomDatabase : RoomDatabase() {
 
     abstract fun appDao(): AppDao
@@ -20,10 +22,26 @@ abstract class AppRoomDatabase : RoomDatabase() {
                 if (INSTANCE == null) {
                     INSTANCE = Room.databaseBuilder(context.applicationContext,
                             AppRoomDatabase::class.java, "app_database")
+                            .addMigrations(MIGRATION_1_2)
                             .build()
                 }
                 return INSTANCE
             }
         }
+
+        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")
+                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'")
+                    cursor.moveToNext()
+                    index++
+                }
+            }
+        }
     }
 }

+ 3 - 1
app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/HomeApp.kt

@@ -12,5 +12,7 @@ data class HomeApp(
         @field:ColumnInfo(name = "package_name")
         var packageName: String,
         @field:ColumnInfo(name = "activity_name")
-        var activityName: String
+        var activityName: String,
+        @field:ColumnInfo(name = "sorting_index")
+        var sortingIndex: Int
 )

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

@@ -28,8 +28,15 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
         _repository.updateApps()
     }
 
-    fun addToHomeScreen(app: App) {
-        val home = HomeApp(app.appName, app.packageName, app.activityName)
-        _repository.insert(home)
+    fun addToHomeScreen(app: HomeApp) {
+        _repository.insert(app)
+    }
+
+    fun addToHomeScreen(apps: List<App>) {
+        for (i in apps.indices){
+            val app = apps[i]
+            val home = HomeApp(app.appName, app.packageName, app.activityName, i)
+            _repository.insert(home)
+        }
     }
 }

+ 51 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/AppsFragment.kt

@@ -0,0 +1,51 @@
+package com.sduduzog.slimlauncher.ui.main.settings
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.ViewModelProviders
+import androidx.navigation.Navigation
+import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
+import kotlinx.android.synthetic.main.apps_fragment.*
+
+
+class AppsFragment : Fragment() {
+
+    private lateinit var viewModel: MainViewModel
+    private lateinit var mAdapter: AppsListAdapter
+    private var appIndex: Int = 0
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        arguments.apply {
+            appIndex = this!!.getInt("index")
+        }
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                              savedInstanceState: Bundle?): View? {
+        return inflater.inflate(R.layout.apps_fragment, container, false)
+    }
+
+    override fun onActivityCreated(savedInstanceState: Bundle?) {
+        super.onActivityCreated(savedInstanceState)
+        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
+
+        mAdapter = AppsListAdapter(this, InteractionHandler(), appIndex)
+        appList.adapter = mAdapter
+    }
+
+    inner class InteractionHandler : OnAppsChooserListener {
+        override fun onAppChosen() {
+            val nav = Navigation.findNavController(appList)
+            nav.popBackStack()
+        }
+    }
+
+    interface OnAppsChooserListener {
+        fun onAppChosen()
+    }
+}

+ 25 - 15
app/src/main/java/com/sduduzog/slimlauncher/ui/main/AppsListAdapter.kt → app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/AppsListAdapter.kt

@@ -1,31 +1,39 @@
-package com.sduduzog.slimlauncher.ui.main
+package com.sduduzog.slimlauncher.ui.main.settings
 
 import androidx.recyclerview.widget.RecyclerView
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProviders
 import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.ui.main.model.App
+import com.sduduzog.slimlauncher.ui.main.model.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
 
 
-import com.sduduzog.slimlauncher.ui.main.AppsFragment.OnListFragmentInteractionListener
+import com.sduduzog.slimlauncher.ui.main.settings.AppsFragment.OnAppsChooserListener
 
 import kotlinx.android.synthetic.main.apps_list_item.view.*
 
 
-class AppsListAdapter(
-        private var mValues: List<App>,
-        private val mListener: OnListFragmentInteractionListener?)
+class AppsListAdapter(fragment: Fragment,
+        private val mListener: OnAppsChooserListener?,
+                      private val appIndex: Int)
     : RecyclerView.Adapter<AppsListAdapter.ViewHolder>() {
 
-    private val mOnClickListener: View.OnClickListener
+    private var mValues: List<App> = listOf()
+    private var viewModel: MainViewModel =  ViewModelProviders.of(fragment).get(MainViewModel::class.java)
 
     init {
-        mOnClickListener = View.OnClickListener { v ->
-            val item = v.tag as App
-            mListener?.onListFragmentInteraction(item)
-        }
+        viewModel.apps.observe(fragment, Observer {
+            if (it != null) {
+                mValues = it
+                notifyDataSetChanged()
+            }
+        })
     }
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@@ -39,15 +47,17 @@ class AppsListAdapter(
         holder.mLabelView.text = item.appName
         with(holder.mView) {
             tag = item
-            setOnClickListener(mOnClickListener)
+            setOnClickListener {
+                val app = it.tag as App
+                val homeApp = HomeApp(app.appName, app.packageName, app.activityName, appIndex)
+                viewModel.addToHomeScreen(homeApp)
+                mListener?.onAppChosen()
+            }
         }
     }
 
     override fun getItemCount(): Int = mValues.size
-    fun setList(apps: List<App>) {
-        mValues = apps
-        notifyDataSetChanged()
-    }
+
 
     inner class ViewHolder(val mView: View) : RecyclerView.ViewHolder(mView) {
         val mLabelView: TextView = mView.label

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

@@ -1,26 +1,20 @@
-package com.sduduzog.slimlauncher.ui.main
+package com.sduduzog.slimlauncher.ui.main.settings
 
 
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProviders
 import android.content.Context.MODE_PRIVATE
 import android.os.Bundle
-import androidx.fragment.app.Fragment
-import androidx.recyclerview.widget.LinearLayoutManager
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.core.content.edit
-import androidx.navigation.Navigation
-import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
 import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.ui.main.model.HomeApp
 import kotlinx.android.synthetic.main.settings_fragment.*
 
 
 class SettingsFragment : Fragment() {
 
-    private lateinit var viewModel: MainViewModel
     private lateinit var adapter: SettingsListAdapter
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
@@ -30,24 +24,10 @@ class SettingsFragment : Fragment() {
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
-        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
-        viewModel.homeApps.observe(this, Observer {
-            if (it != null) {
-                adapter.setApps(it)
-                when (it.size) {
-                    in 0..4 -> addButton.visibility = View.VISIBLE
-                    else -> addButton.visibility = View.GONE
-                }
-            }
-        })
-        var apps = viewModel.homeApps.value
-        if (apps == null)
-            apps = listOf()
-        adapter = SettingsListAdapter(apps, InteractionHandler())
+        adapter = SettingsListAdapter(this)
         settingsAppList.adapter = adapter
         settingsAppList.layoutManager = LinearLayoutManager(activity)
-        addButton.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_openAppsFragment))
-        changeThemeText.setOnClickListener {
+        buttonChangeTheme.setOnClickListener {
             val themeChooserDialog = ThemeChooserDialog.getThemeChooser()
             themeChooserDialog.showNow(fragmentManager, "THEME_CHOOSER")
         }
@@ -60,13 +40,4 @@ class SettingsFragment : Fragment() {
         }
     }
 
-    inner class InteractionHandler : OnListFragmentInteractionListener {
-        override fun onRemove(app: HomeApp) {
-            viewModel.deleteApp(app)
-        }
-    }
-
-    interface OnListFragmentInteractionListener {
-        fun onRemove(app: HomeApp)
-    }
 }

+ 80 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/SettingsListAdapter.kt

@@ -0,0 +1,80 @@
+package com.sduduzog.slimlauncher.ui.main.settings
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+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.RecyclerView
+import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.ui.main.model.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
+
+class SettingsListAdapter(private val fragment: Fragment) : RecyclerView.Adapter<SettingsListAdapter.AppViewHolder>() {
+
+    private lateinit var inflater: LayoutInflater
+    private var apps: List<HomeApp> = listOf()
+    private var viewModel: MainViewModel = ViewModelProviders.of(fragment).get(MainViewModel::class.java)
+
+    init {
+        viewModel.homeApps.observe(fragment, Observer {
+            if (it != null) {
+                apps = it
+                notifyDataSetChanged()
+            }
+        })
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder {
+        inflater = LayoutInflater.from(parent.context)
+        val view = inflater.inflate(R.layout.settings_list_item, parent, false)
+        return AppViewHolder(view)
+    }
+
+    override fun onBindViewHolder(holder: AppViewHolder, position: Int) {
+
+        val app = apps.singleOrNull {
+            it.sortingIndex == position
+        }
+
+        if (app != null) {
+            with(app) {
+                holder.itemText.text = this.appName
+            }
+            holder.itemSubtext.visibility = View.VISIBLE
+            holder.itemButton.visibility = View.GONE
+        } else {
+            holder.itemText.text = fragment.getString(R.string.settings_list_item_text, getNthString(position))
+            holder.itemSubtext.visibility = View.INVISIBLE
+            holder.itemButton.visibility = View.VISIBLE
+            val bundle = Bundle()
+            bundle.putInt("index", position)
+            holder.itemButton.setOnClickListener(
+                    Navigation.createNavigateOnClickListener(R.id.action_openAppsFragment, bundle))
+        }
+    }
+
+    override fun getItemCount() = if (apps.size != 5) apps.size + 1 else apps.size
+
+    private fun getNthString(index: Int): String {
+        val i = index + 1
+        return when (i) {
+            1 -> "${i}st"
+            2 -> "${i}nd"
+            3 -> "${i}rd"
+            else -> "${i}th"
+        }
+    }
+
+    inner class AppViewHolder(view: View)// Bind item views here
+        : RecyclerView.ViewHolder(view) {
+        val itemText: TextView = view.findViewById(R.id.item_text)
+        val itemSubtext: TextView = view.findViewById(R.id.item_subtext)
+        val itemButton: Button = view.findViewById(R.id.item_button)
+    }
+}

+ 1 - 1
app/src/main/java/com/sduduzog/slimlauncher/ui/main/ThemeChooserDialog.kt → app/src/main/java/com/sduduzog/slimlauncher/ui/main/settings/ThemeChooserDialog.kt

@@ -1,4 +1,4 @@
-package com.sduduzog.slimlauncher.ui.main
+package com.sduduzog.slimlauncher.ui.main.settings
 
 import android.app.Dialog
 import android.content.Context.MODE_PRIVATE

+ 1 - 3
app/src/main/java/com/sduduzog/slimlauncher/ui/main/setup/SetupFragment.kt

@@ -230,9 +230,7 @@ class SetupFragment : Fragment(), DialogInteractionListener {
     }
 
     override fun onAppsChosen(apps: List<App>) {
-        for (i in apps) {
-            viewModel.addToHomeScreen(i)
-        }
+        viewModel.addToHomeScreen(apps)
         revealUI(state)
     }
 

+ 16 - 18
app/src/main/res/layout-v21/settings_fragment.xml

@@ -5,51 +5,39 @@
     android:id="@+id/frameLayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".ui.main.SettingsFragment">
+    tools:context=".ui.main.settings.SettingsFragment">
 
     <TextView
         android:id="@+id/textView3"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
-        android:layout_marginTop="32dp"
+        android:layout_marginTop="16dp"
         android:text="@string/settings_title"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-    <Button
-        android:id="@+id/addButton"
-        style="@style/Widget.AppCompat.Button.Borderless"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="8dp"
-        android:text="@string/settings_button_add"
-        app:layout_constraintBottom_toBottomOf="@+id/textView8"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="@+id/textView8"
-        app:layout_constraintVertical_bias="0.31" />
-
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/settingsAppList"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:layout_marginStart="16dp"
         android:layout_marginLeft="16dp"
-        android:layout_marginTop="24dp"
+        android:layout_marginTop="16dp"
         android:layout_marginEnd="16dp"
         android:layout_marginRight="16dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/textView8"
-        tools:listitem="@layout/settings_apps_list_item" />
+        tools:listitem="@layout/settings_list_item" />
 
     <TextView
         android:id="@+id/textView2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="24dp"
-        android:layout_marginTop="24dp"
+        android:layout_marginTop="16dp"
         android:text="@string/settings_text_use_24_hour_clock"
         android:textAppearance="@style/TextAppearance.AppCompat"
         android:textSize="24sp"
@@ -129,11 +117,21 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="24dp"
-        android:layout_marginTop="16dp"
         android:text="@string/settings_text_home_screen_apps"
         android:textAppearance="@style/TextAppearance.AppCompat"
         android:textSize="24sp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/divider2" />
 
+    <Button
+        android:id="@+id/buttonChangeTheme"
+        style="@style/Widget.AppCompat.Button.Borderless"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="16dp"
+        android:text="@string/settings_button_change_theme"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/divider" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
app/src/main/res/layout/activity_dummy.xml

@@ -0,0 +1,6 @@
+<androidx.viewpager.widget.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.sduduzog.slimlauncher.ui.main.DummyActivity" />

+ 22 - 0
app/src/main/res/layout/fragment_dummy.xml

@@ -0,0 +1,22 @@
+<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/constraintLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.sduduzog.slimlauncher.ui.main.DummyActivity$PlaceholderFragment">
+
+    <TextView
+        android:id="@+id/section_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/activity_horizontal_margin"
+        android:layout_marginTop="@dimen/activity_vertical_margin"
+        android:layout_marginEnd="@dimen/activity_horizontal_margin"
+        android:layout_marginBottom="@dimen/activity_vertical_margin"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/constraintLayout"
+        tools:layout_constraintLeft_creator="1"
+        tools:layout_constraintTop_creator="1" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.sduduzog.slimlauncher.ui.main.HomeFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 17 - 19
app/src/main/res/layout/settings_fragment.xml

@@ -5,7 +5,7 @@
     android:id="@+id/frameLayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".ui.main.SettingsFragment">
+    tools:context=".ui.main.settings.SettingsFragment">
 
     <TextView
         android:id="@+id/textView3"
@@ -13,38 +13,25 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
         android:layout_marginLeft="16dp"
-        android:layout_marginTop="32dp"
+        android:layout_marginTop="16dp"
         android:text="@string/settings_title"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-    <Button
-        android:id="@+id/addButton"
-        style="@style/Widget.AppCompat.Button.Borderless"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="8dp"
-        android:layout_marginRight="8dp"
-        android:text="@string/settings_button_add"
-        app:layout_constraintBottom_toBottomOf="@+id/textView8"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="@+id/textView8"
-        app:layout_constraintVertical_bias="0.31" />
-
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/settingsAppList"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:layout_marginStart="16dp"
         android:layout_marginLeft="16dp"
-        android:layout_marginTop="24dp"
+        android:layout_marginTop="16dp"
         android:layout_marginEnd="16dp"
         android:layout_marginRight="16dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/textView8"
-        tools:listitem="@layout/settings_apps_list_item" />
+        tools:listitem="@layout/settings_list_item" />
 
     <TextView
         android:id="@+id/textView2"
@@ -52,7 +39,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="24dp"
         android:layout_marginLeft="24dp"
-        android:layout_marginTop="24dp"
+        android:layout_marginTop="16dp"
         android:text="@string/settings_text_use_24_hour_clock"
         android:textAppearance="@style/TextAppearance.AppCompat"
         android:textSize="24sp"
@@ -134,11 +121,22 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="24dp"
         android:layout_marginLeft="24dp"
-        android:layout_marginTop="16dp"
         android:text="@string/settings_text_home_screen_apps"
         android:textAppearance="@style/TextAppearance.AppCompat"
         android:textSize="24sp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/divider2" />
 
+    <Button
+        android:id="@+id/buttonChangeTheme"
+        style="@style/Widget.AppCompat.Button.Borderless"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginRight="16dp"
+        android:text="@string/settings_button_change_theme"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/divider" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 22 - 9
app/src/main/res/layout/settings_apps_list_item.xml → app/src/main/res/layout/settings_list_item.xml

@@ -1,12 +1,12 @@
 <?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"
-    android:id="@+id/linearLayout"
+    android:id="@+id/settings_list_item"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
 
     <TextView
-        android:id="@+id/settings_list_item_textView"
+        android:id="@+id/item_text"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
@@ -14,21 +14,34 @@
         android:layout_marginTop="8dp"
         android:layout_marginEnd="8dp"
         android:layout_marginRight="8dp"
-        android:layout_marginBottom="8dp"
+        android:text="@string/settings_list_item_text"
         android:textSize="24sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toStartOf="@+id/settings_item_removeButton"
+        app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+    <TextView
+        android:id="@+id/item_subtext"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
+        android:layout_marginBottom="8dp"
+        android:text="@string/settings_list_item_subtext"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@+id/item_text"
+        app:layout_constraintTop_toBottomOf="@+id/item_text" />
+
     <Button
-        android:id="@+id/settings_item_removeButton"
+        android:id="@+id/item_button"
         style="@style/Widget.AppCompat.Button.Borderless"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/settings_item_button_remove"
-        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
+        android:text="@string/settings_list_item_button_set_app"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        app:layout_constraintTop_toTopOf="@+id/item_text" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 11 - 0
app/src/main/res/menu/menu_dummy.xml

@@ -0,0 +1,11 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    tools:context="com.sduduzog.slimlauncher.ui.main.DummyActivity">
+    <item
+        android:id="@+id/action_settings"
+        android:orderInCategory="100"
+        app:showAsAction="never"
+        android:title="@string/action_settings" />
+</menu>
+

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

@@ -19,7 +19,7 @@
     </fragment>
     <fragment
         android:id="@+id/settingsFragment"
-        android:name="com.sduduzog.slimlauncher.ui.main.SettingsFragment"
+        android:name="com.sduduzog.slimlauncher.ui.main.settings.SettingsFragment"
         android:label="fragment_settings"
         tools:layout="@layout/settings_fragment">
         <action
@@ -28,7 +28,7 @@
     </fragment>
     <fragment
         android:id="@+id/appsFragment"
-        android:name="com.sduduzog.slimlauncher.ui.main.AppsFragment"
+        android:name="com.sduduzog.slimlauncher.ui.main.settings.AppsFragment"
         android:label="fragment_apps_list"
         tools:layout="@layout/apps_fragment" />
     <fragment

+ 6 - 0
app/src/main/res/values-w820dp/dimens.xml

@@ -0,0 +1,6 @@
+<resources>
+    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+         (such as screen margins) for screens with more than 820dp of available width. This
+         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+    <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>

+ 4 - 0
app/src/main/res/values/dimens.xml

@@ -1,4 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 
+
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
 </resources>

+ 21 - 7
app/src/main/res/values/strings.xml

@@ -20,14 +20,25 @@
     <string name="prefs_settings_key_theme">key_theme</string>
     <string name="main_slim_options">Slim options</string>
     <string name="main_options_change_theme">Change theme</string>
-    <string name="main_options_home_screen_apps">Home screen settings</string>
+    <string name="main_options_home_screen_apps">Preferences</string>
     <string name="main_options_settings">Settings</string>
     <string name="main_options_about_slim">About Slim</string>
     <string name="main_options_feedback">Rate the app</string>
     <string name="main_options_change_launcher">Change launcher</string>
+
+
+    <!--settings package strings-->
+    <string name="settings_text_use_24_hour_clock">Use 24 hour clock</string>
+    <string name="settings_text_tap_to_check_between_24_hour_or_12_hour">Tap to check between 24 hour or 12 hour</string>
+    <string name="settings_text_tap_to_change_app_theme">Choose from a variety of themes</string>
+    <string name="settings_text_home_screen_apps">Home screen apps</string>
     <string name="settings_item_button_remove">remove</string>
-    <string name="settings_title">Home screen settings</string>
-    <string name="settings_button_add">Add</string>
+    <string name="settings_title">Preferences</string>
+
+    <string name="settings_list_item_button_set_app">Set app</string>
+    <string name="settings_list_item_text">%s app goes here</string>
+    <string name="settings_list_item_subtext">Swipe to remove or drag up/down to reorder</string>
+    <string name="settings_button_change_theme">Change</string>
     <string name="about_title">Slim launcher</string>
     <string name="about_text">
         Created by : Beautus S Gumede\n
@@ -75,11 +86,14 @@
     <string name="setup_button_finish">Finish</string>
     <string name="setup_text_1">1.</string>
     <string name="setup_text_2">2.</string>
-    <string name="settings_text_use_24_hour_clock">Use 24 hour clock</string>
-    <string name="settings_text_tap_to_check_between_24_hour_or_12_hour">Tap to check between 24 hour or 12 hour</string>
-    <string name="settings_text_tap_to_change_app_theme">Tap to change app theme</string>
-    <string name="settings_text_home_screen_apps">Home screen apps</string>
+
     <string name="no_app_selected_toast_msg">Choose at least one app</string>
     <string name="choose_apps_title">Choose Apps</string>
+    <string name="title_activity_dummy">DummyActivity</string>
+    <string name="action_settings">Settings</string>
+    <string name="section_format">Hello World from section: %1$d</string>
+
+    <!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
 
 </resources>

+ 5 - 0
app/src/test/java/com/sduduzog/slimlauncher/ExampleUnitTest.java

@@ -0,0 +1,5 @@
+package com.sduduzog.slimlauncher;
+
+public class ExampleUnitTest {
+
+}