diff --git a/app/src/main/assets/fonts/fa-brands-400.ttf b/app/src/main/assets/fonts/fa-brands-400.ttf deleted file mode 100644 index f75a773..0000000 Binary files a/app/src/main/assets/fonts/fa-brands-400.ttf and /dev/null differ diff --git a/app/src/main/assets/fonts/fa-solid-900.ttf b/app/src/main/assets/fonts/fa-solid-900.ttf deleted file mode 100644 index 7ac7af1..0000000 Binary files a/app/src/main/assets/fonts/fa-solid-900.ttf and /dev/null differ diff --git a/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt b/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt index 34ea301..d72568b 100644 --- a/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/ChooseActivity.kt @@ -1,6 +1,5 @@ package com.finnmglas.launcher -import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.graphics.Color @@ -18,11 +17,8 @@ class ChooseActivity : AppCompatActivity() { val UNINSTALL_REQUEST_CODE = 1 - fun backHome(view: View) { - finish() - } + /** Activity Lifecycle functions */ - @SuppressLint("SetTextI18n") // I do not care override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -36,13 +32,13 @@ class ChooseActivity : AppCompatActivity() { val forApp = bundle.getString("forApp") // which app we choose if (action == "launch") - heading.text = "Launch Apps" + heading.text = getString(R.string.choose_title_launch) else if (action == "pick") { - heading.text = "Choose App" - subheading.text = forApp + heading.text = getString(R.string.choose_title) + subheading.text = forApp // TODO: make translatable } else if (action == "uninstall") - heading.text = "Uninstall Apps" + heading.text = getString(R.string.choose_title_remove) /* Build Layout */ @@ -95,28 +91,21 @@ class ChooseActivity : AppCompatActivity() { } } - override fun onActivityResult( - requestCode: Int, - resultCode: Int, - data: Intent? - ) { + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == UNINSTALL_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { - Toast.makeText( - this, - "Removed the selected application", - Toast.LENGTH_LONG - ).show() + Toast.makeText(this, getString(R.string.choose_removed_toast), Toast.LENGTH_LONG).show() finish() } else if (resultCode == Activity.RESULT_FIRST_USER) { - Toast.makeText( - this, - "Can't remove this app", - Toast.LENGTH_LONG - ).show() + Toast.makeText(this, getString(R.string.choose_not_removed_toast), Toast.LENGTH_LONG).show() finish() } } } + + /** onClick functions */ + + fun backHome(view: View) { finish() } + } diff --git a/app/src/main/java/com/finnmglas/launcher/FirstStartupActivity.kt b/app/src/main/java/com/finnmglas/launcher/FirstStartupActivity.kt index d4dfb37..47e3317 100644 --- a/app/src/main/java/com/finnmglas/launcher/FirstStartupActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/FirstStartupActivity.kt @@ -1,6 +1,5 @@ package com.finnmglas.launcher -import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.os.Bundle @@ -30,12 +29,13 @@ fun View.blink( class FirstStartupActivity : AppCompatActivity(){ - var menuNumber = 0 - var defaultApps = mutableListOf() + /** Variables for this activity */ - /* Overrides */ + private var menuNumber = 0 + private var defaultApps = mutableListOf() + + /** Activity Lifecycle functions */ - @SuppressLint("SetTextI18n") // I do not care override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -48,14 +48,14 @@ class FirstStartupActivity : AppCompatActivity(){ setContentView(R.layout.activity_firststartup) - continue_text.blink() // animate + hintText.blink() // animate loadMenu(this) + + val sharedPref = this.getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE) + defaultApps = resetSettings(sharedPref, this) // UP, DOWN, RIGHT, LEFT, VOLUME_UP, VOLUME_DOWN } - fun clickAnywhere(view: View){ - menuNumber++ - loadMenu(this) - } + /** Touch- and Key-related functions to navigate */ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){ @@ -73,68 +73,30 @@ class FirstStartupActivity : AppCompatActivity(){ return true } - @SuppressLint("SetTextI18n") // I don't care! (Yet) - fun loadMenu(context :Context) { // Context needed for packageManager + fun clickAnywhere(view: View){ + menuNumber++ + loadMenu(this) + } - val sharedPref = this.getSharedPreferences( - getString(R.string.preference_file_key), Context.MODE_PRIVATE) + /** Touch- and Key-related functions to navigate */ - // Intro - if (menuNumber == 0){ - heading.text = "" - description.text = "Take a few seconds to learn how to use this Launcher!\n\n" - continue_text.text = "-- Tap anywhere to continue --" + 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 + + heading.text = entry[0] + if (entry[4] == "1")infoText.text = String.format(entry[1], + defaultApps[0], defaultApps[1], defaultApps[2], defaultApps[3], defaultApps[4], defaultApps[5]) + else infoText.text = entry[1] + hintText.text = entry[2] + infoText.setTextSize(TypedValue.COMPLEX_UNIT_SP, entry[3].toFloat()) + + } else { // End intro + val sharedPref = this.getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE) - defaultApps = resetSettings(sharedPref, context) // UP, DOWN, RIGHT, LEFT, VOLUME_UP, VOLUME_DOWN - } - // Concept - else if (menuNumber == 1){ - heading.text = "Concept" - description.text = "It is designed to be minimal, efficient and free of distraction." - } - else if (menuNumber == 2){ - heading.text = "Concept" - description.text = "It is free of payments, ads and tracking services." - continue_text.text = "-- Tap anywhere to continue --" - } - // Usage - else if (menuNumber == 3){ - heading.text = "Usage" - description.text = "Your home screen contains the local date and time. No distraction." - continue_text.text = "-- Use volume keys to navigate --" - } - else if (menuNumber == 4){ - heading.text = "Usage" - description.text = "You can open your apps with a single swipe or button press." - } - // Setup - else if (menuNumber == 5){ - heading.text = "Setup" - description.setTextSize(TypedValue.COMPLEX_UNIT_SP,36F) - description.text = "We have set up some default actions for you..." - } - else if (menuNumber == 6){ - description.setTextSize(TypedValue.COMPLEX_UNIT_SP,18F) - description.text = "Swipe Up: Open a Browser (" + defaultApps[0] + ")\n\n" + - "Swipe Down: Open internal Search App (" + defaultApps[1] + ")\n\n" + - "Swipe Right: Open Mail (" + defaultApps[2] + ")\n\n" + - "Swipe Left: Open Calendar (" + defaultApps[3] + ")\n\n" + - "Volume Up: Open a messenger (" + defaultApps[4] + ")\n\n" + - "Volume Down: Open Utilities (" + defaultApps[5] + ")" - } - else if (menuNumber == 7){ - heading.text = "Setup" - description.setTextSize(TypedValue.COMPLEX_UNIT_SP,36F) - description.text = "You can choose your own apps:\n\nOpen settings by tapping and holding the home screen." - continue_text.text = "-- Use volume keys to navigate --" - } - else if (menuNumber == 8){ - heading.text = "" - description.text = "You are ready to get started!\n\n I hope this provides great value to you!\n\n- Finn M Glas\n\n" - continue_text.text = "-- Launcher by Finn M Glas --" - } - // End Intro - else { val editor: SharedPreferences.Editor = sharedPref.edit() editor.putBoolean("startedBefore", true) // never run this again editor.putLong("firstStartup", System.currentTimeMillis() / 1000L) // record first startup timestamp @@ -142,6 +104,5 @@ class FirstStartupActivity : AppCompatActivity(){ finish() } - } } diff --git a/app/src/main/java/com/finnmglas/launcher/FontAwesome.java b/app/src/main/java/com/finnmglas/launcher/FontAwesome.java deleted file mode 100644 index 557d827..0000000 --- a/app/src/main/java/com/finnmglas/launcher/FontAwesome.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.finnmglas.launcher; - -import android.content.Context; -import android.graphics.Typeface; -import android.util.AttributeSet; -import android.widget.TextView; - -public class FontAwesome extends androidx.appcompat.widget.AppCompatTextView { - - public FontAwesome(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - public FontAwesome(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public FontAwesome(Context context) { - super(context); - init(); - } - - private void init() { - - //Font name should not contain "/". - Typeface tf = Typeface.createFromAsset(getContext().getAssets(), - "fonts/fa-solid-900.ttf"); - setTypeface(tf); - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/finnmglas/launcher/FontAwesomeBrand.java b/app/src/main/java/com/finnmglas/launcher/FontAwesomeBrand.java deleted file mode 100644 index e42f263..0000000 --- a/app/src/main/java/com/finnmglas/launcher/FontAwesomeBrand.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.finnmglas.launcher; - -import android.content.Context; -import android.graphics.Typeface; -import android.util.AttributeSet; - -public class FontAwesomeBrand extends androidx.appcompat.widget.AppCompatTextView { - - public FontAwesomeBrand(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - public FontAwesomeBrand(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public FontAwesomeBrand(Context context) { - super(context); - init(); - } - - private void init() { - - //Font name should not contain "/". - Typeface tf = Typeface.createFromAsset(getContext().getAssets(), - "fonts/fa-brand-400.ttf"); - setTypeface(tf); - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/finnmglas/launcher/Functions.kt b/app/src/main/java/com/finnmglas/launcher/Functions.kt new file mode 100644 index 0000000..f7d9780 --- /dev/null +++ b/app/src/main/java/com/finnmglas/launcher/Functions.kt @@ -0,0 +1,156 @@ +package com.finnmglas.launcher + +import android.app.Activity +import android.app.AlertDialog +import android.content.Context +import android.content.DialogInterface +import android.content.Intent +import android.content.SharedPreferences +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Bundle +import android.provider.Settings +import android.widget.Toast + +/** Parsing functions */ + +// Related question: https://stackoverflow.com/q/3013655/12787264 +fun parseStringMap(stringArrayResourceId: Int, context: Context): HashMap? { + val stringArray: Array = + context.resources.getStringArray(stringArrayResourceId) + val outputArray = HashMap(stringArray.size) + for (entry in stringArray) { + val splitResult = entry.split("|").toTypedArray() + outputArray.put(splitResult[0], splitResult[1]) + } + return outputArray +} + +/** Activity related */ + +fun isInstalled(uri: String, context: Context): Boolean { + try { + context.packageManager.getPackageInfo(uri, PackageManager.GET_ACTIVITIES) + return true + } catch (e: PackageManager.NameNotFoundException) { + } + return false +} + +private fun getIntent(packageName: String, context: Context): Intent? { + val intent: Intent? = context.packageManager.getLaunchIntentForPackage(packageName) + intent?.addCategory(Intent.CATEGORY_LAUNCHER) + return intent +} + +fun launchApp(packageName: String, context: Context) { + val intent1 = getIntent(packageName, context) + + if (intent1 != null) { + context.startActivity(intent1) + + if (context is Activity) { + context.overridePendingTransition(0, 0) + } + } else { + if (isInstalled(packageName, context)){ + + AlertDialog.Builder(context) + .setTitle(context.getString(R.string.alert_cant_open_title)) + .setMessage(context.getString(R.string.alert_cant_open_message)) + .setPositiveButton(android.R.string.yes, + DialogInterface.OnClickListener { dialog, which -> + openAppSettings(packageName, context) + }) + .setNegativeButton(android.R.string.no, null) + .setIcon(android.R.drawable.ic_dialog_info) + .show() + } else { + Toast.makeText( context, context.getString(R.string.toast_cant_open_message), Toast.LENGTH_SHORT).show() + } + } +} + +fun openNewTabWindow(urls: String, context : Context) { + val uris = Uri.parse(urls) + val intents = Intent(Intent.ACTION_VIEW, uris) + val b = Bundle() + b.putBoolean("new_window", true) + intents.putExtras(b) + context.startActivity(intents) +} + +/** Settings related functions */ + +fun openAppSettings(pkg :String, context:Context){ + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.parse("package:$pkg") + context.startActivity(intent) +} + +fun loadSettings(sharedPref : SharedPreferences){ + upApp = sharedPref.getString("action_upApp", "").toString() + downApp = sharedPref.getString("action_downApp", "").toString() + rightApp = sharedPref.getString("action_rightApp", "").toString() + leftApp = sharedPref.getString("action_leftApp", "").toString() + volumeUpApp = sharedPref.getString("action_volumeUpApp", "").toString() + volumeDownApp = sharedPref.getString("action_volumeDownApp", "").toString() + + calendarApp = sharedPref.getString("action_calendarApp", "").toString() + clockApp = sharedPref.getString("action_clockApp", "").toString() +} + +fun resetSettings(sharedPref : SharedPreferences, context: Context) : MutableList{ + val defaultList :MutableList = mutableListOf() + + val editor: SharedPreferences.Editor = sharedPref.edit() + + val (chosenUpName, chosenUpPackage) = pickDefaultApp("action_upApp", context) + editor.putString("action_upApp", chosenUpPackage) + defaultList.add(chosenUpName) + + val (chosenDownName, chosenDownPackage) = pickDefaultApp("action_downApp", context) + editor.putString("action_downApp", chosenDownPackage) + defaultList.add(chosenDownName) + + val (chosenRightName, chosenRightPackage) = pickDefaultApp("action_rightApp", context) + editor.putString("action_rightApp", chosenRightPackage) + defaultList.add(chosenRightName) + + val (chosenLeftName, chosenLeftPackage) = pickDefaultApp("action_leftApp", context) + editor.putString("action_leftApp", chosenLeftPackage) + editor.putString("action_calendarApp", chosenLeftPackage) + defaultList.add(chosenLeftName) + + val (chosenVolumeUpName, chosenVolumeUpPackage) = pickDefaultApp("action_volumeUpApp", context) + editor.putString("action_volumeUpApp", chosenVolumeUpPackage) + defaultList.add(chosenVolumeUpName) + + val (chosenVolumeDownName, chosenVolumeDownPackage) = pickDefaultApp("action_volumeDownApp", context) + editor.putString("action_volumeDownApp", chosenVolumeDownPackage) + defaultList.add(chosenVolumeDownName) + + val (_, chosenClockPackage) = pickDefaultApp("action_clockApp", context) + editor.putString("action_clockApp", chosenClockPackage) + + editor.apply() + + return defaultList // UP, DOWN, RIGHT, LEFT, VOLUME_UP, VOLUME_DOWN +} + +fun pickDefaultApp(action: String, context: Context) : Pair{ + val arrayResource = when (action) { + "action_upApp" -> R.array.default_up + "action_downApp" -> R.array.default_down + "action_rightApp" -> R.array.default_right + "action_leftApp" -> R.array.default_left + "action_volumeUpApp" -> R.array.default_volume_up + "action_volumeDownApp" -> R.array.default_volume_down + "action_clockApp" -> R.array.default_clock + else -> return Pair(context.getString(R.string.none_found), "") // just prevent crashing on unknown input + } + + val defaultAppsMap = parseStringMap(arrayResource, context) + for (item in defaultAppsMap!!) if (isInstalled(item.key, context)) return Pair(item.value, item.key) + return Pair(context.getString(R.string.none_found), "") +} diff --git a/app/src/main/java/com/finnmglas/launcher/MainActivity.kt b/app/src/main/java/com/finnmglas/launcher/MainActivity.kt index 6902b7c..676f196 100644 --- a/app/src/main/java/com/finnmglas/launcher/MainActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/MainActivity.kt @@ -1,15 +1,10 @@ package com.finnmglas.launcher -import android.annotation.SuppressLint -import android.app.AlertDialog -import android.content.ActivityNotFoundException import android.content.Context -import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.util.DisplayMetrics import android.view.* -import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.GestureDetectorCompat import kotlinx.android.synthetic.main.activity_main.* @@ -18,7 +13,7 @@ import java.util.* import kotlin.concurrent.fixedRateTimer import kotlin.math.abs -// App Launch Actions +/** Variables for all of the app */ var upApp = "" var downApp = "" var rightApp = "" @@ -30,91 +25,16 @@ var calendarApp = "" var clockApp = "" class MainActivity : AppCompatActivity(), -GestureDetector.OnGestureListener, -GestureDetector.OnDoubleTapListener { + GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { + /** Variables for this activity */ private lateinit var mDetector: GestureDetectorCompat // get device dimensions private val displayMetrics = DisplayMetrics() + private var clockTimer = Timer() - private fun getIntent(packageName: String): Intent? { - val intent: Intent? = packageManager.getLaunchIntentForPackage(packageName) - intent?.addCategory(Intent.CATEGORY_LAUNCHER) - return intent - } - - private fun launchApp(packageName: String) { - val intent1 = getIntent(packageName) - - if (intent1 != null) { - applicationContext.startActivity(intent1) - overridePendingTransition(0, 0) - } else { - if (isInstalled(packageName, this)){ - - AlertDialog.Builder(this) - .setTitle("Can't open app") - .setMessage("Want to change its settings ('add it to the apps screen')?") - .setPositiveButton(android.R.string.yes, - DialogInterface.OnClickListener { dialog, which -> - openAppSettings(packageName, this) - }) - .setNegativeButton(android.R.string.no, null) - .setIcon(android.R.drawable.ic_dialog_info) - .show() - } else { - Toast.makeText( - this, - "Open settings to choose an app for this action", - Toast.LENGTH_SHORT - ).show() - } - } - } - - fun launchCalendar(v: View) { - launchApp(calendarApp) - } - - fun launchClock(v: View) { - launchApp(clockApp) - } - - fun launchUpApp() { - launchApp(upApp) - } - - fun launchDownApp() { - launchApp(downApp) - } - - fun lauchLeftApp() { - launchApp(leftApp) - } - - fun lauchRightApp() { - launchApp(rightApp) - } - - fun lauchVolumeUpApp() { - launchApp(volumeUpApp) - } - - fun lauchVolumeDownApp() { - launchApp(volumeDownApp) - } - - /* Overrides */ - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) return true - else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) lauchVolumeUpApp() - else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) lauchVolumeDownApp() - return true - } - - @SuppressLint("SetTextI18n") // I do not care + /** Activity Lifecycle functions */ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -126,8 +46,6 @@ GestureDetector.OnDoubleTapListener { if (!sharedPref.getBoolean("startedBefore", false)) startActivity(Intent(this, FirstStartupActivity::class.java)) - loadSettings(sharedPref) - // Flags window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, @@ -135,40 +53,54 @@ GestureDetector.OnDoubleTapListener { ) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) - val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault()) - - fixedRateTimer("timer", false, 0L, 1000) { - this@MainActivity.runOnUiThread { - dateView.text = dateFormat.format(Date()) - timeView.text = timeFormat.format(Date()) // not " GMT" - } - } - setContentView(R.layout.activity_main) + } + + override fun onStart(){ + super.onStart() + + // Preferences + val sharedPref = this.getSharedPreferences( + getString(R.string.preference_file_key), Context.MODE_PRIVATE) + + loadSettings(sharedPref) mDetector = GestureDetectorCompat(this, this) mDetector.setOnDoubleTapListener(this) } - override fun onTouchEvent(event: MotionEvent): Boolean { - return if (mDetector.onTouchEvent(event)) { - true - } else { - super.onTouchEvent(event) + override fun onResume() { + super.onResume() + + val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) + val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault()) + + clockTimer = fixedRateTimer("timer", true, 0L, 1000) { + this@MainActivity.runOnUiThread { + dateView.text = dateFormat.format(Date()) + timeView.text = timeFormat.format(Date()) + } } } - override fun onDown(event: MotionEvent): Boolean { + override fun onPause() { + super.onPause() + clockTimer.cancel() + } + + /** Touch- and Key-related functions to start activities */ + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) return true + else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) launchApp(volumeUpApp, this) + else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) launchApp(volumeDownApp, this) return true } - override fun onFling( - e1: MotionEvent, - e2: MotionEvent, - differenceX: Float, - differenceY: Float - ): Boolean { + fun dateViewOnTouch(v: View) { launchApp(calendarApp, this) } + fun timeViewOnTouch(v: View) { launchApp(clockApp, this) } + + override fun onFling(e1: MotionEvent, e2: MotionEvent, dX: Float, dY: Float): Boolean { windowManager.defaultDisplay.getMetrics(displayMetrics) val width = displayMetrics.widthPixels @@ -177,55 +109,33 @@ GestureDetector.OnDoubleTapListener { val diffX = e1.x - e2.x val diffY = e1.y - e2.y - val strictness = 4 // of direction + val strictness = 4 // how distinguished the swipe has to be to be accepted - /* Decide for an action */ - - if (diffY > height / 8 && abs(diffY) > strictness * abs(diffX)) launchUpApp() - // Only open if the swipe was not from the phone edge - else if (diffY < -height / 8 && abs(diffY) > strictness * abs(diffX) && e1.y > 100) launchDownApp() - else if (diffX > width / 4 && abs(diffX) > strictness * abs(diffY)) lauchLeftApp() - else if (diffX < -width / 4 && abs(diffX) > strictness * abs(diffY)) lauchRightApp() + // Only open if the swipe was not from the phones top edge + if (diffY < -height / 8 && abs(diffY) > strictness * abs(diffX) && e1.y > 100) launchApp(downApp, this) + else if (diffY > height / 8 && abs(diffY) > strictness * abs(diffX)) launchApp(upApp, this) + else if (diffX > width / 4 && abs(diffX) > strictness * abs(diffY)) launchApp(leftApp, this) + else if (diffX < -width / 4 && abs(diffX) > strictness * abs(diffY)) launchApp(rightApp, this) return true } - // Open Settings + // Open Settings Activity override fun onLongPress(event: MotionEvent) { startActivity(Intent(this, SettingsActivity::class.java)) } - override fun onScroll( - e1: MotionEvent, - e2: MotionEvent, - diffX: Float, - diffY: Float - ): Boolean { - return true - } - - override fun onShowPress(event: MotionEvent) { - - } - - override fun onSingleTapUp(event: MotionEvent): Boolean { - - return true - } - - override fun onDoubleTap(event: MotionEvent): Boolean { - - return true - } - - override fun onDoubleTapEvent(event: MotionEvent): Boolean { - - return true - } - - override fun onSingleTapConfirmed(event: MotionEvent): Boolean { - - return true + override fun onTouchEvent(event: MotionEvent): Boolean { + return if (mDetector.onTouchEvent(event)) { true } else { super.onTouchEvent(event) } } + /* TODO: Remove those. For now they are necessary + * because this inherits from GestureDetector.OnGestureListener */ + override fun onDoubleTap(event: MotionEvent): Boolean { return true } + override fun onDoubleTapEvent(event: MotionEvent): Boolean { return true } + override fun onDown(event: MotionEvent): Boolean { return true } + override fun onScroll(e1: MotionEvent, e2: MotionEvent, dX: Float, dY: Float): Boolean { return true } + override fun onShowPress(event: MotionEvent) {} + override fun onSingleTapUp(event: MotionEvent): Boolean { return true } + override fun onSingleTapConfirmed(event: MotionEvent): Boolean { return true } } diff --git a/app/src/main/java/com/finnmglas/launcher/Settings.kt b/app/src/main/java/com/finnmglas/launcher/Settings.kt deleted file mode 100644 index cc68a24..0000000 --- a/app/src/main/java/com/finnmglas/launcher/Settings.kt +++ /dev/null @@ -1,154 +0,0 @@ -package com.finnmglas.launcher - -import android.content.Context -import android.content.Intent -import android.content.SharedPreferences -import android.content.pm.PackageManager -import android.net.Uri -import android.provider.Settings -import androidx.core.content.ContextCompat.startActivity - -val none_msg = "None found" - -fun isInstalled(uri: String, context: Context): Boolean { - try { - context.packageManager.getPackageInfo(uri, PackageManager.GET_ACTIVITIES) - return true - } catch (e: PackageManager.NameNotFoundException) { - } - return false -} - -fun openAppSettings(pkg :String, context:Context){ - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.parse("package:$pkg") - context.startActivity(intent) -} - -fun loadSettings(sharedPref : SharedPreferences){ - upApp = sharedPref.getString("action_upApp", "").toString() - downApp = sharedPref.getString("action_downApp", "").toString() - rightApp = sharedPref.getString("action_rightApp", "").toString() - leftApp = sharedPref.getString("action_leftApp", "").toString() - volumeUpApp = sharedPref.getString("action_volumeUpApp", "").toString() - volumeDownApp = sharedPref.getString("action_volumeDownApp", "").toString() - - calendarApp = sharedPref.getString("action_calendarApp", "").toString() - clockApp = sharedPref.getString("action_clockApp", "").toString() -} - -// Default settings are set here. -fun resetSettings(sharedPref : SharedPreferences, context: Context) : MutableList{ - - val defaultList :MutableList = mutableListOf() - - val editor: SharedPreferences.Editor = sharedPref.edit() - - val (chosenUpName, chosenUpPackage) = pickDefaultUpApp(context) - editor.putString("action_upApp", chosenUpPackage) - defaultList.add(chosenUpName) - - val (chosenDownName, chosenDownPackage) = pickDefaultDownApp(context) - editor.putString("action_downApp", chosenDownPackage) - defaultList.add(chosenDownName) - - val (chosenRightName, chosenRightPackage) = pickDefaultRightApp(context) - editor.putString("action_rightApp", chosenRightPackage) - defaultList.add(chosenRightName) - - val (chosenLeftName, chosenLeftPackage) = pickDefaultLeftApp(context) - editor.putString("action_leftApp", chosenLeftPackage) - editor.putString("action_calendarApp", chosenLeftPackage) - defaultList.add(chosenLeftName) - - val (chosenVolumeUpName, chosenVolumeUpPackage) = pickDefaultVolumeUpApp(context) - editor.putString("action_volumeUpApp", chosenVolumeUpPackage) - defaultList.add(chosenVolumeUpName) - - val (chosenVolumeDownName, chosenVolumeDownPackage) = pickDefaultVolumeDownApp(context) - editor.putString("action_volumeDownApp", chosenVolumeDownPackage) - defaultList.add(chosenVolumeDownName) - - // clockApp default - editor.putString("action_clockApp", "com.sec.android.app.clockpackage") - - editor.apply() - - return defaultList // UP, DOWN, RIGHT, LEFT, VOLUME_UP, VOLUME_DOWN -} - -// Default upApps are Browsers -fun pickDefaultUpApp(context :Context) : Pair{ - if(isInstalled("org.mozilla.firefox", context)) - return Pair("Firefox", "org.mozilla.firefox") - else if(isInstalled("com.android.chrome", context)) - return Pair("Chrome", "com.android.chrome") - else if(isInstalled("com.sec.android.app.sbrowser", context)) - return Pair("Samsung Internet", "com.sec.android.app.sbrowser") - else - return Pair("None, as we were unable to find one.", "") -} - -// Default downApps are Internal Search Apps -fun pickDefaultDownApp(context :Context) : Pair{ - if(isInstalled("com.samsung.android.app.galaxyfinder", context)) - return Pair("GalaxyFinder", "com.samsung.android.app.galaxyfinder") - else if(isInstalled("com.prometheusinteractive.voice_launcher", context)) - return Pair("VoiceSearch", "com.prometheusinteractive.voice_launcher") - else - return Pair(none_msg, "") -} - -// Default rightApps are Mailing Applications -fun pickDefaultRightApp(context :Context) : Pair{ - if(isInstalled("de.web.mobile.android.mail", context)) - return Pair("WebMail", "de.web.mobile.android.mail") - else if(isInstalled("com.samsung.android.email.provider", context)) - return Pair("Samsung Mail", "com.samsung.android.email.provider") - else if(isInstalled("com.google.android.gm", context)) - return Pair("Google Mail", "com.google.android.gm") - else - return Pair(none_msg, "") -} - -// Default leftApps are Calendar Applications -fun pickDefaultLeftApp(context :Context) : Pair{ - if(isInstalled("com.google.android.calendar", context)) - return Pair("Google Calendar", "com.google.android.calendar") - else if(isInstalled("com.samsung.android.calendar", context)) - return Pair("Samsung Calendar", "com.samsung.android.calendar") - else - return Pair(none_msg, "") -} - -// Default volumeUpApps are Messengers -fun pickDefaultVolumeUpApp(context: Context) : Pair{ - if(isInstalled("com.whatsapp", context)) - return Pair("WhatsApp", "com.whatsapp") - else if(isInstalled("com.facebook.orca", context)) - return Pair("Facebook Messenger", "com.facebook.orca") - else if(isInstalled("com.viber.voip", context)) - return Pair("Viber", "com.viber.voip") - else if(isInstalled("com.skype.raider", context)) - return Pair("Skype", "com.skype.raider") - else if(isInstalled("com.snapchat.android", context)) - return Pair("Snapchat", "com.snapchat.android") - else if(isInstalled("com.instagram.android", context)) - return Pair("Instagram", "com.instagram.android") - else if(isInstalled("com.samsung.android.messaging", context)) - return Pair("Samsung SMS", "com.samsung.android.messaging") - else - return Pair(none_msg, "") -} - -// Default volumeDownApps are Utilities -fun pickDefaultVolumeDownApp(context: Context) : Pair{ - if(isInstalled("com.github.android", context)) - return Pair("GitHub", "com.github.android") - else if(isInstalled("com.soundbrenner.pulse", context)) - return Pair("Soundbrenner Metronome", "com.soundbrenner.pulse") - else if(isInstalled("com.sec.android.app.popupcalculator", context)) - return Pair("Calculator", "com.sec.android.app.popupcalculator") - else - return Pair(none_msg, "") -} diff --git a/app/src/main/java/com/finnmglas/launcher/SettingsActivity.kt b/app/src/main/java/com/finnmglas/launcher/SettingsActivity.kt index 7b2e2fa..0a2f984 100644 --- a/app/src/main/java/com/finnmglas/launcher/SettingsActivity.kt +++ b/app/src/main/java/com/finnmglas/launcher/SettingsActivity.kt @@ -1,21 +1,29 @@ package com.finnmglas.launcher -import android.annotation.SuppressLint import android.app.AlertDialog import android.content.* -import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.Settings import android.view.View import android.view.WindowManager -import android.widget.Toast import androidx.appcompat.app.AppCompatActivity //TODO Make Settings scrollable as soon as more are added class SettingsActivity : AppCompatActivity() { + + /** Activity Lifecycle functions */ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + + setContentView(R.layout.activity_settings) + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if(requestCode == 5000) { @@ -37,6 +45,7 @@ class SettingsActivity : AppCompatActivity() { } } + /** onClick functions for Settings */ fun chooseDownApp(view: View) {chooseApp("downApp")} fun chooseUpApp(view: View) {chooseApp("upApp")} fun chooseLeftApp(view: View) {chooseApp("leftApp")} @@ -63,26 +72,9 @@ class SettingsActivity : AppCompatActivity() { startActivity(intent) } - fun openNewTabWindow(urls: String, context : Context) { - val uris = Uri.parse(urls) - val intents = Intent(Intent.ACTION_VIEW, uris) - val b = Bundle() - b.putBoolean("new_window", true) - intents.putExtras(b) - context.startActivity(intents) - } - - fun openFinnWebsite(view: View) { - openNewTabWindow("https://www.finnmglas.com/", this) - } - - fun openGithubRepo(view: View) { - openNewTabWindow("https://github.com/finnmglas/Launcher#en", this) - } - - fun backHome(view: View) { - finish() - } + fun openFinnWebsite(view: View) { openNewTabWindow(getString(R.string.settings_footer_web), this) } + fun openGithubRepo(view: View) { openNewTabWindow(getString(R.string.settings_footer_repo), this) } + fun backHome(view: View) { finish() } fun setLauncher(view: View) { // on newer sdk: choose launcher @@ -93,8 +85,8 @@ class SettingsActivity : AppCompatActivity() { // on older sdk: manage app details else { AlertDialog.Builder(this) - .setTitle("App Info") - .setMessage("Your device does not support this feature. Manage application details instead?") + .setTitle(getString(R.string.alert_cant_choose_launcher)) + .setMessage(getString(R.string.alert_cant_choose_launcher_message)) .setPositiveButton(android.R.string.yes, DialogInterface.OnClickListener { dialog, which -> try { @@ -113,8 +105,8 @@ class SettingsActivity : AppCompatActivity() { // Show a dialog prompting for confirmation fun resetSettingsClick(view: View) { AlertDialog.Builder(this) - .setTitle("Reset Settings") - .setMessage("This will discard all your App Choices. Sure you want to continue?") + .setTitle(getString(R.string.settings_reset)) + .setMessage(getString(R.string.settings_reset_message)) .setPositiveButton(android.R.string.yes, DialogInterface.OnClickListener { dialog, which -> resetSettings(this.getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE), this) @@ -124,14 +116,4 @@ class SettingsActivity : AppCompatActivity() { .setIcon(android.R.drawable.ic_dialog_alert) .show() } - - @SuppressLint("SetTextI18n") // I do not care - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - - setContentView(R.layout.activity_settings) - } } diff --git a/app/src/main/res/layout/activity_choose.xml b/app/src/main/res/layout/activity_choose.xml index e0a755f..7c9b989 100644 --- a/app/src/main/res/layout/activity_choose.xml +++ b/app/src/main/res/layout/activity_choose.xml @@ -11,7 +11,7 @@ android:id="@+id/heading" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Choose App" + android:text="@string/choose_title" android:textColor="#cccccc" android:textSize="36sp" app:layout_constraintBottom_toBottomOf="parent" @@ -55,11 +55,10 @@