diff --git a/app/src/main/java/com/finnmglas/launcher/Functions.kt b/app/src/main/java/com/finnmglas/launcher/Functions.kt index 454b5c4..4e934c4 100644 --- a/app/src/main/java/com/finnmglas/launcher/Functions.kt +++ b/app/src/main/java/com/finnmglas/launcher/Functions.kt @@ -253,13 +253,22 @@ fun loadSettings(){ fun resetSettings(context: Context) : MutableList{ - // set default theme - saveTheme("finn") - val defaultList :MutableList = mutableListOf() val editor = launcherPreferences.edit() + // set default theme + dominantColor = context.resources.getColor(R.color.finnmglasTheme_background_color) + vibrantColor = context.resources.getColor(R.color.finnmglasTheme_accent_color) + + launcherPreferences.edit() + .putString("background_uri", "") + .putInt("custom_dominant", dominantColor) + .putInt("custom_vibrant", vibrantColor) + .apply() + + saveTheme("finn") + val (chosenUpName, chosenUpPackage) = pickDefaultApp( "action_upApp", context diff --git a/app/src/main/java/com/finnmglas/launcher/settings/SettingsActivity.kt b/app/src/main/java/com/finnmglas/launcher/settings/SettingsActivity.kt index de88bc9..da346fa 100644 --- a/app/src/main/java/com/finnmglas/launcher/settings/SettingsActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/settings/SettingsActivity.kt @@ -59,22 +59,6 @@ class SettingsActivity: AppCompatActivity(), UIObject { if (!intendedSettingsPause) finish() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when (requestCode) { - REQUEST_CHOOSE_APP -> { - val value = data?.getStringExtra("value") - val forApp = data?.getStringExtra("forApp") ?: return - - launcherPreferences.edit() - .putString("action_$forApp", value.toString()) - .apply() - - loadSettings() - } - else -> super.onActivityResult(requestCode, resultCode, data) - } - } - override fun applyTheme() { settings_container.setBackgroundColor(dominantColor) settings_appbar.setBackgroundColor(dominantColor) @@ -93,6 +77,22 @@ class SettingsActivity: AppCompatActivity(), UIObject { startActivity(Intent(Settings.ACTION_SETTINGS)) } } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + when (requestCode) { + REQUEST_CHOOSE_APP -> { + val value = data?.getStringExtra("value") + val forApp = data?.getStringExtra("forApp") ?: return + + launcherPreferences.edit() + .putString("action_$forApp", value.toString()) + .apply() + + loadSettings() + } + else -> super.onActivityResult(requestCode, resultCode, data) + } + } } private val TAB_TITLES = arrayOf( diff --git a/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActions.kt b/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActions.kt index c4a4e34..27c5c5b 100644 --- a/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActions.kt +++ b/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActions.kt @@ -9,7 +9,6 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.LinearLayoutManager import com.finnmglas.launcher.* import com.finnmglas.launcher.list.ListActivity import com.finnmglas.launcher.settings.intendedSettingsPause @@ -36,17 +35,6 @@ class SettingsFragmentActions : Fragment(), UIObject { override fun onStart() { super.onStart() super.onStart() - - // set up the list / recycler - val actionViewManager = LinearLayoutManager(context) - val actionViewAdapter = ActionsRecyclerAdapter( activity!! ) - - settings_actions_rview.apply { - // improve performance (since content changes don't change the layout size) - setHasFixedSize(true) - layoutManager = actionViewManager - adapter = actionViewAdapter - } } override fun applyTheme() { diff --git a/app/src/main/java/com/finnmglas/launcher/settings/actions/ActionsRecyclerAdapter.kt b/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActionsRecycler.kt similarity index 81% rename from app/src/main/java/com/finnmglas/launcher/settings/actions/ActionsRecyclerAdapter.kt rename to app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActionsRecycler.kt index 136075c..de24413 100644 --- a/app/src/main/java/com/finnmglas/launcher/settings/actions/ActionsRecyclerAdapter.kt +++ b/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActionsRecycler.kt @@ -1,20 +1,56 @@ package com.finnmglas.launcher.settings.actions -import android.app.Activity -import android.content.Intent +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import com.finnmglas.launcher.* +import com.finnmglas.launcher.list.ListActivity +import kotlinx.android.synthetic.main.settings_actions_recycler.* +import android.app.Activity +import android.content.Intent import android.widget.Button import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView -import com.finnmglas.launcher.* -import com.finnmglas.launcher.list.ListActivity import com.finnmglas.launcher.libraries.FontAwesome import com.finnmglas.launcher.settings.intendedSettingsPause import java.lang.Exception +/** + * The [SettingsFragmentActionsRecycler] is a fragment containing the [ActionsRecyclerAdapter], + * which displays all selected actions / apps. + * + * It is used in the Tutorial and in Settings + */ +class SettingsFragmentActionsRecycler : Fragment(), UIObject { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.settings_actions_recycler, container, false) + } + + override fun onStart() { + super.onStart() + + // set up the list / recycler + val actionViewManager = LinearLayoutManager(context) + val actionViewAdapter = ActionsRecyclerAdapter( activity!! ) + + settings_actions_rview.apply { + // improve performance (since content changes don't change the layout size) + setHasFixedSize(true) + layoutManager = actionViewManager + adapter = actionViewAdapter + } + + super.onStart() + } +} class ActionsRecyclerAdapter(val activity: Activity): RecyclerView.Adapter() { @@ -47,6 +83,8 @@ class ActionsRecyclerAdapter(val activity: Activity): .putString("action_$actionName", "") // clear it .apply() + loadSettings() // apply new settings to the app + viewHolder.fontAwesome.visibility = View.INVISIBLE viewHolder.img.visibility = View.INVISIBLE viewHolder.removeAction.visibility = View.GONE diff --git a/app/src/main/java/com/finnmglas/launcher/tutorial/TutorialActivity.kt b/app/src/main/java/com/finnmglas/launcher/tutorial/TutorialActivity.kt index 0c4175d..10fbc84 100644 --- a/app/src/main/java/com/finnmglas/launcher/tutorial/TutorialActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/tutorial/TutorialActivity.kt @@ -1,11 +1,17 @@ package com.finnmglas.launcher.tutorial import android.content.Context +import android.content.Intent import android.os.Bundle -import android.util.TypedValue import android.view.* import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter +import androidx.viewpager.widget.ViewPager import com.finnmglas.launcher.* +import com.finnmglas.launcher.tutorial.tab.* +import com.google.android.material.tabs.TabLayout import kotlinx.android.synthetic.main.tutorial.* /** @@ -17,22 +23,25 @@ import kotlinx.android.synthetic.main.tutorial.* */ class TutorialActivity: AppCompatActivity(), UIObject { - private var menuNumber = 0 - private var defaultApps = mutableListOf() - private var isFirstTime = false - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Initialise layout setContentView(R.layout.tutorial) - loadMenu(this) - // Check if it is the first time starting the app - isFirstTime = !launcherPreferences.getBoolean("startedBefore", false) - if (isFirstTime) - defaultApps = resetSettings(this) // UP, DOWN, RIGHT, LEFT, VOLUME_UP, VOLUME_DOWN - else tutorial_appbar.visibility = View.VISIBLE + // Check if the app was started before + if (launcherPreferences.getBoolean("startedBefore", false)) + tutorial_appbar.visibility = View.VISIBLE + else resetSettings(this) + + loadSettings() + + // set up tabs and swiping in settings + val sectionsPagerAdapter = TutorialSectionsPagerAdapter(this, supportFragmentManager) + val viewPager: ViewPager = findViewById(R.id.tutorial_viewpager) + viewPager.adapter = sectionsPagerAdapter + val tabs: TabLayout = findViewById(R.id.tutorial_tabs) + tabs.setupWithViewPager(viewPager) } override fun onStart() { @@ -40,64 +49,62 @@ class TutorialActivity: AppCompatActivity(), UIObject { super.onStart() } - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){ - menuNumber++ - loadMenu(this) - } - else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_BACK){ - menuNumber-- - - // prevent negative indices - if (menuNumber < 0) menuNumber = 0 - - loadMenu(this) - } - return true - } - - fun clickAnywhere(view: View){ - menuNumber++ - loadMenu(this) - } - - private fun loadMenu(context: Context) { // Context needed for packageManager - val intro = resources.getStringArray(R.array.intro) - - if (menuNumber < intro.size){ - val entry = intro[menuNumber].split("|").toTypedArray() //heading|infoText|hintText|size - - tutorial_page_heading.text = entry[0] - if (entry[4] == "1" && isFirstTime) - tutorial_page_text.text = String.format(entry[1], - defaultApps[0], defaultApps[1], defaultApps[2], defaultApps[3], defaultApps[4], defaultApps[5]) - else if (entry[4] == "1" && !isFirstTime) - tutorial_page_text.text = String.format(entry[1], - "-", "-", "-", "-", "-", "-") - else tutorial_page_text.text = entry[1] - tutorial_page_hint.text = entry[2] - tutorial_page_text.setTextSize(TypedValue.COMPLEX_UNIT_SP, entry[3].toFloat()) - - } else { // End intro - if (isFirstTime){ - launcherPreferences.edit() - .putBoolean("startedBefore", true) // never auto run this again - .putLong("firstStartup", System.currentTimeMillis() / 1000L) // record first startup timestamp - .apply() - } - finish() - } - } - override fun applyTheme() { tutorial_appbar.setBackgroundColor(dominantColor) tutorial_container.setBackgroundColor(dominantColor) tutorial_close.setTextColor(vibrantColor) - - tutorial_page_hint.blink() // animate } override fun setOnClicks() { tutorial_close.setOnClickListener() { finish() } } + + // same as in SettingsActivity; TODO: Use same function + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + when (requestCode) { + REQUEST_CHOOSE_APP -> { + val value = data?.getStringExtra("value") + val forApp = data?.getStringExtra("forApp") ?: return + + launcherPreferences.edit() + .putString("action_$forApp", value.toString()) + .apply() + + loadSettings() + } + else -> super.onActivityResult(requestCode, resultCode, data) + } + } + + // Prevent going back, allow if viewed again later + override fun onBackPressed() { + if (launcherPreferences.getBoolean("startedBefore", false)) + super.onBackPressed() + } + } + +/** + * The [TutorialSectionsPagerAdapter] defines which fragments are shown when, + * in the [TutorialActivity]. + * + * Tabs: (Start | Concept | Usage | Setup | Finish) + */ +class TutorialSectionsPagerAdapter(private val context: Context, fm: FragmentManager) + : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return when (position){ + 0 -> TutorialFragmentStart() + 1 -> TutorialFragmentConcept() + 2 -> TutorialFragmentUsage() + 3 -> TutorialFragmentSetup() + 4 -> TutorialFragmentFinish() + else -> Fragment() + } + } + + /* We don't use titles here, as we have the dots */ + override fun getPageTitle(position: Int): CharSequence? { return "" } + override fun getCount(): Int { return 5 } +} \ No newline at end of file diff --git a/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentConcept.kt b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentConcept.kt new file mode 100644 index 0000000..829bfe7 --- /dev/null +++ b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentConcept.kt @@ -0,0 +1,33 @@ +package com.finnmglas.launcher.tutorial.tab + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.finnmglas.launcher.* +import kotlinx.android.synthetic.main.tutorial_concept.* + +/** + * The [TutorialFragmentConcept] is a used as a tab in the TutorialActivity. + * + * It is used to display info about Launchers concept (open source, efficiency ...) + */ +class TutorialFragmentConcept(): Fragment(), UIObject { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.tutorial_concept, container, false) + } + + override fun onStart(){ + super.onStart() + super.onStart() + } + + override fun applyTheme() { + tutorial_concept_container.setBackgroundColor(dominantColor) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentFinish.kt b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentFinish.kt new file mode 100644 index 0000000..49eca17 --- /dev/null +++ b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentFinish.kt @@ -0,0 +1,57 @@ +package com.finnmglas.launcher.tutorial.tab + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.finnmglas.launcher.* +import kotlinx.android.synthetic.main.tutorial_finish.* + +/** + * The [TutorialFragmentFinish] is a used as a tab in the TutorialActivity. + * + * It is used to display further resources and let the user start Launcher + */ +class TutorialFragmentFinish(): Fragment(), UIObject { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.tutorial_finish, container, false) + } + + override fun onStart() { + super.onStart() + super.onStart() + } + + override fun applyTheme() { + tutorial_finish_container.setBackgroundColor(dominantColor) + setButtonColor(tutorial_finish_button_start, vibrantColor) + } + + override fun setOnClicks() { + super.setOnClicks() + tutorial_finish_button_start.setOnClickListener{ finishTutorial() } + } + + override fun adjustLayout() { + super.adjustLayout() + + // Different text if opened again later (from settings) + if (launcherPreferences.getBoolean("startedBefore", false)) + tutorial_finish_button_start.text = "Back to Settings" + } + + private fun finishTutorial() { + if (!launcherPreferences.getBoolean("startedBefore", false)){ + launcherPreferences.edit() + .putBoolean("startedBefore", true) // never auto run this again + .putLong("firstStartup", System.currentTimeMillis() / 1000L) // record first startup timestamp + .apply() + } + activity!!.finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentSetup.kt b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentSetup.kt new file mode 100644 index 0000000..1c21263 --- /dev/null +++ b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentSetup.kt @@ -0,0 +1,33 @@ +package com.finnmglas.launcher.tutorial.tab + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.finnmglas.launcher.* +import kotlinx.android.synthetic.main.tutorial_setup.* + +/** + * The [TutorialFragmentSetup] is a used as a tab in the TutorialActivity. + * + * It is used to display info in the tutorial + */ +class TutorialFragmentSetup(): Fragment(), UIObject { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.tutorial_setup, container, false) + } + + override fun onStart(){ + super.onStart() + super.onStart() + } + + override fun applyTheme() { + tutorial_setup_container.setBackgroundColor(dominantColor) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentStart.kt b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentStart.kt new file mode 100644 index 0000000..527ea6e --- /dev/null +++ b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentStart.kt @@ -0,0 +1,44 @@ +package com.finnmglas.launcher.tutorial.tab + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.finnmglas.launcher.* +import kotlinx.android.synthetic.main.tutorial_start.* + +/** + * The [TutorialFragmentStart] is a used as a tab in the TutorialActivity. + * + * It displays info about the app and gets the user into the tutorial + */ +class TutorialFragmentStart(): Fragment(), UIObject { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.tutorial_start, container, false) + } + + override fun onStart(){ + super.onStart() + super.onStart() + } + + override fun applyTheme() { + tutorial_start_container.setBackgroundColor(dominantColor) + + // set icons + val rightIcon = getString(R.string.fas_angle_double_right) + + tutorial_start_icon_right.text = rightIcon.repeat(3) + tutorial_start_icon_right.setTextColor(vibrantColor) + tutorial_start_icon_right.blink() + + tutorial_start_icon_right_2.text = rightIcon.repeat(3) + tutorial_start_icon_right_2.setTextColor(vibrantColor) + tutorial_start_icon_right_2.blink() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentUsage.kt b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentUsage.kt new file mode 100644 index 0000000..8718079 --- /dev/null +++ b/app/src/main/java/com/finnmglas/launcher/tutorial/tab/TutorialFragmentUsage.kt @@ -0,0 +1,33 @@ +package com.finnmglas.launcher.tutorial.tab + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.finnmglas.launcher.* +import kotlinx.android.synthetic.main.tutorial_usage.* + +/** + * The [TutorialFragmentUsage] is a used as a tab in the TutorialActivity. + * + * Tells the user how his screen will look and how the app can be used + */ +class TutorialFragmentUsage(): Fragment(), UIObject { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.tutorial_usage, container, false) + } + + override fun onStart(){ + super.onStart() + super.onStart() + } + + override fun applyTheme() { + tutorial_usage_container.setBackgroundColor(dominantColor) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/badge_version.png b/app/src/main/res/drawable/badge_version.png new file mode 100644 index 0000000..4ba8ddc Binary files /dev/null and b/app/src/main/res/drawable/badge_version.png differ diff --git a/app/src/main/res/drawable/home_round_screen.png b/app/src/main/res/drawable/home_round_screen.png new file mode 100644 index 0000000..21055dc Binary files /dev/null and b/app/src/main/res/drawable/home_round_screen.png differ diff --git a/app/src/main/res/drawable/tutorial_default_dot.xml b/app/src/main/res/drawable/tutorial_default_dot.xml new file mode 100644 index 0000000..29ebcd3 --- /dev/null +++ b/app/src/main/res/drawable/tutorial_default_dot.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tutorial_selected_dot.xml b/app/src/main/res/drawable/tutorial_selected_dot.xml new file mode 100644 index 0000000..1adc83c --- /dev/null +++ b/app/src/main/res/drawable/tutorial_selected_dot.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tutorial_tab_selector.xml b/app/src/main/res/drawable/tutorial_tab_selector.xml new file mode 100644 index 0000000..67dbf34 --- /dev/null +++ b/app/src/main/res/drawable/tutorial_tab_selector.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/settings_actions.xml b/app/src/main/res/layout/settings_actions.xml index f92d564..02ec01d 100644 --- a/app/src/main/res/layout/settings_actions.xml +++ b/app/src/main/res/layout/settings_actions.xml @@ -9,17 +9,16 @@ android:paddingTop="16sp" android:paddingRight="32sp"> - - - + app:layout_constraintTop_toTopOf="parent"/> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial.xml b/app/src/main/res/layout/tutorial.xml index e74dbf9..c500b87 100644 --- a/app/src/main/res/layout/tutorial.xml +++ b/app/src/main/res/layout/tutorial.xml @@ -8,7 +8,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="?attr/colorPrimary" - android:onClick="clickAnywhere" tools:context=".tutorial.TutorialActivity"> @@ -56,59 +55,27 @@ custom:layout_constraintTop_toTopOf="parent" custom:type="solid" /> - - + + - - - - + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_concept.xml b/app/src/main/res/layout/tutorial_concept.xml new file mode 100644 index 0000000..72ec885 --- /dev/null +++ b/app/src/main/res/layout/tutorial_concept.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/tutorial_finish.xml b/app/src/main/res/layout/tutorial_finish.xml new file mode 100644 index 0000000..1a01d4e --- /dev/null +++ b/app/src/main/res/layout/tutorial_finish.xml @@ -0,0 +1,52 @@ + + + + + + + +