diff --git a/app/src/main/java/com/finnmglas/launcher/Functions.kt b/app/src/main/java/com/finnmglas/launcher/Functions.kt
index d0ecc4f..f071af9 100644
--- a/app/src/main/java/com/finnmglas/launcher/Functions.kt
+++ b/app/src/main/java/com/finnmglas/launcher/Functions.kt
@@ -8,11 +8,14 @@ import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.graphics.*
+import android.media.AudioManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
+import android.os.SystemClock
import android.provider.Settings
import android.util.DisplayMetrics
+import android.view.KeyEvent
import android.view.View
import android.view.Window
import android.view.WindowManager
@@ -22,6 +25,7 @@ import android.widget.Button
import android.widget.ImageView
import android.widget.Switch
import android.widget.Toast
+import androidx.annotation.RequiresApi
import com.finnmglas.launcher.list.ListActivity
import com.finnmglas.launcher.list.apps.AppInfo
import com.finnmglas.launcher.list.apps.AppsRecyclerAdapter
@@ -30,6 +34,7 @@ import com.finnmglas.launcher.settings.intendedSettingsPause
import com.finnmglas.launcher.tutorial.TutorialActivity
import kotlin.math.roundToInt
+
/* Preferences (global, initialised when app is started) */
lateinit var launcherPreferences: SharedPreferences
@@ -154,8 +159,10 @@ fun View.fadeRotateIn(duration: Long = 500L) {
}
)
combined.addAnimation(
- RotateAnimation(0F, 180F, Animation.RELATIVE_TO_SELF,
- 0.5f, Animation.RELATIVE_TO_SELF,0.5f).also {
+ RotateAnimation(
+ 0F, 180F, Animation.RELATIVE_TO_SELF,
+ 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
+ ).also {
it.duration = duration * 2
it.interpolator = DecelerateInterpolator()
}
@@ -173,8 +180,10 @@ fun View.fadeRotateOut(duration: Long = 500L) {
}
)
combined.addAnimation(
- RotateAnimation(0F, 180F, Animation.RELATIVE_TO_SELF,
- 0.5f, Animation.RELATIVE_TO_SELF,0.5f).also {
+ RotateAnimation(
+ 0F, 180F, Animation.RELATIVE_TO_SELF,
+ 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
+ ).also {
it.duration = duration
it.interpolator = AccelerateInterpolator()
}
@@ -202,13 +211,19 @@ private fun getIntent(packageName: String, context: Context): Intent? {
return intent
}
-fun launch(data: String, activity: Activity,
- animationIn: Int = android.R.anim.fade_in, animationOut: Int = android.R.anim.fade_out) {
+fun launch(
+ data: String, activity: Activity,
+ animationIn: Int = android.R.anim.fade_in, animationOut: Int = android.R.anim.fade_out
+) {
if (data.startsWith("launcher:")) // [type]:[info]
when(data.split(":")[1]) {
"settings" -> openSettings(activity)
"choose" -> openAppsList(activity)
+ "volumeUp" -> audioVolumeUp(activity)
+ "volumeDown" -> audioVolumeDown(activity)
+ "nextTrack" -> audioNextTrack(activity)
+ "previousTrack" -> audioPreviousTrack(activity)
"tutorial" -> openTutorial(activity)
}
else launchApp(data, activity) // app
@@ -216,6 +231,62 @@ fun launch(data: String, activity: Activity,
activity.overridePendingTransition(animationIn, animationOut)
}
+/* Media player actions */
+
+fun audioNextTrack(activity: Activity) {
+ if (Build.VERSION.SDK_INT >= 19) { // requires Android KitKat +
+ val mAudioManager = activity.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+
+ val eventTime: Long = SystemClock.uptimeMillis()
+
+ val downEvent =
+ KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0)
+ mAudioManager.dispatchMediaKeyEvent(downEvent)
+
+ val upEvent = KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0)
+ mAudioManager.dispatchMediaKeyEvent(upEvent)
+ }
+}
+
+fun audioPreviousTrack(activity: Activity) {
+ if (Build.VERSION.SDK_INT >= 19) { // requires Android KitKat +
+ val mAudioManager = activity.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+
+ val eventTime: Long = SystemClock.uptimeMillis()
+
+ val downEvent =
+ KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0)
+ mAudioManager.dispatchMediaKeyEvent(downEvent)
+
+ val upEvent = KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0)
+ mAudioManager.dispatchMediaKeyEvent(upEvent)
+ }
+}
+
+fun audioVolumeUp(activity: Activity) {
+ val audioManager =
+ activity.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+
+ audioManager.adjustStreamVolume(
+ AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_RAISE,
+ AudioManager.FLAG_SHOW_UI
+ )
+}
+
+fun audioVolumeDown(activity: Activity) {
+ val audioManager =
+ activity.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+
+ audioManager.adjustStreamVolume(
+ AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_LOWER,
+ AudioManager.FLAG_SHOW_UI
+ )
+}
+
+/* --- */
+
fun launchApp(packageName: String, context: Context) {
val intent = getIntent(packageName, context)
@@ -224,7 +295,8 @@ fun launchApp(packageName: String, context: Context) {
} else {
if (isInstalled(packageName, context)){
- AlertDialog.Builder(context,
+ AlertDialog.Builder(
+ context,
R.style.AlertDialogCustom
)
.setTitle(context.getString(R.string.alert_cant_open_title))
@@ -240,12 +312,16 @@ fun launchApp(packageName: String, context: Context) {
.setIcon(android.R.drawable.ic_dialog_info)
.show()
} else {
- Toast.makeText( context, context.getString(R.string.toast_cant_open_message), Toast.LENGTH_SHORT).show()
+ Toast.makeText(
+ context,
+ context.getString(R.string.toast_cant_open_message),
+ Toast.LENGTH_SHORT
+ ).show()
}
}
}
-fun openNewTabWindow(urls: String, context : Context) {
+fun openNewTabWindow(urls: String, context: Context) {
val uris = Uri.parse(urls)
val intents = Intent(Intent.ACTION_VIEW, uris)
val b = Bundle()
@@ -256,11 +332,11 @@ fun openNewTabWindow(urls: String, context : Context) {
/* Settings related functions */
-fun getSavedTheme(context : Context) : String {
+fun getSavedTheme(context: Context) : String {
return launcherPreferences.getString(PREF_THEME, "finn").toString()
}
-fun saveTheme(themeName : String) : String {
+fun saveTheme(themeName: String) : String {
launcherPreferences.edit()
.putString(PREF_THEME, themeName)
.apply()
@@ -302,7 +378,7 @@ fun resetToDarkTheme(activity: Activity) {
}
-fun openAppSettings(pkg :String, context:Context) {
+fun openAppSettings(pkg: String, context: Context) {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = Uri.parse("package:$pkg")
context.startActivity(intent)
@@ -399,14 +475,18 @@ fun setWindowFlags(window: Window) {
// Display notification bar
if (launcherPreferences.getBoolean(PREF_SCREEN_FULLSCREEN, true))
- window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN)
+ window.setFlags(
+ WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN
+ )
else window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
// Screen Timeout
if (launcherPreferences.getBoolean(PREF_SCREEN_TIMEOUT_DISABLED, false))
- window.setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
- WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+ window.setFlags(
+ WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
+ WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+ )
else window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
diff --git a/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt b/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt
index 2e45ea0..0eb806f 100644
--- a/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt
+++ b/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt
@@ -12,6 +12,7 @@ import com.finnmglas.launcher.dominantColor
import com.finnmglas.launcher.list.forApp
import com.finnmglas.launcher.list.intention
import com.finnmglas.launcher.openSoftKeyboard
+import kotlinx.android.synthetic.main.list.*
import kotlinx.android.synthetic.main.list_apps.*
@@ -68,6 +69,8 @@ class ListFragmentApps : Fragment(), UIObject {
}
})
- openSoftKeyboard(context!!, list_apps_searchview)
+ when (intention) {
+ "view" -> openSoftKeyboard(context!!, list_apps_searchview)
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/finnmglas/launcher/list/other/OtherRecyclerAdapter.kt b/app/src/main/java/com/finnmglas/launcher/list/other/OtherRecyclerAdapter.kt
index 1e7eb71..4a7c147 100644
--- a/app/src/main/java/com/finnmglas/launcher/list/other/OtherRecyclerAdapter.kt
+++ b/app/src/main/java/com/finnmglas/launcher/list/other/OtherRecyclerAdapter.kt
@@ -2,6 +2,7 @@ package com.finnmglas.launcher.list.other
import android.app.Activity
import android.content.Intent
+import android.os.Build
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -66,9 +67,33 @@ class OtherRecyclerAdapter(val activity: Activity):
OtherInfo(activity.getString(R.string.list_other_list),
"launcher:choose",
activity.getString(R.string.fas_bars)))
+ othersList.add(
+ OtherInfo(activity.getString(R.string.list_other_volume_up),
+ "launcher:volumeUp",
+ activity.getString(R.string.fas_plus)))
+ othersList.add(
+ OtherInfo(activity.getString(R.string.list_other_volume_down),
+ "launcher:volumeDown",
+ activity.getString(R.string.fas_minus)))
+
+ if (Build.VERSION.SDK_INT >= 19) { // requires Android KitKat +
+ othersList.add(
+ OtherInfo(
+ activity.getString(R.string.list_other_track_next),
+ "launcher:nextTrack",
+ activity.getString(R.string.fas_forward)
+ )
+ )
+ othersList.add(
+ OtherInfo(
+ activity.getString(R.string.list_other_track_previous),
+ "launcher:previousTrack",
+ activity.getString(R.string.fas_back)
+ )
+ )
+ }
}
- /* */
private fun returnChoiceIntent(forAction: String, value: String) {
val returnIntent = Intent()
returnIntent.putExtra("value", value)
diff --git a/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActionsRecycler.kt b/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActionsRecycler.kt
index d03f39e..120de2b 100644
--- a/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActionsRecycler.kt
+++ b/app/src/main/java/com/finnmglas/launcher/settings/actions/SettingsFragmentActionsRecycler.kt
@@ -104,6 +104,14 @@ class ActionsRecyclerAdapter(val activity: Activity):
viewHolder.fontAwesome.text = activity.getString(R.string.fas_settings)
"choose" ->
viewHolder.fontAwesome.text = activity.getString(R.string.fas_bars)
+ "volumeUp" ->
+ viewHolder.fontAwesome.text = activity.getString(R.string.fas_plus)
+ "volumeDown" ->
+ viewHolder.fontAwesome.text = activity.getString(R.string.fas_minus)
+ "nextTrack" ->
+ viewHolder.fontAwesome.text = activity.getString(R.string.fas_forward)
+ "previousTrack" ->
+ viewHolder.fontAwesome.text = activity.getString(R.string.fas_back)
}
} else {
// Set image icon (by packageName)
diff --git a/app/src/main/res/layout/list_other_row.xml b/app/src/main/res/layout/list_other_row.xml
index 9ef0a26..9d70c2d 100644
--- a/app/src/main/res/layout/list_other_row.xml
+++ b/app/src/main/res/layout/list_other_row.xml
@@ -9,11 +9,11 @@
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index b4ce475..64bdc4a 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -122,8 +122,12 @@
Anwendungen suchen
- Launcher Einstellungen
- Launcher Apps Liste
+ App Einstellungen
+ Alle Anwendungen
+ Musik: Lauter
+ Musik: Leiser
+ Musik: Weiter
+ Musik: Zurück
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 32f03cf..5407011 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -143,7 +143,11 @@
Search Applications
Launcher Settings
- Launcher AppsList
+ All Applications
+ Music: Louder
+ Music: Quieter
+ Music: Next
+ Music: Previous