From 33addb6944f2e7c10021c20c43e3f378d3773cd6 Mon Sep 17 00:00:00 2001 From: JonFaull <42946306+JonFaull@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:30:38 +0000 Subject: [PATCH 1/7] Added mute button for live rides. --- .../java/net/cyclestreets/LiveRideActivity.kt | 6 + .../cyclestreets/liveride/LiveRideStart.kt | 4 + .../net/cyclestreets/views/CycleMapView.java | 1 + .../views/overlay/MuteButtonOverlay.kt | 130 ++++++++++++++++++ .../src/main/res/drawable/volume_mute.xml | 9 ++ .../src/main/res/layout/mutebutton.xml | 19 +++ .../src/main/res/values/colors.xml | 2 +- 7 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt create mode 100644 libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml create mode 100644 libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/LiveRideActivity.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/LiveRideActivity.kt index fb49140e4..69e65b4c5 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/LiveRideActivity.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/LiveRideActivity.kt @@ -76,13 +76,19 @@ class LiveRideActivity : Activity(), ServiceConnection, LiveRideOverlay.Locator map = CycleMapView(this, this.javaClass.name, null).apply { overlayPushBottom(RouteOverlay(this,false)) overlayPushTop(WaymarkOverlay(this)) + overlayPushTop(LockScreenOnOverlay(this)) overlayPushTop(RotateMapOverlay(this)) + overlayPushTop(MuteButtonOverlay(this)) + overlayPushTop(LiveRideOverlay(this@LiveRideActivity, this@LiveRideActivity)) lockOnLocation() hideLocationButton() shiftAttribution() } + + Log.e("we are here ", "we are here") + RelativeLayout(this).apply { addView(map, RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideStart.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideStart.kt index 93b57e907..1e6c254fa 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideStart.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideStart.kt @@ -18,7 +18,11 @@ internal class LiveRideStart(context: Context, tts: TextToSpeech?) : LiveRideSta journey.setActiveSegmentIndex(0) Log.d("importantTest", "LiveRideStart Update: ${journey.activeSegment()!!.toString()}") notify(journey.activeSegment()!!, true) + + return HuntForSegment(this) + + } override fun isStopped(): Boolean { return false } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/CycleMapView.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/CycleMapView.java index 860b39e20..b46a3060e 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/CycleMapView.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/CycleMapView.java @@ -66,6 +66,7 @@ public class CycleMapView extends FrameLayout private IGeoPoint centreOn_ = null; private IGeoPoint foundPlace; private boolean paused_ = false; + public boolean muteAudio; public CycleMapView(final Context context, final String name, final Fragment fragment) { super(context); diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt new file mode 100644 index 000000000..65360ff85 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt @@ -0,0 +1,130 @@ +package net.cyclestreets.views.overlay + +import android.content.Context +import android.content.SharedPreferences +import android.graphics.Canvas +import android.graphics.drawable.Drawable +import android.media.AudioManager +import android.util.Log +import android.view.LayoutInflater +import androidx.core.content.ContextCompat.getSystemService +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_phonelink_lock +import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_mute +import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_off +//import kotlinx.coroutines.flow.internal.NoOpContinuation.context +import net.cyclestreets.iconics.IconicsHelper.materialIcon +import net.cyclestreets.util.Theme.highlightColor +import net.cyclestreets.util.Theme.lowlightColor +import net.cyclestreets.view.R +import net.cyclestreets.views.CycleMapView +import org.osmdroid.views.MapView +import org.osmdroid.views.overlay.Overlay +//mport kotlin.coroutines.jvm.internal.CompletedContinuation.context + + +private var isAudioOn: Boolean = true +private var mContext: Context? = null + +//private var audioManager: AudioManager = new +//private var audioManager: AudioManager() + +class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseResumeListener { + + companion object { + private const val LOCK_PREF = "muteButton" + } + + private val audioMuteButton: FloatingActionButton + private val onIcon: Drawable + private val offIcon: Drawable + + + init { + val context = mapView.context + + // onIcon = materialIcon(context, gmd_phonelink_lock, highlightColor(context)) + onIcon = materialIcon(context, gmd_volume_mute, highlightColor(context)) + offIcon = materialIcon(context, gmd_volume_off, lowlightColor(context)) + + val liveRideButtonView = LayoutInflater.from(context).inflate(R.layout.mutebutton, null) + audioMuteButton = liveRideButtonView.findViewById(R.id.mute_button).apply { + setOnClickListener { _ -> screenLockButtonTapped() } + //setImageDrawable(onIcon) + + + + + /* + if(isAudioOn == false){ + setImageDrawable(onIcon) + } else { + setImageDrawable(offIcon) + }*/ + + } + //audioMuteButton.setImageDrawable(onIcon) + mapView.addView(liveRideButtonView) + //mapView.keepScreenOn = false + // mapView.muteAudio = false + + + } + + private fun screenLockButtonTapped() { + setScreenLockState(!mapView.keepScreenOn) + } + + private fun setScreenLockState(state: Boolean) { + /* Log.d("LiveRide", "Setting keepScreenOn state to $state") + screenLockButton.setImageDrawable(if (state) onIcon else offIcon) + val message = if (state) R.string.liveride_keep_screen_on_enabled else R.string.liveride_keep_screen_on_disabled + Toast.makeText(mapView.context, message, Toast.LENGTH_LONG).show() + mapView.keepScreenOn = state*/ + val context = mapView.context + val amanager = getSystemService(context, AudioManager::class.java) as AudioManager? + amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, true) + + //getSystemService(context, AlarmManager::class.java) + + if (mapView.muteAudio) { + // isAudioOn = false + amanager!!.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute + audioMuteButton.setImageDrawable(onIcon); + mapView.muteAudio = false + + + } else { + //isAudioOn = true + amanager!!.setStreamMute(AudioManager.STREAM_MUSIC, true) //for mute + audioMuteButton.setImageDrawable(offIcon); + mapView.muteAudio = true + } + + Log.e("We are here", "we are here") + } + + override fun draw(c: Canvas, osmv: MapView, shadow: Boolean) {} + + ///////////////////////////////////////// + override fun onResume(prefs: SharedPreferences) { + // mapView.keepScreenOn = prefs.getBoolean(LOCK_PREF, false) + mapView.muteAudio = prefs.getBoolean(LOCK_PREF, mapView.muteAudio) + Log.e("Is audio muted?", mapView.muteAudio.toString()) + if(mapView.muteAudio) { + audioMuteButton.setImageDrawable(offIcon) + } else { + audioMuteButton.setImageDrawable(onIcon) + } + + + + + } + + override fun onPause(prefs: SharedPreferences.Editor) { + //prefs.putBoolean(LOCK_PREF, mapView.keepScreenOn) + prefs.putBoolean(LOCK_PREF, mapView.muteAudio) + } + +} diff --git a/libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml b/libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml new file mode 100644 index 000000000..17f87d666 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml @@ -0,0 +1,9 @@ + + + diff --git a/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml b/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml new file mode 100644 index 000000000..5c6086bcd --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/libraries/cyclestreets-view/src/main/res/values/colors.xml b/libraries/cyclestreets-view/src/main/res/values/colors.xml index d7de5fe2f..6621b4052 100644 --- a/libraries/cyclestreets-view/src/main/res/values/colors.xml +++ b/libraries/cyclestreets-view/src/main/res/values/colors.xml @@ -10,5 +10,5 @@ @color/material_grey_100 #ffffff - + #000000 From 624fb1a97c09c96ddd464e5cbf0135e43fd4dec2 Mon Sep 17 00:00:00 2001 From: JonFaull <42946306+JonFaull@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:53:32 +0000 Subject: [PATCH 2/7] Added mute button for live rides. --- .../views/overlay/MuteButtonOverlay.kt | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt index 65360ff85..322228eaa 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt @@ -9,7 +9,7 @@ import android.util.Log import android.view.LayoutInflater import androidx.core.content.ContextCompat.getSystemService import com.google.android.material.floatingactionbutton.FloatingActionButton -import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_phonelink_lock + import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_mute import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_off //import kotlinx.coroutines.flow.internal.NoOpContinuation.context @@ -24,7 +24,7 @@ import org.osmdroid.views.overlay.Overlay private var isAudioOn: Boolean = true -private var mContext: Context? = null +//private var mContext: Context? = null //private var audioManager: AudioManager = new //private var audioManager: AudioManager() @@ -43,39 +43,22 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes init { val context = mapView.context - // onIcon = materialIcon(context, gmd_phonelink_lock, highlightColor(context)) + onIcon = materialIcon(context, gmd_volume_mute, highlightColor(context)) offIcon = materialIcon(context, gmd_volume_off, lowlightColor(context)) val liveRideButtonView = LayoutInflater.from(context).inflate(R.layout.mutebutton, null) audioMuteButton = liveRideButtonView.findViewById(R.id.mute_button).apply { - setOnClickListener { _ -> screenLockButtonTapped() } - //setImageDrawable(onIcon) - - - - - /* - if(isAudioOn == false){ - setImageDrawable(onIcon) - } else { - setImageDrawable(offIcon) - }*/ + setOnClickListener { setMuteAudioState() } } - //audioMuteButton.setImageDrawable(onIcon) - mapView.addView(liveRideButtonView) - //mapView.keepScreenOn = false - // mapView.muteAudio = false + mapView.addView(liveRideButtonView) - } - private fun screenLockButtonTapped() { - setScreenLockState(!mapView.keepScreenOn) } - private fun setScreenLockState(state: Boolean) { + private fun setMuteAudioState() { /* Log.d("LiveRide", "Setting keepScreenOn state to $state") screenLockButton.setImageDrawable(if (state) onIcon else offIcon) val message = if (state) R.string.liveride_keep_screen_on_enabled else R.string.liveride_keep_screen_on_disabled @@ -83,34 +66,35 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes mapView.keepScreenOn = state*/ val context = mapView.context val amanager = getSystemService(context, AudioManager::class.java) as AudioManager? + amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, true) //getSystemService(context, AlarmManager::class.java) if (mapView.muteAudio) { // isAudioOn = false - amanager!!.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute + amanager.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute audioMuteButton.setImageDrawable(onIcon); mapView.muteAudio = false } else { //isAudioOn = true - amanager!!.setStreamMute(AudioManager.STREAM_MUSIC, true) //for mute + amanager.setStreamMute(AudioManager.STREAM_MUSIC, true) //for mute audioMuteButton.setImageDrawable(offIcon); mapView.muteAudio = true } - Log.e("We are here", "we are here") + } override fun draw(c: Canvas, osmv: MapView, shadow: Boolean) {} ///////////////////////////////////////// override fun onResume(prefs: SharedPreferences) { - // mapView.keepScreenOn = prefs.getBoolean(LOCK_PREF, false) + mapView.muteAudio = prefs.getBoolean(LOCK_PREF, mapView.muteAudio) - Log.e("Is audio muted?", mapView.muteAudio.toString()) + if(mapView.muteAudio) { audioMuteButton.setImageDrawable(offIcon) } else { @@ -123,7 +107,7 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes } override fun onPause(prefs: SharedPreferences.Editor) { - //prefs.putBoolean(LOCK_PREF, mapView.keepScreenOn) + prefs.putBoolean(LOCK_PREF, mapView.muteAudio) } From 58d342537c327f5c223074285992e5f5baad0361 Mon Sep 17 00:00:00 2001 From: JonFaull <42946306+JonFaull@users.noreply.github.com> Date: Fri, 15 Dec 2023 13:57:28 +0000 Subject: [PATCH 3/7] Added mute button for live rides. --- .../views/overlay/MuteButtonOverlay.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt index 322228eaa..d1b9c184f 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt @@ -91,6 +91,22 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes override fun draw(c: Canvas, osmv: MapView, shadow: Boolean) {} ///////////////////////////////////////// + + + /* override fun onStart(prefs: SharedPreferences) { + + mapView.muteAudio = prefs.getBoolean(LOCK_PREF, mapView.muteAudio) + + if(mapView.muteAudio) { + audioMuteButton.setImageDrawable(offIcon) + } else { + audioMuteButton.setImageDrawable(onIcon) + } + + }*/ + + + override fun onResume(prefs: SharedPreferences) { mapView.muteAudio = prefs.getBoolean(LOCK_PREF, mapView.muteAudio) From e598d181bac709f6194274428a33ce21718794f5 Mon Sep 17 00:00:00 2001 From: JonFaull <42946306+JonFaull@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:33:52 +0000 Subject: [PATCH 4/7] Added mute button for live rides. --- .../cyclestreets/liveride/LiveRideState.kt | 74 ++++++- .../views/overlay/MuteButtonOverlay.kt | 191 ++++++++++++++++-- 2 files changed, 241 insertions(+), 24 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt index dd4fea017..9160a2c2c 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt @@ -6,6 +6,7 @@ import android.app.PendingIntent import android.app.Service import android.content.Context import android.content.Intent +import android.content.SharedPreferences import android.graphics.drawable.Icon import android.speech.tts.TextToSpeech import android.speech.tts.UtteranceProgressListener @@ -20,18 +21,25 @@ import net.cyclestreets.routing.Journey import net.cyclestreets.routing.Segment import net.cyclestreets.util.Logging import net.cyclestreets.view.R +import net.cyclestreets.views.overlay.MuteButtonOverlay import org.osmdroid.util.GeoPoint import java.util.* +import org.osmdroid.views.MapView private val TAG = Logging.getTag(LiveRideState::class.java) private const val NOTIFICATION_ID = 1 - internal abstract class LiveRideState(protected val context: Context, val tts: TextToSpeech?, private val title: String) { init { Log.d(TAG, "New State: " + this.javaClass.simpleName) + + + } + + private val sharedPreferences: SharedPreferences by lazy{ + context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) } protected constructor(context: Context, tts: TextToSpeech?): @@ -66,14 +74,20 @@ internal abstract class LiveRideState(protected val context: Context, // checked protected fun notify(text: String, directionIcon: Int, important: Boolean = false) { - notification(text, text, directionIcon) - speak(text, important) + + + + notification(text, text, directionIcon) + speak(text, important) + } @JvmOverloads protected fun notify(text: String, ticker: String = text, important: Boolean = false) { - notification(text, ticker) - speak(text, important) + + notification(text, ticker) + speak(text, important) + } protected fun notifyAndSetServiceForeground(service: Service, text: String) { @@ -120,11 +134,53 @@ internal abstract class LiveRideState(protected val context: Context, return context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager } - private fun speak(words: String, important: Boolean = false) { - if (important) { - tts?.speak(speechify(words), TextToSpeech.QUEUE_FLUSH, null, UUID.randomUUID().toString()) + /*fun onResume(prefs: SharedPreferences) { + + MapView mapView = new MapView() + mapView.muteAudio = prefs.getBoolean(MuteButtonOverlay.LOCK_PREF, mapView.muteAudio) + + if(mapView.muteAudio) { + audioMuteButton.setImageDrawable(offIcon) } else { - tts?.speak(speechify(words), TextToSpeech.QUEUE_ADD, null, UUID.randomUUID().toString()) + audioMuteButton.setImageDrawable(onIcon) } + + + + + }*/ + + companion object { + private const val LOCK_PREF = "muteButton" + } + + + + private fun speak(words: String, important: Boolean = false) { + //mute = false + val muteAudio: Boolean = sharedPreferences.getBoolean("MuteAudio", false) + + + + + // tts?.speak(speechify(words), TextToSpeech.QUEUE_FLUSH, null, UUID.randomUUID().toString()) + if(!muteAudio){ + Log.e("Is it mute: " , muteAudio.toString()) + if (important) { + tts?.speak(speechify(words), TextToSpeech.QUEUE_FLUSH, null, UUID.randomUUID().toString()) + } else { + tts?.speak(speechify(words), TextToSpeech.QUEUE_ADD, null, UUID.randomUUID().toString()) + } + } else { + Log.e("Is it mute: " , muteAudio.toString()) + + //tts?.stop() + + //textToSpeech.stop(); + + + } + + } } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt index d1b9c184f..d8cc290dd 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt @@ -1,31 +1,38 @@ package net.cyclestreets.views.overlay +//import kotlinx.coroutines.flow.internal.NoOpContinuation.context import android.content.Context import android.content.SharedPreferences import android.graphics.Canvas import android.graphics.drawable.Drawable import android.media.AudioManager -import android.util.Log +import android.speech.tts.TextToSpeech import android.view.LayoutInflater +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat.getSystemService import com.google.android.material.floatingactionbutton.FloatingActionButton - import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_mute import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_off -//import kotlinx.coroutines.flow.internal.NoOpContinuation.context import net.cyclestreets.iconics.IconicsHelper.materialIcon +import net.cyclestreets.liveride.LiveRideState +import net.cyclestreets.liveride.OnTheMove import net.cyclestreets.util.Theme.highlightColor import net.cyclestreets.util.Theme.lowlightColor import net.cyclestreets.view.R import net.cyclestreets.views.CycleMapView import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Overlay +import java.util.Locale +import java.util.UUID + + //mport kotlin.coroutines.jvm.internal.CompletedContinuation.context private var isAudioOn: Boolean = true //private var mContext: Context? = null - +//private lateinit var audioManager: AudioManager //private var audioManager: AudioManager = new //private var audioManager: AudioManager() @@ -38,7 +45,8 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes private val audioMuteButton: FloatingActionButton private val onIcon: Drawable private val offIcon: Drawable - + private var muteAudio: Boolean = false + private lateinit var tts: TextToSpeech init { val context = mapView.context @@ -53,10 +61,64 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes } - mapView.addView(liveRideButtonView) + val sharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) + + muteAudio= sharedPreferences.getBoolean("MuteAudio", false) + + if (muteAudio){ + audioMuteButton.setImageDrawable(offIcon); + } else { + audioMuteButton.setImageDrawable(onIcon); + } + + + + /*tts = TextToSpeech(context) { status -> + if (status == TextToSpeech.SUCCESS) { + val result = tts.setLanguage(Locale.US) + + if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { + // Handle language not supported + } + } else { + // Handle initialization failure + } + }*/ + mapView.addView(liveRideButtonView) + } + + fun initializeTextToSpeech(context: Context) { + //val context = context.getString(R.string.app_name) + + tts = TextToSpeech(context) { status -> + if (status == TextToSpeech.SUCCESS) { + val result = tts.setLanguage(Locale.US) + if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { + // Handle language not supported + } + } else { + // Handle initialization failure + } + } } + /* public constructor(context: Context) : super() { + tts = TextToSpeech(context) { status -> + if (status == TextToSpeech.SUCCESS) { + val result = tts.setLanguage(Locale.US) + + if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { + // Handle language not supported + } + } else { + // Handle initialization failure + } + } + }*/ + + /* protected constructor(context: Context, tts: TextToSpeech?): + this(context, tts, context.getString(R.string.app_name))*/ private fun setMuteAudioState() { /* Log.d("LiveRide", "Setting keepScreenOn state to $state") @@ -65,26 +127,117 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes Toast.makeText(mapView.context, message, Toast.LENGTH_LONG).show() mapView.keepScreenOn = state*/ val context = mapView.context - val amanager = getSystemService(context, AudioManager::class.java) as AudioManager? + //val amanager = getSystemService(context, AudioManager::class.java) as AudioManager? + + /* audioManager = getSystemService(context, AudioManager::class.java) as AudioManager + val result = amanager?.requestAudioFocus( + null, + AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT + )*/ - amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, true) + //amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, true) //getSystemService(context, AlarmManager::class.java) + // val streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) + + val sharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) + val editor = sharedPreferences.edit() + + muteAudio= sharedPreferences.getBoolean("MuteAudio", false) + + + tts.speak("Text to say", TextToSpeech.QUEUE_FLUSH, null, UUID.randomUUID().toString()); + + if(muteAudio){ + audioMuteButton.setImageDrawable(onIcon); + // mapView.muteAudio = false + editor.putBoolean("MuteAudio", false) + editor.commit() + + + } else { + audioMuteButton.setImageDrawable(offIcon); + editor.putBoolean("MuteAudio", true) + editor.commit() + //Toast.makeText(context, "Audio will stop after finished reading segment", Toast.LENGTH_SHORT).show() + + +/* + if (::tts.isInitialized) { + tts.stop() + }*/ - if (mapView.muteAudio) { + + + + } + + + // editor.putBoolean("MuteAudio", false) + // editor.apply() + + + + + + + // if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + // Audio focus gained, mute your app's audio + /* if (mapView.muteAudio) { + amanager?.adjustVolume(AudioManager.ADJUST_UNMUTE, 0) + // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0) + audioMuteButton.setImageDrawable(onIcon); + mapView.muteAudio = false + + } else { + amanager?.adjustVolume(AudioManager.ADJUST_MUTE, 0) + // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, streamVolume, 0) + audioMuteButton.setImageDrawable(offIcon); + mapView.muteAudio = true + + }*/ + // amanager?.adjustVolume(AudioManager.ADJUST_MUTE, AudioManager.FLAG_PLAY_SOUND) + + + + + // OR + // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0) // Mute the audio in your app + + + + // } else { + // Failed to gain audio focus + // Handle accordingly (e.g., inform the user or try again later) + // } + + + + + + /* if (mapView.muteAudio) { // isAudioOn = false - amanager.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute + amanager?.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute + + // amanager.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute + //val amanager = getSystemService(Context.AUDIO_SERVICE) as AudioManager? + // amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, false) + + //amanager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); + audioMuteButton.setImageDrawable(onIcon); mapView.muteAudio = false } else { //isAudioOn = true - amanager.setStreamMute(AudioManager.STREAM_MUSIC, true) //for mute + amanager?.setStreamMute(AudioManager.STREAM_MUSIC, true) //for mute + // amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, true) audioMuteButton.setImageDrawable(offIcon); mapView.muteAudio = true } - +*/ } @@ -108,23 +261,31 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes override fun onResume(prefs: SharedPreferences) { - +/* mapView.muteAudio = prefs.getBoolean(LOCK_PREF, mapView.muteAudio) if(mapView.muteAudio) { audioMuteButton.setImageDrawable(offIcon) } else { audioMuteButton.setImageDrawable(onIcon) - } + }*/ + val context = mapView.context + val sharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) + muteAudio= sharedPreferences.getBoolean("MuteAudio", false) + if (muteAudio){ + audioMuteButton.setImageDrawable(offIcon); + } else { + audioMuteButton.setImageDrawable(onIcon); + } } override fun onPause(prefs: SharedPreferences.Editor) { - prefs.putBoolean(LOCK_PREF, mapView.muteAudio) + // prefs.putBoolean(LOCK_PREF, mapView.muteAudio) } } From 47920c9894feaac3e3ad351330f08424dffc9ce9 Mon Sep 17 00:00:00 2001 From: JonFaull <42946306+JonFaull@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:47:54 +0000 Subject: [PATCH 5/7] Added mute button for live rides. --- build.gradle | 2 +- .../cyclestreets/liveride/LiveRideState.kt | 29 +-- .../views/overlay/MuteButtonOverlay.kt | 193 ++---------------- .../src/main/res/layout/mutebutton.xml | 11 + 4 files changed, 29 insertions(+), 206 deletions(-) diff --git a/build.gradle b/build.gradle index 22705efad..13ce4390f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.1.0' + classpath 'com.android.tools.build:gradle:8.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" } } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt index 9160a2c2c..b855c538d 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.kt @@ -134,21 +134,6 @@ internal abstract class LiveRideState(protected val context: Context, return context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager } - /*fun onResume(prefs: SharedPreferences) { - - MapView mapView = new MapView() - mapView.muteAudio = prefs.getBoolean(MuteButtonOverlay.LOCK_PREF, mapView.muteAudio) - - if(mapView.muteAudio) { - audioMuteButton.setImageDrawable(offIcon) - } else { - audioMuteButton.setImageDrawable(onIcon) - } - - - - - }*/ companion object { private const val LOCK_PREF = "muteButton" @@ -160,25 +145,15 @@ internal abstract class LiveRideState(protected val context: Context, //mute = false val muteAudio: Boolean = sharedPreferences.getBoolean("MuteAudio", false) - - - - // tts?.speak(speechify(words), TextToSpeech.QUEUE_FLUSH, null, UUID.randomUUID().toString()) if(!muteAudio){ - Log.e("Is it mute: " , muteAudio.toString()) + Log.i("Is it mute: " , muteAudio.toString()) if (important) { tts?.speak(speechify(words), TextToSpeech.QUEUE_FLUSH, null, UUID.randomUUID().toString()) } else { tts?.speak(speechify(words), TextToSpeech.QUEUE_ADD, null, UUID.randomUUID().toString()) } } else { - Log.e("Is it mute: " , muteAudio.toString()) - - //tts?.stop() - - //textToSpeech.stop(); - - + Log.i("Is it mute: " , muteAudio.toString()) } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt index d8cc290dd..5b723d9b2 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt @@ -1,22 +1,26 @@ package net.cyclestreets.views.overlay //import kotlinx.coroutines.flow.internal.NoOpContinuation.context + +import android.R.id.message +import android.R.layout import android.content.Context import android.content.SharedPreferences import android.graphics.Canvas +import android.graphics.PixelFormat import android.graphics.drawable.Drawable -import android.media.AudioManager +import android.os.Build import android.speech.tts.TextToSpeech +import android.view.Gravity import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import android.widget.TextView import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat.getSystemService import com.google.android.material.floatingactionbutton.FloatingActionButton import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_mute import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_off import net.cyclestreets.iconics.IconicsHelper.materialIcon -import net.cyclestreets.liveride.LiveRideState -import net.cyclestreets.liveride.OnTheMove import net.cyclestreets.util.Theme.highlightColor import net.cyclestreets.util.Theme.lowlightColor import net.cyclestreets.view.R @@ -24,17 +28,10 @@ import net.cyclestreets.views.CycleMapView import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Overlay import java.util.Locale -import java.util.UUID - - -//mport kotlin.coroutines.jvm.internal.CompletedContinuation.context private var isAudioOn: Boolean = true -//private var mContext: Context? = null -//private lateinit var audioManager: AudioManager -//private var audioManager: AudioManager = new -//private var audioManager: AudioManager() + class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseResumeListener { @@ -48,6 +45,7 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes private var muteAudio: Boolean = false private lateinit var tts: TextToSpeech + init { val context = mapView.context @@ -74,84 +72,22 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes } - - /*tts = TextToSpeech(context) { status -> - if (status == TextToSpeech.SUCCESS) { - val result = tts.setLanguage(Locale.US) - - if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { - // Handle language not supported - } - } else { - // Handle initialization failure - } - }*/ mapView.addView(liveRideButtonView) } - fun initializeTextToSpeech(context: Context) { - //val context = context.getString(R.string.app_name) - - tts = TextToSpeech(context) { status -> - if (status == TextToSpeech.SUCCESS) { - val result = tts.setLanguage(Locale.US) - if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { - // Handle language not supported - } - } else { - // Handle initialization failure - } - } - } - /* public constructor(context: Context) : super() { - tts = TextToSpeech(context) { status -> - if (status == TextToSpeech.SUCCESS) { - val result = tts.setLanguage(Locale.US) - - if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { - // Handle language not supported - } - } else { - // Handle initialization failure - } - } - }*/ - - /* protected constructor(context: Context, tts: TextToSpeech?): - this(context, tts, context.getString(R.string.app_name))*/ private fun setMuteAudioState() { - /* Log.d("LiveRide", "Setting keepScreenOn state to $state") - screenLockButton.setImageDrawable(if (state) onIcon else offIcon) - val message = if (state) R.string.liveride_keep_screen_on_enabled else R.string.liveride_keep_screen_on_disabled - Toast.makeText(mapView.context, message, Toast.LENGTH_LONG).show() - mapView.keepScreenOn = state*/ - val context = mapView.context - //val amanager = getSystemService(context, AudioManager::class.java) as AudioManager? - /* audioManager = getSystemService(context, AudioManager::class.java) as AudioManager - val result = amanager?.requestAudioFocus( - null, - AudioManager.STREAM_MUSIC, - AudioManager.AUDIOFOCUS_GAIN_TRANSIENT - )*/ - - //amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, true) - - //getSystemService(context, AlarmManager::class.java) - // val streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) + val context = mapView.context val sharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) val editor = sharedPreferences.edit() muteAudio= sharedPreferences.getBoolean("MuteAudio", false) - - tts.speak("Text to say", TextToSpeech.QUEUE_FLUSH, null, UUID.randomUUID().toString()); - if(muteAudio){ audioMuteButton.setImageDrawable(onIcon); - // mapView.muteAudio = false + editor.putBoolean("MuteAudio", false) editor.commit() @@ -160,115 +96,16 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes audioMuteButton.setImageDrawable(offIcon); editor.putBoolean("MuteAudio", true) editor.commit() - //Toast.makeText(context, "Audio will stop after finished reading segment", Toast.LENGTH_SHORT).show() - - -/* - if (::tts.isInitialized) { - tts.stop() - }*/ - - - - - } - - - // editor.putBoolean("MuteAudio", false) - // editor.apply() - - - - - + Toast.makeText(mapView.context, "Audio will mute after playing current directions.", Toast.LENGTH_LONG).show() - // if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { - // Audio focus gained, mute your app's audio - /* if (mapView.muteAudio) { - amanager?.adjustVolume(AudioManager.ADJUST_UNMUTE, 0) - // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0) - audioMuteButton.setImageDrawable(onIcon); - mapView.muteAudio = false - - } else { - amanager?.adjustVolume(AudioManager.ADJUST_MUTE, 0) - // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, streamVolume, 0) - audioMuteButton.setImageDrawable(offIcon); - mapView.muteAudio = true - - }*/ - // amanager?.adjustVolume(AudioManager.ADJUST_MUTE, AudioManager.FLAG_PLAY_SOUND) - - - - - // OR - // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0) // Mute the audio in your app - - - - // } else { - // Failed to gain audio focus - // Handle accordingly (e.g., inform the user or try again later) - // } - - - - - - /* if (mapView.muteAudio) { - // isAudioOn = false - amanager?.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute - - // amanager.setStreamMute(AudioManager.STREAM_MUSIC, false) // for unmute - //val amanager = getSystemService(Context.AUDIO_SERVICE) as AudioManager? - // amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, false) - - //amanager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); - - audioMuteButton.setImageDrawable(onIcon); - mapView.muteAudio = false - - - } else { - //isAudioOn = true - amanager?.setStreamMute(AudioManager.STREAM_MUSIC, true) //for mute - // amanager!!.setStreamMute(AudioManager.STREAM_NOTIFICATION, true) - audioMuteButton.setImageDrawable(offIcon); - mapView.muteAudio = true } -*/ } - override fun draw(c: Canvas, osmv: MapView, shadow: Boolean) {} - - ///////////////////////////////////////// - - - /* override fun onStart(prefs: SharedPreferences) { - - mapView.muteAudio = prefs.getBoolean(LOCK_PREF, mapView.muteAudio) - - if(mapView.muteAudio) { - audioMuteButton.setImageDrawable(offIcon) - } else { - audioMuteButton.setImageDrawable(onIcon) - } - - }*/ - override fun onResume(prefs: SharedPreferences) { -/* - mapView.muteAudio = prefs.getBoolean(LOCK_PREF, mapView.muteAudio) - if(mapView.muteAudio) { - audioMuteButton.setImageDrawable(offIcon) - } else { - audioMuteButton.setImageDrawable(onIcon) - }*/ val context = mapView.context val sharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) @@ -285,7 +122,7 @@ class MuteButtonOverlay(private val mapView: CycleMapView) : Overlay(), PauseRes override fun onPause(prefs: SharedPreferences.Editor) { - // prefs.putBoolean(LOCK_PREF, mapView.muteAudio) + } } diff --git a/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml b/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml index 5c6086bcd..2992f280f 100644 --- a/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml +++ b/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml @@ -16,4 +16,15 @@ app:borderWidth="12dp" app:backgroundTint="@android:color/background_light" /> + + From 04a3c257f609d6b6fee8f1a1d48e6d6caa440727 Mon Sep 17 00:00:00 2001 From: JonFaull <42946306+JonFaull@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:50:12 +0000 Subject: [PATCH 6/7] Added mute button for live rides. --- .../views/overlay/MuteButtonOverlay.kt | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt index 5b723d9b2..3f2a7a72c 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/MuteButtonOverlay.kt @@ -1,21 +1,15 @@ package net.cyclestreets.views.overlay -//import kotlinx.coroutines.flow.internal.NoOpContinuation.context -import android.R.id.message -import android.R.layout import android.content.Context import android.content.SharedPreferences -import android.graphics.Canvas -import android.graphics.PixelFormat + import android.graphics.drawable.Drawable -import android.os.Build + import android.speech.tts.TextToSpeech -import android.view.Gravity + import android.view.LayoutInflater -import android.view.View -import android.view.WindowManager -import android.widget.TextView + import android.widget.Toast import com.google.android.material.floatingactionbutton.FloatingActionButton import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial.Icon.gmd_volume_mute @@ -25,9 +19,9 @@ import net.cyclestreets.util.Theme.highlightColor import net.cyclestreets.util.Theme.lowlightColor import net.cyclestreets.view.R import net.cyclestreets.views.CycleMapView -import org.osmdroid.views.MapView + import org.osmdroid.views.overlay.Overlay -import java.util.Locale + private var isAudioOn: Boolean = true From a86ab1e734dbb2355f36bd09c0079e722f2c6c49 Mon Sep 17 00:00:00 2001 From: JonFaull <42946306+JonFaull@users.noreply.github.com> Date: Mon, 1 Apr 2024 18:45:37 +0100 Subject: [PATCH 7/7] Added mute button for live rides. --- .../src/main/res/drawable/volume_mute.xml | 9 --------- .../src/main/res/layout/mutebutton.xml | 11 +---------- 2 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml diff --git a/libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml b/libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml deleted file mode 100644 index 17f87d666..000000000 --- a/libraries/cyclestreets-view/src/main/res/drawable/volume_mute.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml b/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml index 2992f280f..19d5b3af2 100644 --- a/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml +++ b/libraries/cyclestreets-view/src/main/res/layout/mutebutton.xml @@ -16,15 +16,6 @@ app:borderWidth="12dp" app:backgroundTint="@android:color/background_light" /> - +