diff --git a/OsmAnd/res/layout/list_item_icon_and_download.xml b/OsmAnd/res/layout/list_item_icon_and_download.xml
index 725742eb27..eab556dd26 100644
--- a/OsmAnd/res/layout/list_item_icon_and_download.xml
+++ b/OsmAnd/res/layout/list_item_icon_and_download.xml
@@ -79,6 +79,21 @@
+
+
findIndexItemsAt(OsmandApplication app, String groupTypeVoice) throws IOException {
DownloadIndexesThread downloadThread = app.getDownloadThread();
DownloadResources indexes = downloadThread.getIndexes();
- DownloadResourceGroup groupVoice = indexes.getGroupById(groupTypeVoice);
- List groupList = groupVoice.getGroups();
- List items = groupList.get(0).getIndividualDownloadItems();
+ DownloadResourceGroup groupVoice = indexes.getSubGroupById(groupTypeVoice);
+ List items = groupVoice.getIndividualDownloadItems();
return new ArrayList<>(items);
}
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java
index d86f4b4586..cc6c9edffd 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java
@@ -1,9 +1,6 @@
package net.osmand.plus.settings.fragments;
-import android.app.Activity;
-import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.net.Uri;
import android.view.LayoutInflater;
@@ -23,21 +20,13 @@ import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.SpeedCamerasBottomSheet;
-import net.osmand.plus.download.DownloadActivity;
-import net.osmand.plus.download.DownloadActivityType;
-import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.settings.backend.ApplicationMode;
-import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.bottomsheets.AnnouncementTimeBottomSheet;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
-import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
import net.osmand.plus.wikipedia.WikipediaDialogFragment;
-import java.util.Set;
-
import static net.osmand.plus.UiUtilities.CompoundButtonType.TOOLBAR;
-import static net.osmand.plus.settings.backend.OsmandSettings.VOICE_PROVIDER_NOT_USE;
public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPreferenceChanged {
@@ -204,7 +193,7 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
@Override
protected void onBindPreferenceViewHolder(Preference preference, PreferenceViewHolder holder) {
super.onBindPreferenceViewHolder(preference, holder);
- if (settings.SPEED_CAMERAS_UNINSTALLED.getId().equals(preference.getKey())) {
+ if (settings.SPEED_CAMERAS_UNINSTALLED.getId().equals(preference.getKey())) {
setupPrefRoundedBg(holder);
}
}
@@ -232,7 +221,7 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
@Override
public void onApplyPreferenceChange(String prefId, boolean applyToAllProfiles, Object newValue) {
- if (prefId.equals(settings.AUDIO_MANAGER_STREAM.getId())) {
+ if (prefId.equals(settings.AUDIO_MANAGER_STREAM.getId())) {
// Sync DEFAULT value with CAR value, as we have other way to set it for now
if (getSelectedAppMode().equals(ApplicationMode.CAR) && newValue instanceof Integer) {
@@ -251,8 +240,6 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
String prefId = preference.getKey();
if (settings.SPEED_CAMERAS_UNINSTALLED.getId().equals(prefId)) {
SpeedCamerasBottomSheet.showInstance(requireActivity().getSupportFragmentManager(), this);
- } else if (settings.VOICE_PROVIDER.getId().equals(prefId)) {
- VoiceLanguageBottomSheetFragment.showInstance(requireActivity().getSupportFragmentManager(), this);
}
return super.onPreferenceClick(preference);
}
@@ -260,12 +247,13 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
@Override
public void onDisplayPreferenceDialog(Preference preference) {
String prefId = preference.getKey();
-
if (settings.ARRIVAL_DISTANCE_FACTOR.getId().equals(prefId)) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
AnnouncementTimeBottomSheet.showInstance(fragmentManager, preference.getKey(), this, getSelectedAppMode(), false);
}
+ } else if (settings.VOICE_PROVIDER.getId().equals(prefId)) {
+ VoiceLanguageBottomSheetFragment.showInstance(requireActivity().getSupportFragmentManager(), this, preference.getKey(), false);
} else {
super.onDisplayPreferenceDialog(preference);
}
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceLanguageBottomSheetFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceLanguageBottomSheetFragment.java
index 0d27c369a7..9273bcd089 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceLanguageBottomSheetFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceLanguageBottomSheetFragment.java
@@ -10,6 +10,7 @@ import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
+import androidx.annotation.DimenRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
@@ -17,6 +18,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import net.osmand.AndroidUtils;
+import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
@@ -24,7 +26,7 @@ import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
-import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerHalfItem;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.download.DownloadIndexesThread;
import net.osmand.plus.download.DownloadItem;
@@ -39,6 +41,8 @@ import net.osmand.plus.track.TrackSelectSegmentBottomSheet;
import net.osmand.plus.widgets.MultiStateToggleButton;
import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem;
+import org.apache.commons.logging.Log;
+
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -47,23 +51,39 @@ import java.util.Collections;
import java.util.List;
import java.util.Locale;
+import static net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
+import static net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType.OTHER_GROUP;
+import static net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType.VOICE_HEADER_REC;
+import static net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType.VOICE_HEADER_TTS;
+import static net.osmand.plus.settings.bottomsheets.BasePreferenceBottomSheet.PREFERENCE_ID;
+
public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragment implements DownloadIndexesThread.DownloadEvents {
private static final String TAG = TrackSelectSegmentBottomSheet.class.getSimpleName();
- private static final String VOICE_REC = "#other_group#voice_rec";
- private static final String VOICE_TTS = "#other_group#voice_tts";
+ private static final String VOICE_REC = OTHER_GROUP.getDefaultId() + "#" + DownloadResourceGroupType.VOICE_TTS.getDefaultId() + "#" + VOICE_HEADER_TTS.getDefaultId();
+ private static final String VOICE_TTS = OTHER_GROUP.getDefaultId() + "#" + DownloadResourceGroupType.VOICE_REC.getDefaultId() + "#" + VOICE_HEADER_REC.getDefaultId();
private static final int DEFAULT_LANGUAGE_POSITION = 6;
+ private static final Log LOG = PlatformUtil.getLog(VoiceLanguageBottomSheetFragment.class);
protected OsmandSettings settings;
private OsmandApplication app;
private Context context;
- private Context themedCtx;
private InfoType selectedVoiceType = InfoType.TTS;
private boolean isTtsDescription;
private int padding;
- public static void showInstance(@NonNull FragmentManager fm, Fragment targetFragment) {
- VoiceLanguageBottomSheetFragment fragment = new VoiceLanguageBottomSheetFragment();
- fragment.setTargetFragment(targetFragment, 0);
- fragment.show(fm, TAG);
+ public static void showInstance(@NonNull FragmentManager fm, Fragment targetFragment, String key, boolean usedOnMap) {
+ try {
+ if (!fm.isStateSaved()) {
+ Bundle args = new Bundle();
+ args.putString(PREFERENCE_ID, key);
+ VoiceLanguageBottomSheetFragment fragment = new VoiceLanguageBottomSheetFragment();
+ fragment.setArguments(args);
+ fragment.setUsedOnMap(usedOnMap);
+ fragment.setTargetFragment(targetFragment, 0);
+ fragment.show(fm, TAG);
+ }
+ } catch (RuntimeException e) {
+ LOG.error("showInstance", e);
+ }
}
@Override
@@ -73,7 +93,6 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
private void updateItems() {
Activity activity = getActivity();
- themedCtx = UiUtilities.getThemedContext(activity, nightMode);
View mainView = getView();
if (activity != null && mainView != null) {
LinearLayout itemsContainer = (LinearLayout) mainView.findViewById(useScrollableItemsContainer()
@@ -84,7 +103,7 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
items.clear();
createMenuItems(null);
for (BaseBottomSheetItem item : items) {
- item.inflate(themedCtx, itemsContainer, nightMode);
+ item.inflate(context, itemsContainer, nightMode);
}
setupHeightAndBackground(mainView);
}
@@ -126,7 +145,6 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- createVoiceView();
}
@Override
@@ -137,11 +155,9 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
@Override
public void createMenuItems(Bundle savedInstanceState) {
- app = requiredMyApplication();
context = requireContext();
- themedCtx = UiUtilities.getThemedContext(app, nightMode);
settings = app.getSettings();
- padding = getResources().getDimensionPixelSize(R.dimen.content_padding_small);
+ padding = getDimen(R.dimen.content_padding_small);
LayoutInflater inflater = UiUtilities.getInflater(app, nightMode);
BaseBottomSheetItem titleItem = new BottomSheetItemWithDescription.Builder()
@@ -151,7 +167,7 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
.create();
items.add(titleItem);
- items.add(new DividerSpaceItem(themedCtx, padding));
+ items.add(new DividerSpaceItem(context, padding));
LinearLayout voiceTypeButtons = (LinearLayout) inflater.inflate(R.layout.custom_radio_buttons, null);
LinearLayout.MarginLayoutParams itemTimeOfDayParams = new LinearLayout.MarginLayoutParams(
@@ -209,24 +225,23 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
private void createSuggestedVoiceItems(List suggestedMaps) {
final OsmandApplication app = requiredMyApplication();
- themedCtx = UiUtilities.getThemedContext(app, nightMode);
RoutingHelper routingHelper = app.getRoutingHelper();
final ApplicationMode applicationMode = routingHelper.getAppMode();
- items.add(new DividerSpaceItem(themedCtx, padding));
+ items.add(new DividerSpaceItem(context, padding));
BaseBottomSheetItem switchStartAndEndItem = new BottomSheetItemWithDescription.Builder()
.setDescription(getString(isTtsDescription ? R.string.tts_description : R.string.recorded_description))
.setLayoutId(R.layout.bottom_sheet_item_description_long)
.create();
items.add(switchStartAndEndItem);
- items.add(new DividerHalfItem(themedCtx));
+ items.add(createDividerItem());
final DownloadIndexesThread downloadThread = app.getDownloadThread();
for (final DownloadItem indexItem : suggestedMaps) {
- View view = UiUtilities.getInflater(themedCtx, nightMode).inflate(R.layout.list_item_icon_and_download, null);
- AndroidUtils.setBackground(view, UiUtilities.getSelectableDrawable(themedCtx));
+ View view = UiUtilities.getInflater(context, nightMode).inflate(R.layout.list_item_icon_and_download, null);
+ AndroidUtils.setBackground(view, UiUtilities.getSelectableDrawable(context));
view.findViewById(R.id.divider).setVisibility(View.GONE);
String systemLanguage = Locale.getDefault().getLanguage();
@@ -239,10 +254,12 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
final ImageView secondaryIcon = view.findViewById(R.id.secondary_icon);
int color = ContextCompat.getColor(context, nightMode ? R.color.wikivoyage_active_dark : R.color.wikivoyage_active_light);
+ int activeColorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light;
secondaryIcon.setColorFilter(color, android.graphics.PorterDuff.Mode.MULTIPLY);
final ProgressBar progressBar = view.findViewById(R.id.ProgressBar);
final TextView textDescription = view.findViewById(R.id.description);
+ final TextView compoundButton = view.findViewById(R.id.compound_button);
AndroidUiHelper.updateVisibility(secondaryIcon, true);
AndroidUiHelper.updateVisibility(progressBar, downloadThread.isDownloading((IndexItem) indexItem));
@@ -257,14 +274,16 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
}
if (indexItem.isDownloaded()) {
+ AndroidUiHelper.updateVisibility(compoundButton, true);
+ AndroidUiHelper.updateVisibility(secondaryIcon, false);
final BottomSheetItemWithCompoundButton[] voiceDownloadedItem = new BottomSheetItemWithCompoundButton[1];
voiceDownloadedItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
+ .setCompoundButtonColorId(activeColorResId)
.setChecked(settings.VOICE_PROVIDER.getModeValue(applicationMode).contains(indexItem.getBasename()))
.setDescription(description)
.setIconHidden(true)
.setTitle(title)
.setPosition(position)
- .setLayoutId(R.layout.bottom_sheet_item_with_descr_and_radio_btn)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -274,6 +293,7 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
updateItems();
}
})
+ .setCustomView(view)
.create();
items.add(voiceDownloadedItem[0]);
} else {
@@ -306,6 +326,18 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
}
}
+ public int getDimen(@DimenRes int id) {
+ return getResources().getDimensionPixelSize(id);
+ }
+
+ private BaseBottomSheetItem createDividerItem() {
+ DividerItem dividerItem = new DividerItem(app);
+ int start = getDimen(R.dimen.content_padding);
+ int vertical = getDimen(R.dimen.content_padding_small_half);
+ dividerItem.setMargins(start, vertical, 0, vertical);
+ return dividerItem;
+ }
+
public List getVoiceList(String type) {
List suggestedVoice = new ArrayList<>();
@@ -329,7 +361,7 @@ public class VoiceLanguageBottomSheetFragment extends MenuBottomSheetDialogFragm
try {
return DownloadResources.findIndexItemsAt(app, type);
} catch (IOException e) {
- e.printStackTrace();
+ LOG.error(e);
}
return Collections.emptyList();
}