فهرست منبع

setup screen for fresh installs

sduduzog 7 سال پیش
والد
کامیت
fad29ed86e
47فایلهای تغییر یافته به همراه735 افزوده شده و 171 حذف شده
  1. 29 0
      .idea/codeStyles/Project.xml
  2. 38 0
      .idea/misc.xml
  3. 9 0
      .idea/modules.xml
  4. 12 0
      .idea/runConfigurations.xml
  5. 6 0
      .idea/vcs.xml
  6. 16 14
      app/build.gradle
  7. 6 8
      app/src/androidTest/java/com/sduduzog/slimlauncher/DBTest.kt
  8. 2 2
      app/src/androidTest/java/com/sduduzog/slimlauncher/LiveDataTestUtil.kt
  9. 1 1
      app/src/androidTest/java/com/sduduzog/slimlauncher/TestUtil.kt
  10. 0 1
      app/src/main/AndroidManifest.xml
  11. 3 2
      app/src/main/java/com/sduduzog/slimlauncher/MainActivity.kt
  12. 0 16
      app/src/main/java/com/sduduzog/slimlauncher/data/App.kt
  13. 0 16
      app/src/main/java/com/sduduzog/slimlauncher/data/HomeApp.kt
  14. 1 1
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/AboutFragment.kt
  15. 20 24
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/AppsFragment.kt
  16. 2 2
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/AppsListAdapter.kt
  17. 2 2
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainAppsAdapter.kt
  18. 9 9
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainFragment.kt
  19. 12 9
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsFragment.kt
  20. 2 2
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsListAdapter.kt
  21. 6 3
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/ThemeChooserDialog.kt
  22. 16 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/App.kt
  23. 3 6
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppDao.kt
  24. 3 6
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppRepository.kt
  25. 4 4
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppRoomDatabase.java
  26. 16 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/HomeApp.kt
  27. 7 10
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/MainViewModel.kt
  28. 8 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/setup/DialogInteractionListener.kt
  29. 240 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/setup/SetupFragment.kt
  30. 9 0
      app/src/main/res/drawable/ic_check.xml
  31. 4 4
      app/src/main/res/layout-sw600dp/main_content.xml
  32. 2 2
      app/src/main/res/layout-sw600dp/main_fragment.xml
  33. 2 2
      app/src/main/res/layout-sw600dp/main_list_item.xml
  34. 2 2
      app/src/main/res/layout/apps_fragment.xml
  35. 2 2
      app/src/main/res/layout/fragment_about.xml
  36. 5 5
      app/src/main/res/layout/main_bottom_sheet.xml
  37. 4 4
      app/src/main/res/layout/main_content.xml
  38. 2 2
      app/src/main/res/layout/main_fragment.xml
  39. 2 2
      app/src/main/res/layout/main_list_item.xml
  40. 2 2
      app/src/main/res/layout/settings_apps_list_item.xml
  41. 4 4
      app/src/main/res/layout/settings_fragment.xml
  42. 180 0
      app/src/main/res/layout/setup_fragment.xml
  43. 10 1
      app/src/main/res/navigation/nav_graph.xml
  44. 6 0
      app/src/main/res/values-w820dp/dimens.xml
  45. 4 0
      app/src/main/res/values/dimens.xml
  46. 20 1
      app/src/main/res/values/strings.xml
  47. 2 0
      gradle.properties

+ 29 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,29 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <Objective-C-extensions>
+      <file>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
+      </file>
+      <class>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
+      </class>
+      <extensions>
+        <pair source="cpp" header="h" fileNamingConvention="NONE" />
+        <pair source="c" header="h" fileNamingConvention="NONE" />
+      </extensions>
+    </Objective-C-extensions>
+  </code_scheme>
+</component>

+ 38 - 0
.idea/misc.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="NullableNotNullManager">
+    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
+    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
+    <option name="myNullables">
+      <value>
+        <list size="7">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+          <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+          <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+          <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+        </list>
+      </value>
+    </option>
+    <option name="myNotNulls">
+      <value>
+        <list size="6">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+        </list>
+      </value>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 9 - 0
.idea/modules.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/SlimLauncher.iml" filepath="$PROJECT_DIR$/SlimLauncher.iml" />
+      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
+    </modules>
+  </component>
+</project>

+ 12 - 0
.idea/runConfigurations.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 16 - 14
app/build.gradle

@@ -12,7 +12,7 @@ android {
         targetSdkVersion 28
         versionCode 14
         versionName "1.2.6"
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         vectorDrawables.useSupportLibrary = true
     }
     buildTypes {
@@ -33,19 +33,21 @@ dependencies {
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
 
     // Support Libraries
-    implementation 'com.android.support:appcompat-v7:28.0.0'
-    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
-    implementation 'com.android.support:cardview-v7:28.0.0'
-    implementation 'com.android.support:design:28.0.0'
-    implementation 'com.android.support:recyclerview-v7:28.0.0'
+    implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
+    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+    implementation 'androidx.cardview:cardview:1.0.0-rc02'
+    implementation 'com.google.android.material:material:1.0.0-alpha1'
+    implementation 'androidx.recyclerview:recyclerview:1.0.0-rc02'
 
     // Arch Components
-    implementation 'android.arch.lifecycle:extensions:1.1.1'
+    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-rc01'
     implementation 'android.arch.navigation:navigation-fragment:1.0.0-alpha06'
-    implementation 'android.arch.persistence.room:runtime:1.1.1'
-    annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
-    implementation 'android.arch.lifecycle:extensions:1.1.1'
-    annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
+    implementation 'androidx.room:room-runtime:2.0.0-alpha1'
+    implementation 'androidx.legacy:legacy-support-v4:1.0.0-rc02'
+    implementation 'androidx.legacy:legacy-support-v13:1.0.0-alpha1'
+    annotationProcessor "androidx.room:room-compiler:2.0.0-alpha1"
+    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-rc01'
+    annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.0.0-alpha1"
     implementation 'androidx.core:core-ktx:1.0.0'
 
     // 3rd Party libs
@@ -54,7 +56,7 @@ dependencies {
     // Test libs
     testImplementation 'junit:junit:4.12'
     testImplementation 'org.mockito:mockito-core:2.7.6'
-    androidTestImplementation 'android.arch.persistence.room:testing:1.1.1'
-    androidTestImplementation 'com.android.support.test:runner:1.0.2'
-    androidTestImplementation 'com.android.support.test:rules:1.0.2'
+    androidTestImplementation 'androidx.room:room-testing:2.0.0-alpha1'
+    androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
+    androidTestImplementation 'androidx.test:rules:1.1.0-alpha3'
 }

+ 6 - 8
app/src/androidTest/java/com/sduduzog/slimlauncher/DBTest.kt

@@ -1,13 +1,11 @@
 package com.sduduzog.slimlauncher
 
-import android.arch.persistence.room.Room
-import android.content.Context
-import android.support.test.InstrumentationRegistry
-import android.support.test.runner.AndroidJUnit4
-
-import com.sduduzog.slimlauncher.data.App
-import com.sduduzog.slimlauncher.data.AppDao
-import com.sduduzog.slimlauncher.data.AppRoomDatabase
+import androidx.room.Room
+import androidx.test.InstrumentationRegistry
+import androidx.test.runner.AndroidJUnit4
+
+import com.sduduzog.slimlauncher.ui.main.model.AppDao
+import com.sduduzog.slimlauncher.ui.main.model.AppRoomDatabase
 
 import org.junit.After
 import org.junit.Before

+ 2 - 2
app/src/androidTest/java/com/sduduzog/slimlauncher/LiveDataTestUtil.kt

@@ -1,7 +1,7 @@
 package com.sduduzog.slimlauncher
 
-import android.arch.lifecycle.LiveData
-import android.arch.lifecycle.Observer
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Observer
 
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit

+ 1 - 1
app/src/androidTest/java/com/sduduzog/slimlauncher/TestUtil.kt

@@ -1,6 +1,6 @@
 package com.sduduzog.slimlauncher
 
-import com.sduduzog.slimlauncher.data.App
+import com.sduduzog.slimlauncher.ui.main.model.App
 
 internal object TestUtil {
 

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

@@ -14,7 +14,6 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         tools:ignore="GoogleAppIndexingWarning"
-
         tools:replace="android:allowBackup">
         <activity
             android:name=".MainActivity"

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

@@ -1,13 +1,14 @@
 package com.sduduzog.slimlauncher
 
-import android.arch.lifecycle.ViewModelProviders
+import androidx.lifecycle.ViewModelProviders
 import android.content.SharedPreferences
 import android.content.res.Resources
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 import androidx.navigation.NavController
 import androidx.navigation.NavDestination
 import androidx.navigation.Navigation.findNavController
+import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
 
 
 class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, NavController.OnNavigatedListener {

+ 0 - 16
app/src/main/java/com/sduduzog/slimlauncher/data/App.kt

@@ -1,16 +0,0 @@
-package com.sduduzog.slimlauncher.data
-
-import android.arch.persistence.room.ColumnInfo
-import android.arch.persistence.room.Entity
-import android.arch.persistence.room.PrimaryKey
-
-@Entity(tableName = "apps")
-class App {
-    @field:ColumnInfo(name = "app_name")
-    lateinit var appName: String
-    @PrimaryKey
-    @field:ColumnInfo(name = "package_name")
-    lateinit var packageName: String
-    @field:ColumnInfo(name = "activity_name")
-    lateinit var activityName: String
-}

+ 0 - 16
app/src/main/java/com/sduduzog/slimlauncher/data/HomeApp.kt

@@ -1,16 +0,0 @@
-package com.sduduzog.slimlauncher.data
-
-import android.arch.persistence.room.ColumnInfo
-import android.arch.persistence.room.Entity
-import android.arch.persistence.room.PrimaryKey
-
-@Entity(tableName = "home_apps")
-class HomeApp {
-    @field:ColumnInfo(name = "app_name")
-    lateinit var appName: String
-    @PrimaryKey
-    @field:ColumnInfo(name = "package_name")
-    lateinit var packageName: String
-    @field:ColumnInfo(name = "activity_name")
-    lateinit var activityName: String
-}

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

@@ -2,7 +2,7 @@ package com.sduduzog.slimlauncher.ui.main
 
 
 import android.os.Bundle
-import android.support.v4.app.Fragment
+import androidx.fragment.app.Fragment
 import android.text.method.LinkMovementMethod
 import android.view.LayoutInflater
 import android.view.View

+ 20 - 24
app/src/main/java/com/sduduzog/slimlauncher/ui/main/AppsFragment.kt

@@ -1,19 +1,20 @@
 package com.sduduzog.slimlauncher.ui.main
 
-import android.arch.lifecycle.Observer
-import android.arch.lifecycle.ViewModelProviders
 import android.content.Intent
 import android.content.pm.ResolveInfo
 import android.os.Bundle
-import android.support.v4.app.Fragment
-import android.support.v7.widget.RecyclerView
 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.MainViewModel
+import androidx.recyclerview.widget.RecyclerView
 import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.data.App
+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.*
 
 
@@ -26,7 +27,17 @@ class AppsFragment : Fragment() {
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                               savedInstanceState: Bundle?): View? {
-        val view = inflater.inflate(R.layout.apps_fragment, container, false)
+        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)
 
@@ -38,26 +49,11 @@ class AppsFragment : Fragment() {
         for (i in launchables.indices) {
             val item = launchables[i]
             val activity = item.activityInfo
-            val app = App()
-            app.appName = launchables[i].loadLabel(pm).toString()
-            app.packageName = activity.applicationInfo.packageName
-            app.activityName = activity.name
+            val app = App(launchables[i].loadLabel(pm).toString(), activity.applicationInfo.packageName, activity.name)
             apps.add(app)
         }
         mAdapter = AppsListAdapter(listOf(), InteractionHandler())
-        layout = view.findViewById(R.id.appList)
-        layout.adapter = mAdapter
-        return view
-    }
-
-    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)
-            }
-        })
+        appList.adapter = mAdapter
     }
 
     inner class InteractionHandler : OnListFragmentInteractionListener {

+ 2 - 2
app/src/main/java/com/sduduzog/slimlauncher/ui/main/AppsListAdapter.kt

@@ -1,12 +1,12 @@
 package com.sduduzog.slimlauncher.ui.main
 
-import android.support.v7.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
 import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.data.App
+import com.sduduzog.slimlauncher.ui.main.model.App
 
 
 import com.sduduzog.slimlauncher.ui.main.AppsFragment.OnListFragmentInteractionListener

+ 2 - 2
app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainAppsAdapter.kt

@@ -1,12 +1,12 @@
 package com.sduduzog.slimlauncher.ui.main
 
-import android.support.v7.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
 import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.data.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.HomeApp
 
 class MainAppsAdapter(private var mValues: MutableSet<HomeApp>,
                       private val mListener: MainFragment.OnListFragmentInteractionListener?)

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

@@ -1,31 +1,31 @@
 package com.sduduzog.slimlauncher.ui.main
 
 import android.animation.ObjectAnimator
-import android.arch.lifecycle.Observer
-import android.arch.lifecycle.ViewModelProviders
 import android.content.*
 import android.content.Context.MODE_PRIVATE
 import android.net.Uri
 import android.os.Build
 import android.os.Bundle
 import android.provider.MediaStore
-import android.support.design.widget.BottomSheetBehavior
-import android.support.design.widget.BottomSheetBehavior.STATE_COLLAPSED
-import android.support.design.widget.BottomSheetBehavior.STATE_HALF_EXPANDED
-import android.support.v4.app.Fragment
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.FrameLayout
 import android.widget.Toast
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProviders
 import androidx.navigation.Navigation
 import com.daasuu.ei.Ease
 import com.daasuu.ei.EasingInterpolator
+import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HALF_EXPANDED
 import com.sduduzog.slimlauncher.MainActivity
-import com.sduduzog.slimlauncher.MainViewModel
 import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.data.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
 import kotlinx.android.synthetic.main.main_bottom_sheet.*
 import kotlinx.android.synthetic.main.main_content.*
 import java.text.SimpleDateFormat
@@ -100,7 +100,7 @@ class MainFragment : Fragment() {
 
     fun updateUi() {
         val twenty4Hour = context?.getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
-                ?.getBoolean(getString(R.string.prefs_settings_key_clocktype), false)
+                ?.getBoolean(getString(R.string.prefs_settings_key_clock_type), false)
         val date = Date()
         if (twenty4Hour as Boolean) {
             val fWatchTime = SimpleDateFormat("HH:mm", Locale.ENGLISH)

+ 12 - 9
app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsFragment.kt

@@ -1,19 +1,20 @@
 package com.sduduzog.slimlauncher.ui.main
 
 
-import android.arch.lifecycle.Observer
-import android.arch.lifecycle.ViewModelProviders
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProviders
 import android.content.Context.MODE_PRIVATE
 import android.os.Bundle
-import android.support.v4.app.Fragment
-import android.support.v7.widget.LinearLayoutManager
+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.MainViewModel
+import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
 import com.sduduzog.slimlauncher.R
-import com.sduduzog.slimlauncher.data.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.HomeApp
 import kotlinx.android.synthetic.main.settings_fragment.*
 
 
@@ -49,13 +50,15 @@ class SettingsFragment : Fragment() {
         settingsAppList.layoutManager = LinearLayoutManager(activity)
         addButton.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_openAppsFragment))
         changeThemeText.setOnClickListener {
-            val themeChooserDialog = ThemeChooserDialog()
+            val themeChooserDialog = ThemeChooserDialog.getThemeChooser()
             themeChooserDialog.showNow(fragmentManager, TAG)
         }
         val settings = context!!.getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
-        clockTypeChecker.isChecked = settings.getBoolean(getString(R.string.prefs_settings_key_clocktype), false)
+        clockTypeChecker.isChecked = settings.getBoolean(getString(R.string.prefs_settings_key_clock_type), false)
         clockTypeChecker.setOnCheckedChangeListener { _, b ->
-            settings.edit().putBoolean(getString(R.string.prefs_settings_key_clocktype), b).apply()
+            settings.edit {
+                putBoolean(getString(R.string.prefs_settings_key_clock_type), b)
+            }
         }
     }
 

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

@@ -1,13 +1,13 @@
 package com.sduduzog.slimlauncher.ui.main
 
-import android.support.v7.widget.RecyclerView
+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.data.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.HomeApp
 
 class SettingsListAdapter(private var apps: List<HomeApp>, private val listener: SettingsFragment.OnListFragmentInteractionListener) : RecyclerView.Adapter<SettingsListAdapter.AppViewHolder>() {
 

+ 6 - 3
app/src/main/java/com/sduduzog/slimlauncher/ui/main/ThemeChooserDialog.kt

@@ -4,8 +4,9 @@ import android.app.Dialog
 import android.content.Context.MODE_PRIVATE
 import android.content.SharedPreferences
 import android.os.Bundle
-import android.support.v4.app.DialogFragment
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
+import androidx.core.content.edit
+import androidx.fragment.app.DialogFragment
 import com.sduduzog.slimlauncher.R
 
 class ThemeChooserDialog : DialogFragment() {
@@ -19,7 +20,9 @@ class ThemeChooserDialog : DialogFragment() {
         builder.setTitle(R.string.theme_chooser_dialog_title)
         builder.setSingleChoiceItems(R.array.themes_array, active) { dialogInterface, i ->
             dialogInterface.dismiss()
-            settings.edit().putInt(getString(R.string.prefs_settings_key_theme), i).apply()
+            settings.edit {
+                putInt(getString(R.string.prefs_settings_key_theme), i)
+            }
         }
         return builder.create()
     }

+ 16 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/App.kt

@@ -0,0 +1,16 @@
+package com.sduduzog.slimlauncher.ui.main.model
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "apps")
+data class App(
+        @field:ColumnInfo(name = "app_name")
+        var appName: String,
+        @PrimaryKey
+        @field:ColumnInfo(name = "package_name")
+        var packageName: String,
+        @field:ColumnInfo(name = "activity_name")
+        var activityName: String
+)

+ 3 - 6
app/src/main/java/com/sduduzog/slimlauncher/data/AppDao.kt → app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppDao.kt

@@ -1,7 +1,7 @@
-package com.sduduzog.slimlauncher.data
+package com.sduduzog.slimlauncher.ui.main.model
 
-import android.arch.lifecycle.LiveData
-import android.arch.persistence.room.*
+import androidx.lifecycle.LiveData
+import androidx.room.*
 
 @Dao
 interface AppDao {
@@ -16,9 +16,6 @@ interface AppDao {
     @Insert(onConflict = OnConflictStrategy.IGNORE)
     fun insert(app: App)
 
-    @Update
-    fun update(app: App)
-
     @Insert
     fun addHomeApp(app: HomeApp)
 

+ 3 - 6
app/src/main/java/com/sduduzog/slimlauncher/data/AppRepository.kt → app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppRepository.kt

@@ -1,7 +1,7 @@
-package com.sduduzog.slimlauncher.data
+package com.sduduzog.slimlauncher.ui.main.model
 
 import android.app.Application
-import android.arch.lifecycle.LiveData
+import androidx.lifecycle.LiveData
 import android.content.Intent
 import android.content.pm.PackageManager
 import android.content.pm.ResolveInfo
@@ -68,10 +68,7 @@ class AppRepository(application: Application) {
             for (i in launchables.indices) {
                 val item = launchables[i]
                 val activity = item.activityInfo
-                val app = App()
-                app.appName = launchables[i].loadLabel(pm).toString()
-                app.packageName = activity.applicationInfo.packageName
-                app.activityName = activity.name
+                val app = App(launchables[i].loadLabel(pm).toString(), activity.applicationInfo.packageName, activity.name)
                 mAsyncTaskDao.insert(app)
             }
             return null

+ 4 - 4
app/src/main/java/com/sduduzog/slimlauncher/data/AppRoomDatabase.java → app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/AppRoomDatabase.java

@@ -1,8 +1,8 @@
-package com.sduduzog.slimlauncher.data;
+package com.sduduzog.slimlauncher.ui.main.model;
 
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.Room;
-import android.arch.persistence.room.RoomDatabase;
+import androidx.room.Database;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
 import android.content.Context;
 
 @Database(entities = {App.class, HomeApp.class}, version = 1, exportSchema = false)

+ 16 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/model/HomeApp.kt

@@ -0,0 +1,16 @@
+package com.sduduzog.slimlauncher.ui.main.model
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "home_apps")
+data class HomeApp(
+        @field:ColumnInfo(name = "app_name")
+        var appName: String,
+        @PrimaryKey
+        @field:ColumnInfo(name = "package_name")
+        var packageName: String,
+        @field:ColumnInfo(name = "activity_name")
+        var activityName: String
+)

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

@@ -1,11 +1,11 @@
-package com.sduduzog.slimlauncher
+package com.sduduzog.slimlauncher.ui.main.model
 
 import android.app.Application
-import android.arch.lifecycle.AndroidViewModel
-import android.arch.lifecycle.LiveData
-import com.sduduzog.slimlauncher.data.App
-import com.sduduzog.slimlauncher.data.AppRepository
-import com.sduduzog.slimlauncher.data.HomeApp
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.LiveData
+import com.sduduzog.slimlauncher.ui.main.model.App
+import com.sduduzog.slimlauncher.ui.main.model.AppRepository
+import com.sduduzog.slimlauncher.ui.main.model.HomeApp
 
 class MainViewModel(application: Application) : AndroidViewModel(application) {
     private var _repository: AppRepository = AppRepository(application)
@@ -32,10 +32,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
     }
 
     fun addToHomeScreen(app: App) {
-        val home = HomeApp()
-        home.activityName = app.activityName
-        home.appName = app.appName
-        home.packageName = app.packageName
+        val home = HomeApp(app.appName, app.packageName, app.activityName)
         _repository.insert(home)
     }
 }

+ 8 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/setup/DialogInteractionListener.kt

@@ -0,0 +1,8 @@
+package com.sduduzog.slimlauncher.ui.main.setup
+
+import com.sduduzog.slimlauncher.ui.main.model.App
+
+interface DialogInteractionListener {
+    fun onAppsChosen(apps: List<App>)
+    fun onClockChosen()
+}

+ 240 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/setup/SetupFragment.kt

@@ -0,0 +1,240 @@
+package com.sduduzog.slimlauncher.ui.main.setup
+
+
+import android.app.AlertDialog
+import android.app.Dialog
+import android.content.Context.MODE_PRIVATE
+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 android.widget.Toast
+import androidx.core.content.edit
+import androidx.fragment.app.DialogFragment
+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.HomeApp
+import com.sduduzog.slimlauncher.ui.main.model.MainViewModel
+import kotlinx.android.synthetic.main.setup_fragment.*
+import java.util.*
+
+
+class SetupFragment : Fragment(), DialogInteractionListener {
+
+    private lateinit var viewModel: MainViewModel
+    private var state = 0
+    private val apps = mutableListOf<App>()
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                              savedInstanceState: Bundle?): View? {
+        // Inflate the layout for this fragment
+        return inflater.inflate(R.layout.setup_fragment, container, false)
+    }
+
+    override fun onActivityCreated(savedInstanceState: Bundle?) {
+        super.onActivityCreated(savedInstanceState)
+        viewModel = ViewModelProviders.of(activity!!).get(MainViewModel::class.java)
+        setLoading()
+        viewModel.homeApps.observe(this, ValueObserver())
+        setupButton.setOnClickListener {
+            when (state) {
+                1 -> chooseApps()
+                2 -> chooseClock()
+                else -> {
+                    val settings = activity!!.getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
+                    settings.edit {
+                        putBoolean(getString(R.string.prefs_settings_key_fresh_install_setup), false)
+                    }
+                    finishSetup()
+                }
+            }
+        }
+
+    }
+
+    private fun checkFreshInstall() {
+        val settings = activity!!.getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
+        if (settings.getBoolean(getString(R.string.prefs_settings_key_fresh_install_setup), true)) {
+            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)
+            }
+            revealUI(state)
+        } else {
+            finishSetup()
+        }
+    }
+
+    private fun finishSetup() {
+        val nav = Navigation.findNavController(setupContainer)
+        nav.navigate(R.id.action_setupFragment_to_mainFragment2)
+    }
+
+    private fun setLoading() {
+        progressBar.visibility = View.VISIBLE
+        opt1Number.alpha = 0f
+        opt1Text.alpha = 0f
+        opt2Number.alpha = 0f
+        opt2Text.alpha = 0f
+        textViewLets.alpha = 0f
+        setupButton.alpha = 0f
+        tvWelcome.alpha = 0f
+        cvIton.alpha = 0f
+    }
+
+    private fun revealUI(level: Int) {
+        progressBar.visibility = View.INVISIBLE
+        when (level) {
+            0 -> {
+                tvWelcome.animate().alpha(1f).duration = 1000
+                cvIton.animate().alpha(1f).duration = 1500
+                textViewLets.animate().alpha(1f).duration = 1000
+                opt1Text.animate().setStartDelay(1000).alpha(1f).duration = 500
+                opt1Number.animate().setStartDelay(1000).alpha(1f).duration = 500
+                opt2Text.animate().setStartDelay(1500).alpha(1f).duration = 500
+                opt2Number.animate().setStartDelay(1500).alpha(1f).duration = 500
+                setupButton.animate().setStartDelay(2000).alpha(1f).duration = 500
+            }
+            1 -> {
+                setupButton.text = getString(R.string.setup_button_next)
+                ivTick1.visibility = View.VISIBLE
+            }
+            2 -> {
+                ivTick2.visibility = View.VISIBLE
+                setupButton.text = getString(R.string.setup_button_finish)
+            }
+        }
+        state++
+    }
+
+    private fun chooseApps() {
+        ChooseApps.newInstance(this, apps).show(fragmentManager, "APP_CHOOSER")
+    }
+
+    private fun chooseClock() {
+        ChooseClockType.newInstance(this).show(fragmentManager, "CLOCK_CHOOSER")
+    }
+
+    class ChooseApps : DialogFragment() {
+
+        private lateinit var listener: DialogInteractionListener
+        private lateinit var apps: List<App>
+        private lateinit var checkedItems: BooleanArray
+
+        companion object {
+            fun newInstance(listener: DialogInteractionListener, apps: List<App>): ChooseApps {
+                val chooser = ChooseApps()
+                chooser.apps = apps
+                chooser.listener = listener
+                return chooser
+            }
+        }
+
+        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+            val appNames = arrayOfNulls<String>(apps.size)
+            checkedItems = BooleanArray(apps.size)
+            for (i in apps.indices) {
+                appNames[i] = apps[i].appName
+            }
+
+            val builder = AlertDialog.Builder(context!!)
+            builder.setMultiChoiceItems(appNames, checkedItems) { _, i, b ->
+                checkedItems[i] = b
+                if (checkedItems.filter { it }.size == 5) {
+                    setApps()
+                    dismiss()
+                }
+
+            }
+            builder.setPositiveButton("Done") { _, _ ->
+                if (checkedItems.none { it }) {
+                    Toast.makeText(context, "Choose at least one app", Toast.LENGTH_SHORT).show()
+                } else {
+                    setApps()
+                }
+            }
+            return builder.create()
+        }
+
+        private fun setApps() {
+            val list = mutableListOf<App>()
+            for (i in checkedItems.indices) {
+                if (checkedItems[i]) {
+                    list.add(apps[i])
+                }
+            }
+            listener.onAppsChosen(list)
+        }
+    }
+
+    class ChooseClockType : DialogFragment() {
+
+        private lateinit var listener: DialogInteractionListener
+
+        companion object {
+            fun newInstance(listener: DialogInteractionListener): ChooseClockType {
+                val chooser = ChooseClockType()
+                chooser.listener = listener
+                return chooser
+            }
+        }
+
+        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+            val builder = AlertDialog.Builder(context!!)
+            builder.setTitle("Choose clock type")
+            builder.setSingleChoiceItems(R.array.clock_types, 0) { _, i ->
+                val settings = context!!.getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
+                if (i == 0)
+                    settings.edit {
+                        putBoolean(getString(R.string.prefs_settings_key_clock_type), false)
+                    }
+                else
+                    settings.edit {
+                        putBoolean(getString(R.string.prefs_settings_key_clock_type), true)
+                    }
+                listener.onClockChosen()
+                dismiss()
+            }
+            return builder.create()
+        }
+    }
+
+    inner class ValueObserver : Observer<List<HomeApp>> {
+        override fun onChanged(it: List<HomeApp>?) {
+            if (it != null && it.isEmpty()) {
+                checkFreshInstall()
+                viewModel.apps.removeObservers(this@SetupFragment)
+            } else {
+                if (state == 0)
+                    finishSetup()
+            }
+        }
+    }
+
+    override fun onAppsChosen(apps: List<App>) {
+        for (i in apps) {
+            viewModel.addToHomeScreen(i)
+        }
+        revealUI(state)
+    }
+
+    override fun onClockChosen() {
+        revealUI(state)
+    }
+}

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

@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
+</vector>

+ 4 - 4
app/src/main/res/layout-sw600dp/main_content.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<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/main_content"
@@ -27,7 +27,7 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/clockTextView" />
 
-    <android.support.v7.widget.RecyclerView
+    <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/mainAppsList"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
@@ -37,7 +37,7 @@
         android:layout_marginEnd="32dp"
         android:layout_marginRight="32dp"
         android:layout_marginBottom="32dp"
-        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
@@ -53,4 +53,4 @@
         app:layout_constraintStart_toEndOf="@+id/clockTextView"
         app:layout_constraintTop_toTopOf="@+id/clockTextView" />
 
-</android.support.constraint.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
app/src/main/res/layout-sw600dp/main_fragment.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/main"
     android:layout_width="match_parent"
@@ -10,4 +10,4 @@
 
     <include layout="@layout/main_bottom_sheet" />
 
-</android.support.design.widget.CoordinatorLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 2 - 2
app/src/main/res/layout-sw600dp/main_list_item.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
@@ -16,4 +16,4 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
-</android.support.constraint.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
app/src/main/res/layout/apps_fragment.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.recyclerview.widget.RecyclerView 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/appList"
@@ -7,5 +7,5 @@
     android:layout_height="match_parent"
     android:layout_marginStart="16dp"
     android:layout_marginEnd="16dp"
-    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
     tools:listitem="@layout/apps_list_item" />

+ 2 - 2
app/src/main/res/layout/fragment_about.xml

@@ -6,7 +6,7 @@
     android:layout_height="match_parent"
     tools:context="com.sduduzog.slimlauncher.ui.main.AboutFragment">
 
-    <android.support.constraint.ConstraintLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
 
@@ -43,5 +43,5 @@
             app:layout_constraintTop_toBottomOf="@+id/textView5" />
 
 
-    </android.support.constraint.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </ScrollView>

+ 5 - 5
app/src/main/res/layout/main_bottom_sheet.xml

@@ -5,13 +5,13 @@
     android:id="@+id/bottomSheet"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
+    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
     app:behavior_hideable="false"
     app:behavior_peekHeight="60dp"
     tools:context=".MainActivity">
 
 
-    <android.support.v7.widget.CardView
+    <androidx.cardview.widget.CardView
         android:id="@+id/optionsView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -81,9 +81,9 @@
                 android:textSize="24sp" />
 
         </LinearLayout>
-    </android.support.v7.widget.CardView>
+    </androidx.cardview.widget.CardView>
 
-    <android.support.constraint.ConstraintLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/iconTray"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -127,7 +127,7 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:srcCompat="@drawable/ic_photo_camera" />
-    </android.support.constraint.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
 
 </FrameLayout>

+ 4 - 4
app/src/main/res/layout/main_content.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<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/main_content"
@@ -27,7 +27,7 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/clockTextView" />
 
-    <android.support.v7.widget.RecyclerView
+    <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/mainAppsList"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
@@ -36,7 +36,7 @@
         android:layout_marginTop="32dp"
         android:layout_marginEnd="16dp"
         android:layout_marginRight="16dp"
-        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
@@ -52,4 +52,4 @@
         app:layout_constraintStart_toEndOf="@+id/clockTextView"
         app:layout_constraintTop_toTopOf="@+id/clockTextView" />
 
-</android.support.constraint.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
app/src/main/res/layout/main_fragment.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/main"
     android:layout_width="match_parent"
@@ -10,4 +10,4 @@
 
     <include layout="@layout/main_bottom_sheet" />
 
-</android.support.design.widget.CoordinatorLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 2 - 2
app/src/main/res/layout/main_list_item.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
@@ -16,4 +16,4 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
-</android.support.constraint.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
app/src/main/res/layout/settings_apps_list_item.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<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:layout_width="match_parent"
@@ -31,4 +31,4 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-</android.support.constraint.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 4 - 4
app/src/main/res/layout/settings_fragment.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<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/frameLayout"
@@ -32,7 +32,7 @@
         app:layout_constraintTop_toTopOf="@+id/textView8"
         app:layout_constraintVertical_bias="0.31" />
 
-    <android.support.v7.widget.RecyclerView
+    <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/settingsAppList"
         android:layout_width="0dp"
         android:layout_height="0dp"
@@ -60,7 +60,7 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/textView3" />
 
-    <android.support.v7.widget.AppCompatCheckBox
+    <androidx.appcompat.widget.AppCompatCheckBox
         android:id="@+id/clockTypeChecker"
         style="@style/Widget.AppCompat.CompoundButton.CheckBox"
         android:layout_width="wrap_content"
@@ -143,4 +143,4 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/divider2" />
 
-</android.support.constraint.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 180 - 0
app/src/main/res/layout/setup_fragment.xml

@@ -0,0 +1,180 @@
+<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/setupContainer"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.sduduzog.slimlauncher.ui.main.setup.SetupFragment">
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/cvIton"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:layout_marginStart="32dp"
+        android:layout_marginLeft="32dp"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="32dp"
+        android:layout_marginRight="32dp"
+        app:cardBackgroundColor="@android:color/black"
+        app:cardCornerRadius="50dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+            <ImageView
+                android:id="@+id/imageView3"
+                android:layout_width="65dp"
+                android:layout_height="65dp"
+                android:layout_marginStart="8dp"
+                android:layout_marginLeft="8dp"
+                android:layout_marginTop="8dp"
+                android:layout_marginEnd="8dp"
+                android:layout_marginRight="8dp"
+                android:layout_marginBottom="8dp"
+                android:contentDescription="@string/app_name"
+                android:src="@mipmap/ic_launcher"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </androidx.cardview.widget.CardView>
+
+    <Button
+        android:id="@+id/setupButton"
+        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:layout_marginBottom="7dp"
+        android:text="@string/setup_button_start"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent" />
+
+    <TextView
+        android:id="@+id/tvWelcome"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
+        android:text="@string/setup_text_welcome"
+        android:textAppearance="@style/TextAppearance.AppCompat.Large"
+        android:textSize="32sp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/cvIton" />
+
+    <TextView
+        android:id="@+id/textViewLets"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
+        android:text="@string/setup_text_lets_get_you_set_up"
+        android:textAppearance="@style/TextAppearance.AppCompat.Large"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tvWelcome" />
+
+    <TextView
+        android:id="@+id/opt1Text"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginEnd="32dp"
+        android:layout_marginRight="32dp"
+        android:text="@string/setup_text_choose_apps"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        app:layout_constraintEnd_toStartOf="@+id/ivTick1"
+        app:layout_constraintStart_toEndOf="@+id/opt1Number"
+        app:layout_constraintTop_toTopOf="@+id/opt1Number" />
+
+    <ImageView
+        android:id="@+id/ivTick1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginRight="16dp"
+        android:contentDescription="@string/icon_check"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/opt1Text"
+        app:srcCompat="@drawable/ic_check" />
+
+    <TextView
+        android:id="@+id/opt2Text"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginEnd="32dp"
+        android:layout_marginRight="32dp"
+        android:text="@string/setup_text_choose_your_preferred_clock"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        app:layout_constraintEnd_toStartOf="@+id/ivTick2"
+        app:layout_constraintStart_toEndOf="@+id/opt2Number"
+        app:layout_constraintTop_toTopOf="@+id/opt2Number" />
+
+    <ImageView
+        android:id="@+id/ivTick2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="16dp"
+        android:layout_marginRight="16dp"
+        android:contentDescription="@string/icon_check"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/opt2Text"
+        app:srcCompat="@drawable/ic_check" />
+
+    <TextView
+        android:id="@+id/opt1Number"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginTop="32dp"
+        android:text="@string/setup_text_1"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/textViewLets" />
+
+    <TextView
+        android:id="@+id/opt2Number"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginTop="32dp"
+        android:text="@string/setup_text_2"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/opt1Text" />
+
+    <ProgressBar
+        android:id="@+id/progressBar"
+        style="?android:attr/progressBarStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
+        android:layout_marginBottom="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -3,7 +3,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/nav_graph"
-    app:startDestination="@id/mainFragment">
+    app:startDestination="@id/setupFragment">
 
     <fragment
         android:id="@+id/mainFragment"
@@ -36,4 +36,13 @@
         android:name="com.sduduzog.slimlauncher.ui.main.AboutFragment"
         android:label="fragment_about"
         tools:layout="@layout/fragment_about" />
+    <fragment
+        android:id="@+id/setupFragment"
+        android:name="com.sduduzog.slimlauncher.ui.main.setup.SetupFragment"
+        android:label="setup_fragment"
+        tools:layout="@layout/setup_fragment" >
+        <action
+            android:id="@+id/action_setupFragment_to_mainFragment2"
+            app:destination="@id/mainFragment" />
+    </fragment>
 </navigation>

+ 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,3 +1,7 @@
 <?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>

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

@@ -11,6 +11,11 @@
         <item>Candy</item>
     </string-array>
 
+    <string-array name="clock_types">
+        <item>12 Hour</item>
+        <item>24 Hour</item>
+    </string-array>
+
     <string name="prefs_settings">settings</string>
     <string name="prefs_settings_key_theme">key_theme</string>
     <string name="main_slim_options">Slim options</string>
@@ -59,6 +64,20 @@
     <string name="theme_chooser_dialog_title">Change theme</string>
     <string name="main_call_icon">call icon</string>
     <string name="main_photo_camera_icon">photo camera icon</string>
-    <string name="prefs_settings_key_clocktype">clock_type</string>
+    <string name="prefs_settings_key_clock_type">clock_type</string>
+
+    <string name="prefs_settings_key_fresh_install_setup">key_fresh_install_setup</string>
+    <string name="setup_button_start">start</string>
+    <string name="setup_text_welcome">Welcome!</string>
+    <string name="setup_text_lets_get_you_set_up">Lets get you set up!</string>
+    <string name="setup_text_choose_apps">Choose apps that will appear on your home screen</string>
+    <string name="setup_text_choose_your_preferred_clock">Choose your preferred clock type</string>
+    <string name="setup_text_set_the_theme">Set the theme of your choice</string>
+    <string name="icon_check">Icon check</string>
+    <string name="setup_button_next">next</string>
+    <string name="setup_button_finish">Finish</string>
+    <string name="setup_text_1">1.</string>
+    <string name="setup_text_2">2.</string>
+    <string name="setup_text_3">3.</string>
 
 </resources>

+ 2 - 0
gradle.properties

@@ -7,6 +7,8 @@
 # Specifies the JVM arguments used for the daemon process.
 # The setting is particularly useful for tweaking memory settings.
 org.gradle.jvmargs=-Xmx1536m
+android.useAndroidX=true
+android.enableJetifier=true
 # When configured, Gradle will run in incubating parallel mode.
 # This option should only be used with decoupled projects. More details, visit
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects