From 4815a8f35759ce8b6af9692287e018dc8c0364eb Mon Sep 17 00:00:00 2001 From: "S. Kozyr" Date: Sat, 4 Mar 2023 21:10:09 +0200 Subject: [PATCH] Disable 3D buildings preference if power saving is enabled. Added new string 'pref_map_3d_buildings_disabled_summary' Instead of nullable method findReference introduced NonNull method getReference. [iOS] Added alert on disabled 3D building setting tap Signed-off-by: S. Kozyr --- .../settings/BaseXmlSettingsFragment.java | 10 ++ .../settings/SettingsPrefsFragment.java | 159 +++++++----------- data/strings/strings.txt | 42 +++++ .../UI/Settings/MWMSettingsViewController.mm | 30 +++- 4 files changed, 143 insertions(+), 98 deletions(-) diff --git a/android/src/app/organicmaps/settings/BaseXmlSettingsFragment.java b/android/src/app/organicmaps/settings/BaseXmlSettingsFragment.java index 11245d7b44..a3ec21b96b 100644 --- a/android/src/app/organicmaps/settings/BaseXmlSettingsFragment.java +++ b/android/src/app/organicmaps/settings/BaseXmlSettingsFragment.java @@ -4,9 +4,11 @@ import android.content.Context; import android.os.Bundle; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.XmlRes; import androidx.core.content.ContextCompat; +import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import app.organicmaps.R; @@ -17,6 +19,14 @@ abstract class BaseXmlSettingsFragment extends PreferenceFragmentCompat { protected abstract @XmlRes int getXmlResources(); + @NonNull + public T getPreference(@NonNull CharSequence key) + { + final T pref = findPreference(key); + if (pref == null) + throw new RuntimeException("Can't get preference by key: "+key); + return pref; + } @Override public void onCreatePreferences(Bundle bundle, String root) { diff --git a/android/src/app/organicmaps/settings/SettingsPrefsFragment.java b/android/src/app/organicmaps/settings/SettingsPrefsFragment.java index 49731eb609..97b8896997 100644 --- a/android/src/app/organicmaps/settings/SettingsPrefsFragment.java +++ b/android/src/app/organicmaps/settings/SettingsPrefsFragment.java @@ -1,6 +1,5 @@ package app.organicmaps.settings; -import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -72,7 +71,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - Preference root = findPreference(getString(R.string.pref_tts_screen)); + final Preference root = getPreference(getString(R.string.pref_tts_screen)); boolean set = (Boolean)newValue; if (!set) { @@ -84,8 +83,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment if (mLangInfoLink != null && isOnTtsScreen()) getPreferenceScreen().addPreference(mLangInfoLink); - if (root != null) - root.setSummary(R.string.off); + root.setSummary(R.string.off); if (mPrefEnabled != null) mPrefEnabled.setTitle(R.string.off); @@ -94,8 +92,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment if (mLangInfo != null) mLangInfo.setSummary(R.string.prefs_languages_information); - if (root != null) - root.setSummary(R.string.on); + root.setSummary(R.string.on); if (mPrefEnabled != null) mPrefEnabled.setTitle(R.string.on); if (mLangInfoLink != null) @@ -127,10 +124,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment if (lang.downloaded) setLanguage(lang); else - { UiUtils.startActivityForResult(SettingsPrefsFragment.this, new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA), REQUEST_INSTALL_DATA); - } return false; } @@ -165,7 +160,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment mLanguages.clear(); mCurrentLanguage = null; - Preference root = findPreference(getString(R.string.pref_tts_screen)); + final Preference root = getPreference(getString(R.string.pref_tts_screen)); if (languages.isEmpty()) { @@ -178,8 +173,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment mLangInfo.setSummary(R.string.prefs_languages_information_off); if (isOnTtsScreen()) getPreferenceScreen().addPreference(mLangInfoLink); - if (root != null) - root.setSummary(R.string.off); + root.setSummary(R.string.off); enableListeners(true); return; @@ -247,11 +241,11 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment { super.onViewCreated(view, savedInstanceState); mPreferenceScreen = getPreferenceScreen(); - mStoragePref = findPreference(getString(R.string.pref_storage)); - mPrefEnabled = findPreference(getString(R.string.pref_tts_enabled)); - mPrefLanguages = findPreference(getString(R.string.pref_tts_language)); - mLangInfo = findPreference(getString(R.string.pref_tts_info)); - mLangInfoLink = findPreference(getString(R.string.pref_tts_info_link)); + mStoragePref = getPreference(getString(R.string.pref_storage)); + mPrefEnabled = getPreference(getString(R.string.pref_tts_enabled)); + mPrefLanguages = getPreference(getString(R.string.pref_tts_language)); + mLangInfo = getPreference(getString(R.string.pref_tts_info)); + mLangInfoLink = getPreference(getString(R.string.pref_tts_info_link)); initLangInfoLink(); initStoragePrefCallbacks(); initMeasureUnitsPrefsCallbacks(); @@ -273,9 +267,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment if (!playServices && !crashReports) { // Remove "Tracking" section completely. - PreferenceCategory tracking = findPreference(getString(R.string.pref_subtittle_opt_out)); - if (tracking != null) - mPreferenceScreen.removePreference(tracking); + final PreferenceCategory tracking = getPreference(getString(R.string.pref_subtittle_opt_out)); + mPreferenceScreen.removePreference(tracking); } initScreenSleepEnabledPrefsCallbacks(); initShowOnLockScreenPrefsCallbacks(); @@ -285,10 +278,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initSpeedCamerasPrefs() { String key = getString(R.string.pref_speed_cameras); - final ListPreference pref = findPreference(key); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final ListPreference pref = getPreference(key); pref.setSummary(pref.getEntry()); pref.setOnPreferenceChangeListener(this::onSpeedCamerasPrefSelected); } @@ -376,10 +366,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initLargeFontSizePrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_large_fonts_size)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_large_fonts_size)); ((TwoStatePreference)pref).setChecked(Config.isLargeFontsSize()); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() @@ -399,10 +386,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initTransliterationPrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_transliteration)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_transliteration)); ((TwoStatePreference)pref).setChecked(Config.isTransliteration()); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() @@ -422,10 +406,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initUseMobileDataPrefsCallbacks() { - final ListPreference mobilePref = findPreference( - getString(R.string.pref_use_mobile_data)); - if (mobilePref == null) - return; + final ListPreference mobilePref = getPreference(getString(R.string.pref_use_mobile_data)); NetworkPolicy.Type curValue = Config.getUseMobileDataSettings(); if (curValue == NetworkPolicy.Type.NOT_TODAY || curValue == NetworkPolicy.Type.TODAY) @@ -446,10 +427,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initPowerManagementPrefsCallbacks() { - final ListPreference powerManagementPref = findPreference( - getString(R.string.pref_power_management)); - if (powerManagementPref == null) - return; + final ListPreference powerManagementPref = getPreference(getString(R.string.pref_power_management)); @PowerManagment.SchemeType int curValue = PowerManagment.getScheme(); @@ -462,16 +440,15 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment PowerManagment.setScheme(scheme); + disableOrEnable3DBuildingsForPowerMode(scheme); + return true; }); } private void initLoggingEnabledPrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_enable_logging)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_enable_logging)); ((TwoStatePreference) pref).setChecked(LogsManager.INSTANCE.isFileLoggingEnabled()); pref.setOnPreferenceChangeListener((preference, newValue) -> { @@ -487,10 +464,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initEmulationBadStorage() { - Preference pref = findPreference(getString(R.string.pref_emulate_bad_external_storage)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_emulate_bad_external_storage)); if (!SharedPropertiesUtils.shouldShowEmulateBadStorageSetting(requireContext())) removePreference(getString(R.string.pref_settings_general), pref); @@ -498,10 +472,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initAutoZoomPrefsCallbacks() { - final TwoStatePreference pref = findPreference(getString(R.string.pref_auto_zoom)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final TwoStatePreference pref = getPreference(getString(R.string.pref_auto_zoom)); boolean autozoomEnabled = Framework.nativeGetAutoZoomEnabled(); pref.setChecked(autozoomEnabled); @@ -518,10 +489,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private boolean initPlayServicesPrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_play_services)); - // TODO: check whether it's needed #2049 - if (pref == null) - return false; + final Preference pref = getPreference(getString(R.string.pref_play_services)); if (!LocationProviderFactory.isGoogleLocationAvailable(requireActivity().getApplicationContext())) { @@ -552,15 +520,16 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void init3dModePrefsCallbacks() { - final TwoStatePreference pref = findPreference(getString(R.string.pref_3d_buildings)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final TwoStatePreference pref = getPreference(getString(R.string.pref_3d_buildings)); final Framework.Params3dMode _3d = new Framework.Params3dMode(); Framework.nativeGet3dMode(_3d); - pref.setChecked(_3d.buildings); + // Read power managements preference. + final ListPreference powerManagementPref = getPreference(getString(R.string.pref_power_management)); + final String powerManagementValueStr = powerManagementPref.getValue(); + final Integer powerManagementValue = (powerManagementValueStr!=null) ? Integer.parseInt(powerManagementValueStr) : null; + disableOrEnable3DBuildingsForPowerMode(powerManagementValue); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @@ -573,12 +542,33 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment }); } + // Argument `powerManagementValue` could be null on the first app run. + private void disableOrEnable3DBuildingsForPowerMode(@Nullable Integer powerManagementValue) + { + final TwoStatePreference pref = getPreference(getString(R.string.pref_3d_buildings)); + + if (powerManagementValue != null && powerManagementValue == PowerManagment.HIGH) + { + pref.setShouldDisableView(true); + pref.setEnabled(false); + pref.setSummary(getString(R.string.pref_map_3d_buildings_disabled_summary)); + pref.setChecked(false); + } + else + { + final Framework.Params3dMode _3d = new Framework.Params3dMode(); + Framework.nativeGet3dMode(_3d); + + pref.setShouldDisableView(false); + pref.setEnabled(true); + pref.setSummary(""); + pref.setChecked(_3d.buildings); + } + } + private void initPerspectivePrefsCallbacks() { - final TwoStatePreference pref = findPreference(getString(R.string.pref_3d)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final TwoStatePreference pref = getPreference(getString(R.string.pref_3d)); final Framework.Params3dMode _3d = new Framework.Params3dMode(); Framework.nativeGet3dMode(_3d); @@ -598,10 +588,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initAutoDownloadPrefsCallbacks() { - TwoStatePreference pref = findPreference(getString(R.string.pref_autodownload)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final TwoStatePreference pref = getPreference(getString(R.string.pref_autodownload)); pref.setChecked(Config.isAutodownloadEnabled()); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() @@ -622,10 +609,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initMapStylePrefsCallbacks() { - final ListPreference pref = findPreference(getString(R.string.pref_map_style)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final ListPreference pref = getPreference(getString(R.string.pref_map_style)); String curTheme = Config.getUiThemeSettings(requireContext()); pref.setValue(curTheme); @@ -650,10 +634,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initZoomPrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_show_zoom_buttons)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_show_zoom_buttons)); ((TwoStatePreference)pref).setChecked(Config.showZoomButtons()); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() @@ -669,10 +650,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initMeasureUnitsPrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_munits)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_munits)); ((ListPreference)pref).setValue(String.valueOf(UnitLocale.getUnits())); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() @@ -716,11 +694,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private boolean initCrashReports() { - String key = getString(R.string.pref_crash_reports); - Preference pref = findPreference(key); - // TODO: check whether it's needed #2049 - if (pref == null) - return false; + final Preference pref = getPreference(getString(R.string.pref_crash_reports)); if (!CrashlyticsUtils.INSTANCE.isAvailable()) { @@ -735,10 +709,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initScreenSleepEnabledPrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_screen_sleep)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_screen_sleep)); final boolean isScreenSleepEnabled = Config.isScreenSleepEnabled(); ((TwoStatePreference) pref).setChecked(isScreenSleepEnabled); @@ -757,10 +728,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initShowOnLockScreenPrefsCallbacks() { - Preference pref = findPreference(getString(R.string.pref_show_on_lock_screen)); - // TODO: check whether it's needed #2049 - if (pref == null) - return; + final Preference pref = getPreference(getString(R.string.pref_show_on_lock_screen)); final boolean isShowOnLockScreenEnabled = Config.isShowOnLockScreenEnabled(); ((TwoStatePreference) pref).setChecked(isShowOnLockScreenEnabled); @@ -779,10 +747,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void removePreference(@NonNull String categoryKey, @NonNull Preference preference) { - PreferenceCategory category = findPreference(categoryKey); - // TODO: check whether it's needed #2049 - if (category == null) - return; + final PreferenceCategory category = getPreference(categoryKey); category.removePreference(preference); } diff --git a/data/strings/strings.txt b/data/strings/strings.txt index b6d2e943ea..30c9c603a7 100644 --- a/data/strings/strings.txt +++ b/data/strings/strings.txt @@ -4774,6 +4774,48 @@ zh-Hans = 3D 建筑 zh-Hant = 3D 建築 + [pref_map_3d_buildings_disabled_summary] + comment = A message in Settings/Preferences explaining why is it not possible to enable 3D buildings when max power saving mode is enabled + tags = android,ios + en = 3D buildings are turned off in power saving mode + ar = يتم إيقاف تشغيل المباني ثلاثية الأبعاد في وضع توفير الطاقة + be = У рэжыме энергазберажэння 3D-будынкі выключаны + bg = 3D сградите са изключени в режим на пестене на енергия + ca = Els edificis en 3D es desactiven en mode d'estalvi d'energia + cs = 3D budovy jsou vypnuty v úsporném režimu + da = 3D-bygninger er slukket i strømbesparende tilstand + de = 3D-Gebäude werden im Energiesparmodus ausgeschaltet + el = Τα τρισδιάστατα κτίρια απενεργοποιούνται σε λειτουργία εξοικονόμησης ενέργειας + es = Los edificios 3D se apagan en el modo de ahorro de energía + et = 3D-hooned lülitatakse energiasäästurežiimis välja + eu = 3D eraikinak itzalita daude energia aurrezteko moduan + fa = ساختمان های سه بعدی در حالت صرفه جویی در مصرف برق خاموش می شوند + fi = 3D-rakennukset sammutetaan virransäästötilassa + fr = Les bâtiments 3D sont désactivés en mode d'économie d'énergie + he = מבנים תלת מימדיים כבויים במצב חיסכון בחשמל + hu = A 3D épületek energiatakarékos módban ki vannak kapcsolva + id = Bangunan 3D dimatikan dalam mode hemat daya + it = Gli edifici 3D sono disattivati in modalità di risparmio energetico + ja = 省電力モードで建物の 3D 表示がオフになっている + ko = 3D 빌딩은 절전 모드에서 꺼집니다. + mr = 3D इमारती वीज बचत मोडमध्ये बंद केल्या आहेत + nb = 3D-bygninger er slått av i strømsparingsmodus + nl = 3D-gebouwen worden uitgeschakeld in de energiebesparende modus + pl = Budynki 3D są wyłączone w trybie oszczędzania energii + pt = Os edifícios 3D são desativados no modo de poupança de energia + pt-BR = Os edifícios 3D são desativados no modo de economia de energia + ro = Clădirile 3D sunt oprite în modul de economisire a energiei + ru = 3D-здания отключаются в режиме энергосбережения + sk = 3D budovy sú vypnuté v režime úspory energie + sv = 3D-byggnader är avstängda i energisparläge + sw = Majengo ya 3D yamezimwa katika hali ya kuokoa nishati + th = สิ่งปลูกสร้าง 3 มิติจะปิดในโหมดประหยัดพลังงาน + tr = 3D binalar güç tasarrufu modunda kapatılır + uk = 3D будівлі вимкнені в режимі енергозбереження + vi = Tòa nhà 3D bị tắt ở chế độ tiết kiệm năng lượng + zh-Hans = 3D 建筑在省电模式下关闭 + zh-Hant = 3D 建築在省電模式下關閉 + [pref_tts_enable_title] comment = Settings «Route» category: «Tts enabled» title tags = android,ios diff --git a/iphone/Maps/UI/Settings/MWMSettingsViewController.mm b/iphone/Maps/UI/Settings/MWMSettingsViewController.mm index e933c0f04e..9015d6458d 100644 --- a/iphone/Maps/UI/Settings/MWMSettingsViewController.mm +++ b/iphone/Maps/UI/Settings/MWMSettingsViewController.mm @@ -72,7 +72,21 @@ using namespace power_management; bool on = true, _ = true; GetFramework().Load3dMode(_, on); - [self.is3dCell configWithDelegate:self title:L(@"pref_map_3d_buildings_title") isOn:on]; + if (GetFramework().GetPowerManager().GetScheme() == Scheme::EconomyMaximum) + { + self.is3dCell.isEnabled = false; + [self.is3dCell configWithDelegate:self title:L(@"pref_map_3d_buildings_title") isOn:false]; + UITapGestureRecognizer* tapRecogniser = [[UITapGestureRecognizer alloc] initWithTarget:self + action:@selector(show3dBuildingsAlert:)]; + + self.is3dCell.gestureRecognizers = @[tapRecogniser]; + } + else + { + self.is3dCell.isEnabled = true; + [self.is3dCell configWithDelegate:self title:L(@"pref_map_3d_buildings_title") isOn:on]; + self.is3dCell.gestureRecognizers = nil; + } [self.autoDownloadCell configWithDelegate:self title:L(@"autodownload") @@ -150,6 +164,20 @@ using namespace power_management; isOn:[MWMSettings compassCalibrationEnabled]]; } +- (void)show3dBuildingsAlert:(UITapGestureRecognizer *)recognizer { + UIAlertController *alert = + [UIAlertController alertControllerWithTitle:L(@"pref_map_3d_buildings_title") + message:L(@"pref_map_3d_buildings_disabled_summary") + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *okButton = [UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:nil]; + [alert addAction:okButton]; + + [self presentViewController:alert animated:YES completion:nil]; +} + - (void)configNavigationSection { NSString *nightMode = nil; switch ([MWMSettings theme]) {