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