forked from upstream-mirrors/OpenTracks
Voice announcements: added setting to skip announcements on the device's internal speaker.
Fixes #1392.
This commit is contained in:
@@ -131,6 +131,7 @@ dependencies {
|
|||||||
implementation 'com.google.android.material:material:1.8.0'
|
implementation 'com.google.android.material:material:1.8.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
implementation 'androidx.core:core-splashscreen:1.0.0'
|
implementation 'androidx.core:core-splashscreen:1.0.0'
|
||||||
|
implementation 'androidx.mediarouter:mediarouter:1.3.1'
|
||||||
|
|
||||||
androidTestImplementation 'androidx.test:core:1.5.0'
|
androidTestImplementation 'androidx.test:core:1.5.0'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
|||||||
TrackPoint trackPoint = data.second.first;
|
TrackPoint trackPoint = data.second.first;
|
||||||
egm2008CorrectionManager.correctAltitude(this, trackPoint);
|
egm2008CorrectionManager.correctAltitude(this, trackPoint);
|
||||||
|
|
||||||
localVoiceAnnouncementManager.update(data.first);
|
localVoiceAnnouncementManager.update(this, data.first);
|
||||||
|
|
||||||
recordingDataObservable.postValue(new RecordingData(data.first, trackPoint, data.second.second));
|
recordingDataObservable.postValue(new RecordingData(data.first, trackPoint, data.second.second));
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-1
@@ -15,12 +15,14 @@
|
|||||||
*/
|
*/
|
||||||
package de.dennisguse.opentracks.services.announcement;
|
package de.dennisguse.opentracks.services.announcement;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
import androidx.mediarouter.media.MediaRouter;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
@@ -73,12 +75,20 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe
|
|||||||
updateNextTaskDistance();
|
updateNextTaskDistance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update(@NonNull Track track) {
|
public void update(@NonNull Context context, @NonNull Track track) {
|
||||||
if (voiceAnnouncement == null) {
|
if (voiceAnnouncement == null) {
|
||||||
Log.e(TAG, "Cannot update when in status shutdown.");
|
Log.e(TAG, "Cannot update when in status shutdown.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!PreferencesUtils.shouldVoiceAnnouncementOnDeviceSpeaker()
|
||||||
|
&& MediaRouter.getInstance(context)
|
||||||
|
.getSelectedRoute()
|
||||||
|
.isDeviceSpeaker()) {
|
||||||
|
Log.i(TAG, "No voice announcement on device speaker.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
boolean announce = false;
|
boolean announce = false;
|
||||||
this.trackStatistics = track.getTrackStatistics();
|
this.trackStatistics = track.getTrackStatistics();
|
||||||
if (trackStatistics.getTotalDistance().greaterThan(nextTotalDistance)) {
|
if (trackStatistics.getTotalDistance().greaterThan(nextTotalDistance)) {
|
||||||
|
|||||||
@@ -302,6 +302,11 @@ public class PreferencesUtils {
|
|||||||
return getBoolean(R.string.stats_fullscreen_while_recording_key, DEFAULT);
|
return getBoolean(R.string.stats_fullscreen_while_recording_key, DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean shouldVoiceAnnouncementOnDeviceSpeaker() {
|
||||||
|
final boolean DEFAULT = resources.getBoolean(R.bool.voice_on_device_speaker_default);
|
||||||
|
return getBoolean(R.string.voice_on_device_speaker_key, DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
public static Duration getVoiceAnnouncementFrequency() {
|
public static Duration getVoiceAnnouncementFrequency() {
|
||||||
final int DEFAULT = Integer.parseInt(resources.getString(R.string.voice_announcement_frequency_default));
|
final int DEFAULT = Integer.parseInt(resources.getString(R.string.voice_announcement_frequency_default));
|
||||||
int value = getInt(R.string.voice_announcement_frequency_key, DEFAULT);
|
int value = getInt(R.string.voice_announcement_frequency_key, DEFAULT);
|
||||||
|
|||||||
@@ -235,6 +235,8 @@
|
|||||||
<item>1.2</item>
|
<item>1.2</item>
|
||||||
<item>1.3</item>
|
<item>1.3</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string name="voice_on_device_speaker_key" translatable="false">voiceOnDeviceSpeaker</string>
|
||||||
|
<bool name="voice_on_device_speaker_default" translatable="false">true</bool>
|
||||||
<string name="voice_announce_total_distance_key" translatable="false">voiceAnnounceTotalDistance</string>
|
<string name="voice_announce_total_distance_key" translatable="false">voiceAnnounceTotalDistance</string>
|
||||||
<string name="voice_announce_moving_time_key" translatable="false">voiceAnnounceMovingTime</string>
|
<string name="voice_announce_moving_time_key" translatable="false">voiceAnnounceMovingTime</string>
|
||||||
<string name="voice_announce_average_speed_pace_key" translatable="false">voiceAnnounceAverageSpeedPace</string>
|
<string name="voice_announce_average_speed_pace_key" translatable="false">voiceAnnounceAverageSpeedPace</string>
|
||||||
|
|||||||
@@ -575,6 +575,7 @@ limitations under the License.
|
|||||||
<item quantity="one">1 knot</item>
|
<item quantity="one">1 knot</item>
|
||||||
<item quantity="other">%1$.1f knots</item>
|
<item quantity="other">%1$.1f knots</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="voice_on_device_speaker_title">Use the device\'s speaker</string>
|
||||||
<string name="voice_per_kilometer">per kilometer</string>
|
<string name="voice_per_kilometer">per kilometer</string>
|
||||||
<string name="voice_per_mile">per mile</string>
|
<string name="voice_per_mile">per mile</string>
|
||||||
<string name="voice_per_nautical_mile">per nautical mile</string>
|
<string name="voice_per_nautical_mile">per nautical mile</string>
|
||||||
|
|||||||
@@ -26,6 +26,10 @@
|
|||||||
android:title="@string/menu_voice_rate"
|
android:title="@string/menu_voice_rate"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="@bool/voice_on_device_speaker_default"
|
||||||
|
android:key="@string/voice_on_device_speaker_key"
|
||||||
|
android:title="@string/voice_on_device_speaker_title" />
|
||||||
<PreferenceCategory android:title="@string/settings_announcements_title">
|
<PreferenceCategory android:title="@string/settings_announcements_title">
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
|
|||||||
Reference in New Issue
Block a user