Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion assets/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,6 @@
"selectFirstStationTitle": "Please select the first station",
"longPressNotice": "Press and hold the screen to open the menu.",
"autoAnnounceBackgroundTitle": "Enable background voice announcement",
"bgTtsUnavailableOnAndroid16": "Background playback is not available on Android 16 or later due to OS restrictions.",
"loadingLocation": "Getting location information...",
"loadingAPI": "Communicating with server...",
"routeSearchTitle": "Find a route",
Expand Down
1 change: 0 additions & 1 deletion assets/translations/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@
"selectFirstStationTitle": "始発駅を選択してください",
"longPressNotice": "画面を長押しするとメニューが開けます",
"autoAnnounceBackgroundTitle": "バックグラウンド再生",
"bgTtsUnavailableOnAndroid16": "Android 16以降ではOSの制限によりバックグラウンド再生を利用できません。",
"loadingLocation": "位置情報を取得中です",
"loadingAPI": "サーバーと通信中です",
"routeSearchTitle": "経路を検索",
Expand Down
9 changes: 1 addition & 8 deletions src/components/Permitted.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -303,18 +303,11 @@ const PermittedLayout: React.FC<Props> = ({ children }: Props) => {
enabled: speechEnabledStr === 'true',
}));
}
const isAndroid16OrHigher =
Platform.OS === 'android' && Number(Platform.Version) >= 36;
if (bgTTSEnabledStr) {
const bgEnabled = bgTTSEnabledStr === 'true' && !isAndroid16OrHigher;
setSpeech((prev) => ({
...prev,
backgroundEnabled: bgEnabled,
backgroundEnabled: bgTTSEnabledStr === 'true',
}));
// Android 16以上で保存値がtrueの場合、永続化もfalseに上書き
if (isAndroid16OrHigher && bgTTSEnabledStr === 'true') {
AsyncStorage.setItem(ASYNC_STORAGE_KEYS.BG_TTS_ENABLED, 'false');
}
}
if (ttsEnabledLanguagesStr) {
try {
Expand Down
40 changes: 3 additions & 37 deletions src/screens/TTSSettings.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import AsyncStorage from '@react-native-async-storage/async-storage';
import { useNavigation } from '@react-navigation/native';
import { useAtom, useAtomValue } from 'jotai';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import React, { useCallback, useMemo, useState } from 'react';
import {
Alert,
type GestureResponderEvent,
Platform,
Pressable,
StyleSheet,
View,
Expand All @@ -23,7 +22,6 @@ import Typography from '~/components/Typography';
import speechState from '~/store/atoms/speech';
import { isLEDThemeAtom } from '~/store/atoms/theme';
import { translate } from '~/translation';
import { isDevApp } from '~/utils/isDevApp';
import { ASYNC_STORAGE_KEYS } from '../constants';

type SettingItem = {
Expand Down Expand Up @@ -114,18 +112,6 @@ const TTSSettingsScreen: React.FC = () => {

const navigation = useNavigation();

// Android 16 (API 36) ではバックグラウンド音声再生が制限されるため無効化
const isAndroid16OrHigher =
!isDevApp && Platform.OS === 'android' && Number(Platform.Version) >= 36;

// Android 16以上ではバックグラウンド再生を強制的にfalseにする
useEffect(() => {
if (isAndroid16OrHigher && backgroundEnabled) {
setSpeechState((prev) => ({ ...prev, backgroundEnabled: false }));
AsyncStorage.setItem(ASYNC_STORAGE_KEYS.BG_TTS_ENABLED, 'false');
}
}, [isAndroid16OrHigher, backgroundEnabled, setSpeechState]);

const SETTING_ITEMS: SettingItem[] = [
{
id: 'enable_tts',
Expand Down Expand Up @@ -335,16 +321,8 @@ const TTSSettingsScreen: React.FC = () => {
isFirst={index === 0}
isLast={index === SETTING_ITEMS.length - 1}
onToggle={onToggle}
state={
item.id === 'enable_bg_tts' &&
(!speechEnabled || isAndroid16OrHigher)
? false
: state
}
disabled={
item.id === 'enable_bg_tts' &&
(!speechEnabled || isAndroid16OrHigher)
}
state={item.id === 'enable_bg_tts' && !speechEnabled ? false : state}
disabled={item.id === 'enable_bg_tts' && !speechEnabled}
/>
);
},
Expand All @@ -353,7 +331,6 @@ const TTSSettingsScreen: React.FC = () => {
handleToggleBgTTS,
speechEnabled,
backgroundEnabled,
isAndroid16OrHigher,
SETTING_ITEMS.length,
]
);
Expand All @@ -379,17 +356,6 @@ const TTSSettingsScreen: React.FC = () => {
onScroll={handleScroll}
ListFooterComponent={() => (
<>
{isAndroid16OrHigher ? (
<Typography
style={{
marginTop: 12,
fontSize: 14,
color: isLEDTheme ? '#ccc' : '#666',
}}
>
{translate('bgTtsUnavailableOnAndroid16')}
</Typography>
) : null}
<View style={{ marginTop: 16 }}>
{TTS_LANGUAGE_ITEMS.map((item, index) => {
const state = ttsEnabledLanguages.includes(item.id);
Expand Down