From 897033dea0c6867dd80282b762b4b085b2b67734 Mon Sep 17 00:00:00 2001 From: WangDaYeeeeee Date: Tue, 12 May 2020 11:38:01 +0800 Subject: [PATCH] update --- app/build.gradle | 5 +- app/src/main/AndroidManifest.xml | 8 +- .../basic/ForegroundUpdateService.java | 30 +- .../background/service/TileService.java | 1 + .../option/appearance/DailyTrendDisplay.java | 32 ++ .../model/option/appearance/Language.java | 3 +- .../model/option/unit/AirQualityUnit.java | 12 +- .../model/option/unit/CloudCoverUnit.java | 2 +- .../basic/model/option/unit/DurationUnit.java | 12 +- .../basic/model/option/unit/PollenUnit.java | 10 +- .../model/option/unit/ProbabilityUnit.java | 14 +- .../option/unit/RelativeHumidityUnit.java | 2 +- .../model/option/unit/TemperatureUnit.java | 65 +-- .../basic/model/option/unit/UnitUtils.java | 7 + .../model/option/utils/OptionMapper.java | 66 +++ .../basic/model/weather/Hourly.java | 17 +- .../basic/model/weather/Temperature.java | 39 +- .../basic/model/weather/UV.java | 4 +- .../daily/adapter/DailyWeatherAdapter.java | 30 +- .../daily/adapter/holder/OverviewHolder.java | 2 +- .../daily/adapter/holder/PollenHolder.java | 74 ++-- .../daily/adapter/holder/WindHolder.java | 8 +- .../geometricweather/main/MainActivity.java | 151 +++---- .../main/adapter/DetailsAdapter.java | 14 +- .../main/holder/AirQualityViewHolder.java | 9 +- .../adapter/main/holder/DailyViewHolder.java | 53 ++- .../adapter/main/holder/HeaderViewHolder.java | 9 +- .../adapter/main/holder/HourlyViewHolder.java | 8 +- .../main/adapter/trend/DailyTrendAdapter.java | 13 +- .../adapter/trend/HourlyTrendAdapter.java | 8 +- .../trend/daily/DailyAirQualityAdapter.java | 4 +- .../trend/daily/DailyTemperatureAdapter.java | 15 +- .../adapter/trend/daily/DailyUVAdapter.java | 4 +- .../hourly/HourlyTemperatureAdapter.java | 15 +- .../main/dialog/HourlyWeatherDialog.java | 8 +- .../remoteviews/WidgetUtils.java | 8 +- .../config/AbstractWidgetConfigActivity.java | 171 +++++++- .../AbstractRemoteViewsPresenter.java | 113 ++++-- .../presenter/ClockDayDetailsWidgetIMP.java | 5 +- .../ClockDayHorizontalWidgetIMP.java | 2 +- .../presenter/ClockDayVerticalWidgetIMP.java | 19 +- .../presenter/ClockDayWeekWidgetIMP.java | 15 +- .../presenter/DailyTrendWidgetIMP.java | 4 +- .../presenter/DayWeekWidgetIMP.java | 30 +- .../remoteviews/presenter/DayWidgetIMP.java | 23 +- .../presenter/HourlyTrendWidgetIMP.java | 2 +- .../presenter/MultiCityWidgetIMP.java | 3 + .../remoteviews/presenter/TextWidgetIMP.java | 2 +- .../remoteviews/presenter/WeekWidgetIMP.java | 13 +- .../notification/ForecastNotificationIMP.java | 8 +- .../NativeNormalNotificationIMP.java | 2 +- .../notification/NormalNotificationIMP.java | 6 + .../remoteviews/trend/TrendLinearLayout.java | 4 +- .../settings/SettingsOptionManager.java | 46 +++ .../DailyTrendDisplayManageActivity.java | 229 +++++++++++ .../adapter/DailyTrendDisplayAdapter.java | 114 ++++++ .../fragment/AppearanceSettingsFragment.java | 42 ++ .../settings/fragment/SettingsFragment.java | 111 ++++++ .../fragment/UnitSettingsFragment.java | 8 +- .../settings/model/AboutAppTranslator.java | 10 + ...SearcActivity.java => SearchActivity.java} | 104 ++--- .../ui/adapter/DailyPollenAdapter.java | 83 ++-- .../ui/adapter/location/LocationAdapter.java | 7 +- .../ui/adapter/location/LocationHolder.java | 112 ++---- .../ui/adapter/location/LocationModel.java | 2 +- .../ui/widget/NumberAnimTextView.java | 9 +- .../ui/widget/trend/TrendRecyclerView.java | 10 +- .../ui/widget/weatherView/WeatherView.java | 11 + .../CircularSkyWeatherView.java | 75 ++-- .../MaterialWeatherView.java | 21 +- .../geometricweather/utils/DisplayUtils.java | 4 + .../utils/helpter/IntentHelper.java | 17 +- .../res/drawable-ldrtl/ic_toolbar_back.xml | 8 + app/src/main/res/drawable/flag_ja.png | Bin 0 -> 2579 bytes .../activity_daily_trend_display_manage.xml | 61 +++ app/src/main/res/layout/activity_main.xml | 103 +++-- .../main/res/layout/activity_main_tablet.xml | 84 ---- app/src/main/res/layout/activity_search.xml | 24 +- .../res/layout/activity_widget_config.xml | 2 +- .../layout/container_circular_sky_view.xml | 12 +- .../main/res/layout/container_main_header.xml | 1 + app/src/main/res/layout/item_location.xml | 24 +- app/src/main/res/layout/item_pollen_daily.xml | 36 +- .../res/layout/item_weather_daily_pollen.xml | 32 +- .../res/transition/search_activity_enter.xml | 2 +- .../res/transition/search_activity_return.xml | 2 +- .../search_activity_shared_enter.xml | 4 +- .../search_activity_shared_return.xml | 4 +- app/src/main/res/values-ar/arrays.xml | 15 + app/src/main/res/values-ar/strings.xml | 58 --- app/src/main/res/values-cs/arrays.xml | 9 +- app/src/main/res/values-cs/strings.xml | 110 +++-- app/src/main/res/values-de/arrays.xml | 41 +- app/src/main/res/values-de/strings.xml | 7 +- app/src/main/res/values-el/arrays.xml | 7 - app/src/main/res/values-el/strings.xml | 98 ++--- app/src/main/res/values-hu/strings.xml | 90 ++--- app/src/main/res/values-ja/arrays.xml | 142 +++++++ app/src/main/res/values-ja/strings.xml | 376 ++++++++++++++++++ app/src/main/res/values-ko/arrays.xml | 7 - app/src/main/res/values-ko/strings.xml | 98 ++--- app/src/main/res/values-pl/arrays.xml | 9 +- app/src/main/res/values-pl/strings.xml | 98 ++--- app/src/main/res/values-ru/arrays.xml | 7 - app/src/main/res/values-ru/strings.xml | 97 ++--- app/src/main/res/values-zh-rCN/strings.xml | 104 +++-- app/src/main/res/values-zh-rHK/strings.xml | 196 +++++---- app/src/main/res/values-zh-rTW/strings.xml | 202 +++++----- app/src/main/res/values/arrays.xml | 14 +- app/src/main/res/values/strings.xml | 125 +++--- app/src/main/res/values/styles.xml | 13 +- app/src/main/res/xml/perference.xml | 55 +++ .../main/res/xml/perference_appearance.xml | 16 + build.gradle | 2 +- 114 files changed, 2990 insertions(+), 1604 deletions(-) create mode 100644 app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/DailyTrendDisplay.java create mode 100644 app/src/main/java/wangdaye/com/geometricweather/settings/activity/DailyTrendDisplayManageActivity.java create mode 100644 app/src/main/java/wangdaye/com/geometricweather/settings/adapter/DailyTrendDisplayAdapter.java rename app/src/main/java/wangdaye/com/geometricweather/ui/activity/{SearcActivity.java => SearchActivity.java} (71%) create mode 100644 app/src/main/res/drawable-ldrtl/ic_toolbar_back.xml create mode 100644 app/src/main/res/drawable/flag_ja.png create mode 100644 app/src/main/res/layout/activity_daily_trend_display_manage.xml delete mode 100644 app/src/main/res/layout/activity_main_tablet.xml create mode 100644 app/src/main/res/values-ja/arrays.xml create mode 100644 app/src/main/res/values-ja/strings.xml diff --git a/app/build.gradle b/app/build.gradle index df0d15146..98a4ab448 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -52,6 +52,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + viewBinding { + enabled = true + } } allprojects { @@ -88,7 +91,7 @@ dependencies { implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' // android architect. - implementation "androidx.work:work-runtime:2.3.2" + implementation "androidx.work:work-runtime:2.3.3" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0" implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e6da55d9f..251146a7c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -110,7 +110,7 @@ android:label="@string/action_manage" android:theme="@style/GeometricWeatherTheme" /> - @@ -126,6 +126,12 @@ android:theme="@style/GeometricWeatherTheme" android:screenOrientation="user" /> + + = Build.VERSION_CODES.O) { - stopForeground(true); - NotificationManagerCompat.from(this).cancel(getForegroundNotificationId()); - } + // version O. + stopForeground(true); + NotificationManagerCompat.from(this).cancel(getForegroundNotificationId()); } @Override public void stopService(boolean updateFailed) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - stopForeground(true); - NotificationManagerCompat.from(this).cancel(getForegroundNotificationId()); - } + stopForeground(true); + NotificationManagerCompat.from(this).cancel(getForegroundNotificationId()); super.stopService(updateFailed); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/background/service/TileService.java b/app/src/main/java/wangdaye/com/geometricweather/background/service/TileService.java index cba301a36..a62f2a1f6 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/background/service/TileService.java +++ b/app/src/main/java/wangdaye/com/geometricweather/background/service/TileService.java @@ -76,6 +76,7 @@ private static void refreshTile(Context context, Tile tile) { ); tile.setLabel( weather.getCurrent().getTemperature().getTemperature( + context, SettingsOptionManager.getInstance(context).getTemperatureUnit()) ); tile.setState(Tile.STATE_INACTIVE); diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/DailyTrendDisplay.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/DailyTrendDisplay.java new file mode 100644 index 000000000..3b3f6c6f4 --- /dev/null +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/DailyTrendDisplay.java @@ -0,0 +1,32 @@ +package wangdaye.com.geometricweather.basic.model.option.appearance; + +import android.content.Context; + +import androidx.annotation.StringRes; + +import wangdaye.com.geometricweather.R; + +public enum DailyTrendDisplay { + + TAG_TEMPERATURE("temperature", R.string.temperature), + TAG_AIR_QUALITY("air_quality", R.string.air_quality), + TAG_WIND("wind", R.string.wind), + TAG_UV_INDEX("uv_index", R.string.uv_index), + TAG_PRECIPITATION("precipitation", R.string.precipitation); + + private String value; + private @StringRes int nameId; + + DailyTrendDisplay(String value, int nameId) { + this.value = value; + this.nameId = nameId; + } + + public String getTagValue() { + return value; + } + + public String getTagName(Context context) { + return context.getString(nameId); + } +} diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/Language.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/Language.java index 42d2a816a..602a26165 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/Language.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/appearance/Language.java @@ -41,7 +41,8 @@ public enum Language { CZECH("czech", new Locale("cs")), POLISH("polish", new Locale("pl")), KOREAN("korean", new Locale("ko")), - GREEK("greek", new Locale("el")); + GREEK("greek", new Locale("el")), + JAPANESE("japanese", new Locale("ja")); private String languageId; private Locale locale; diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/AirQualityUnit.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/AirQualityUnit.java index 13c8a70d2..fc1cbcd72 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/AirQualityUnit.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/AirQualityUnit.java @@ -1,8 +1,10 @@ package wangdaye.com.geometricweather.basic.model.option.unit; import android.content.Context; +import android.text.BidiFormatter; import wangdaye.com.geometricweather.R; +import wangdaye.com.geometricweather.utils.DisplayUtils; public enum AirQualityUnit { @@ -27,7 +29,13 @@ public float getDensity(float mugpcum) { } public String getDensityText(Context context, float mugpcum) { - return UnitUtils.formatFloat(mugpcum * unitFactor, 1) - + context.getResources().getStringArray(R.array.air_quality_units)[unitArrayIndex]; + if (DisplayUtils.isRtl(context)) { + return BidiFormatter.getInstance().unicodeWrap( + UnitUtils.formatFloat(mugpcum * unitFactor, 1) + ) + context.getResources().getStringArray(R.array.air_quality_units)[unitArrayIndex]; + } else { + return UnitUtils.formatFloat(mugpcum * unitFactor, 1) + + context.getResources().getStringArray(R.array.air_quality_units)[unitArrayIndex]; + } } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/CloudCoverUnit.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/CloudCoverUnit.java index b9c6a2765..0413b0c12 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/CloudCoverUnit.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/CloudCoverUnit.java @@ -11,6 +11,6 @@ public enum CloudCoverUnit { } public String getCloudCoverText(int percent) { - return percent + unitAbbreviation; + return UnitUtils.formatInt(percent) + unitAbbreviation; } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/DurationUnit.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/DurationUnit.java index fa8eed1ea..4257752ac 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/DurationUnit.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/DurationUnit.java @@ -1,8 +1,10 @@ package wangdaye.com.geometricweather.basic.model.option.unit; import android.content.Context; +import android.text.BidiFormatter; import wangdaye.com.geometricweather.R; +import wangdaye.com.geometricweather.utils.DisplayUtils; public enum DurationUnit { @@ -23,7 +25,13 @@ public String getUnitId() { } public String getDurationText(Context context, float h) { - return UnitUtils.formatFloat(h * unitFactor, 1) - + context.getResources().getStringArray(R.array.duration_units)[unitArrayIndex]; + if (DisplayUtils.isRtl(context)) { + return BidiFormatter.getInstance().unicodeWrap( + UnitUtils.formatFloat(h * unitFactor, 1) + ) + context.getResources().getStringArray(R.array.duration_units)[unitArrayIndex]; + } else { + return UnitUtils.formatFloat(h * unitFactor, 1) + + context.getResources().getStringArray(R.array.duration_units)[unitArrayIndex]; + } } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/PollenUnit.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/PollenUnit.java index 9f82b0f5c..1ac3eb51e 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/PollenUnit.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/PollenUnit.java @@ -1,10 +1,12 @@ package wangdaye.com.geometricweather.basic.model.option.unit; import android.content.Context; +import android.text.BidiFormatter; import androidx.annotation.Nullable; import wangdaye.com.geometricweather.R; +import wangdaye.com.geometricweather.utils.DisplayUtils; public enum PollenUnit { @@ -23,7 +25,13 @@ public String getUnitId() { } public String getPollenText(Context context, int value) { - return value + context.getResources().getStringArray(R.array.pollen_units)[unitArrayIndex]; + if (DisplayUtils.isRtl(context)) { + return BidiFormatter.getInstance().unicodeWrap(UnitUtils.formatInt(value)) + + context.getResources().getStringArray(R.array.pollen_units)[unitArrayIndex]; + } else { + return UnitUtils.formatInt(value) + + context.getResources().getStringArray(R.array.pollen_units)[unitArrayIndex]; + } } public String getPollenText(Context context, @Nullable Integer value) { diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/ProbabilityUnit.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/ProbabilityUnit.java index 0d3b9a81d..8067a16b8 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/ProbabilityUnit.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/ProbabilityUnit.java @@ -1,5 +1,10 @@ package wangdaye.com.geometricweather.basic.model.option.unit; +import android.content.Context; +import android.text.BidiFormatter; + +import wangdaye.com.geometricweather.utils.DisplayUtils; + public enum ProbabilityUnit { PERCENT("%"); @@ -10,7 +15,12 @@ public enum ProbabilityUnit { unitAbbreviation = abbreviation; } - public String getProbabilityText(float percent) { - return (int) percent + unitAbbreviation; + public String getProbabilityText(Context context, float percent) { + if (DisplayUtils.isRtl(context)) { + return BidiFormatter.getInstance().unicodeWrap(UnitUtils.formatInt((int) percent)) + + unitAbbreviation; + } else { + return UnitUtils.formatInt((int) percent) + unitAbbreviation; + } } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/RelativeHumidityUnit.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/RelativeHumidityUnit.java index 134d9868d..5ba0faa09 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/RelativeHumidityUnit.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/RelativeHumidityUnit.java @@ -11,6 +11,6 @@ public enum RelativeHumidityUnit { } public String getRelativeHumidityText(float percent) { - return (int) percent + unitAbbreviation; + return UnitUtils.formatInt((int) percent) + unitAbbreviation; } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/TemperatureUnit.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/TemperatureUnit.java index de5875908..4ed2b79bd 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/TemperatureUnit.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/TemperatureUnit.java @@ -1,27 +1,28 @@ package wangdaye.com.geometricweather.basic.model.option.unit; +import android.content.Context; +import android.text.BidiFormatter; + +import wangdaye.com.geometricweather.R; +import wangdaye.com.geometricweather.utils.DisplayUtils; + public enum TemperatureUnit { - C("c", "℃", "°C", "°", c -> c), - F("f", "℉", "°F", "°", c -> (int) (32 + c * 1.8f)), - K("k", "K", "K", "K", c -> (int) (273.15 + c)); + C("c", 0, c -> c), + F("f", 1, c -> (int) (32 + c * 1.8f)), + K("k", 2, c -> (int) (273.15 + c)); private String unitId; - private String unitAbbreviation; - private String unitLongAbbreviation; - private String unitShortAbbreviation; + private int unitArrayIndex; private Calculator unitCalculator; public interface Calculator { int getTemperature(int c); } - TemperatureUnit(String id, String abbreviation, String longAbbreviation, String shortAbbreviation, - Calculator calculator) { + TemperatureUnit(String id, int index, Calculator calculator) { unitId = id; - unitAbbreviation = abbreviation; - unitLongAbbreviation = longAbbreviation; - unitShortAbbreviation = shortAbbreviation; + unitArrayIndex = index; unitCalculator = calculator; } @@ -33,27 +34,45 @@ public int getTemperature(int c) { return unitCalculator.getTemperature(c); } - public String getTemperatureText(int c) { - return unitCalculator.getTemperature(c) + unitAbbreviation; + public String getTemperatureText(Context context, int c) { + if (DisplayUtils.isRtl(context)) { + return BidiFormatter.getInstance().unicodeWrap( + UnitUtils.formatInt(getTemperature(c)) + ) + getAbbreviation(context); + } else { + return getTemperature(c) + getAbbreviation(context); + } } - public String getLongTemperatureText(int c) { - return unitCalculator.getTemperature(c) + unitLongAbbreviation; + public String getLongTemperatureText(Context context, int c) { + if (DisplayUtils.isRtl(context)) { + return BidiFormatter.getInstance().unicodeWrap( + UnitUtils.formatInt(getTemperature(c)) + ) + getLongAbbreviation(context); + } else { + return getTemperature(c) + getLongAbbreviation(context); + } } - public String getShortTemperatureText(int c) { - return unitCalculator.getTemperature(c) + unitShortAbbreviation; + public String getShortTemperatureText(Context context, int c) { + if (DisplayUtils.isRtl(context)) { + return BidiFormatter.getInstance().unicodeWrap( + UnitUtils.formatInt(getTemperature(c)) + ) + getShortAbbreviation(context); + } else { + return getTemperature(c) + getShortAbbreviation(context); + } } - public String getAbbreviation() { - return unitAbbreviation; + public String getAbbreviation(Context context) { + return context.getResources().getStringArray(R.array.temperature_units)[unitArrayIndex]; } - public String getLongAbbreviation() { - return unitLongAbbreviation; + public String getLongAbbreviation(Context context) { + return context.getResources().getStringArray(R.array.temperature_units_long)[unitArrayIndex]; } - public String getUnitShortAbbreviation() { - return unitShortAbbreviation; + public String getShortAbbreviation(Context context) { + return context.getResources().getStringArray(R.array.temperature_units_short)[unitArrayIndex]; } } \ No newline at end of file diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/UnitUtils.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/UnitUtils.java index a3cf8bbe1..1f41ebc83 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/UnitUtils.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/unit/UnitUtils.java @@ -1,5 +1,7 @@ package wangdaye.com.geometricweather.basic.model.option.unit; +import android.annotation.SuppressLint; + class UnitUtils { static String formatFloat(float value) { @@ -12,4 +14,9 @@ static String formatFloat(float value, int decimalNumber) { value ); } + + @SuppressLint("DefaultLocale") + static String formatInt(int value) { + return String.format("%d", value); + } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/utils/OptionMapper.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/utils/OptionMapper.java index 74f6d2250..a5d207c8b 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/utils/OptionMapper.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/option/utils/OptionMapper.java @@ -16,6 +16,7 @@ import wangdaye.com.geometricweather.basic.model.option.UpdateInterval; import wangdaye.com.geometricweather.basic.model.option.WidgetWeekIconMode; import wangdaye.com.geometricweather.basic.model.option.appearance.CardDisplay; +import wangdaye.com.geometricweather.basic.model.option.appearance.DailyTrendDisplay; import wangdaye.com.geometricweather.basic.model.option.appearance.Language; import wangdaye.com.geometricweather.basic.model.option.appearance.UIStyle; import wangdaye.com.geometricweather.basic.model.option.provider.LocationProvider; @@ -293,6 +294,68 @@ public static String getCardDisplaySummary(Context context, @NonNull List getDailyTrendDisplayList(String value) { + if (TextUtils.isEmpty(value)) { + return new ArrayList<>(); + } + try { + String[] cards = value.split("&"); + + List list = new ArrayList<>(); + for (String card : cards) { + switch (card) { + case "temperature": + list.add(DailyTrendDisplay.TAG_TEMPERATURE); + break; + + case "air_quality": + list.add(DailyTrendDisplay.TAG_AIR_QUALITY); + break; + + case "wind": + list.add(DailyTrendDisplay.TAG_WIND); + break; + + case "uv_index": + list.add(DailyTrendDisplay.TAG_UV_INDEX); + break; + + case "precipitation": + list.add(DailyTrendDisplay.TAG_PRECIPITATION); + break; + } + } + return list; + } catch (Exception e) { + return new ArrayList<>(); + } + } + + @NonNull + public static String getDailyTrendDisplayValue(@NonNull List list) { + StringBuilder builder = new StringBuilder(); + for (DailyTrendDisplay v : list) { + builder.append("&").append(v.getTagValue()); + } + if (builder.length() > 0 && builder.charAt(0) == '&') { + builder.deleteCharAt(0); + } + return builder.toString(); + } + + @NonNull + public static String getDailyTrendDisplaySummary(Context context, @NonNull List list) { + StringBuilder builder = new StringBuilder(); + for (DailyTrendDisplay v : list) { + builder.append(",").append(v.getTagName(context)); + } + if (builder.length() > 0 && builder.charAt(0) == ',') { + builder.deleteCharAt(0); + } + return builder.toString().replace(",", ", "); + } public static Language getLanguage(String value) { switch (value) { @@ -362,6 +425,9 @@ public static Language getLanguage(String value) { case "greek": return Language.GREEK; + case "japanese": + return Language.JAPANESE; + default: return Language.FOLLOW_SYSTEM; } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Hourly.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Hourly.java index 340c5142e..59db28632 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Hourly.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Hourly.java @@ -1,12 +1,15 @@ package wangdaye.com.geometricweather.basic.model.weather; +import android.annotation.SuppressLint; import android.content.Context; +import android.text.BidiFormatter; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import wangdaye.com.geometricweather.R; +import wangdaye.com.geometricweather.utils.DisplayUtils; import wangdaye.com.geometricweather.utils.manager.TimeManager; /** @@ -73,18 +76,26 @@ public PrecipitationProbability getPrecipitationProbability() { return precipitationProbability; } + @SuppressLint("DefaultLocale") public String getHour(Context c) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); + int hour; if (TimeManager.is12Hour(c)) { - int hour = calendar.get(Calendar.HOUR); + hour = calendar.get(Calendar.HOUR); if (hour == 0) { hour = 12; } - return hour + c.getString(R.string.of_clock); } else { - return calendar.get(Calendar.HOUR_OF_DAY) + c.getString(R.string.of_clock); + hour = calendar.get(Calendar.HOUR_OF_DAY); + } + + if (DisplayUtils.isRtl(c)) { + return BidiFormatter.getInstance().unicodeWrap(String.format("%d", hour)) + + c.getString(R.string.of_clock); + } else { + return hour + c.getString(R.string.of_clock); } } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Temperature.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Temperature.java index 6e57b8204..912be6ee0 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Temperature.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/Temperature.java @@ -1,10 +1,13 @@ package wangdaye.com.geometricweather.basic.model.weather; +import android.content.Context; + import androidx.annotation.Nullable; import java.io.Serializable; import wangdaye.com.geometricweather.basic.model.option.unit.TemperatureUnit; +import wangdaye.com.geometricweather.settings.SettingsOptionManager; /** * Temperature. @@ -71,48 +74,54 @@ public Integer getDegreeDayTemperature() { } @Nullable - public String getTemperature(TemperatureUnit unit) { - return getTemperature(temperature, unit); + public String getTemperature(Context context, TemperatureUnit unit) { + return getTemperature(context, temperature, unit); } @Nullable - public String getShortTemperature(TemperatureUnit unit) { - return getShortTemperature(temperature, unit); + public String getShortTemperature(Context context, TemperatureUnit unit) { + return getShortTemperature(context, temperature, unit); } @Nullable - public String getRealFeelTemperature(TemperatureUnit unit) { - return getTemperature(realFeelTemperature, unit); + public String getRealFeelTemperature(Context context, TemperatureUnit unit) { + return getTemperature(context, realFeelTemperature, unit); } @Nullable - public String getShortRealFeeTemperature(TemperatureUnit unit) { - return getShortTemperature(realFeelTemperature, unit); + public String getShortRealFeeTemperature(Context context, TemperatureUnit unit) { + return getShortTemperature(context, realFeelTemperature, unit); } @Nullable - public static String getTemperature(@Nullable Integer temperature, TemperatureUnit unit) { + public static String getTemperature(Context context, @Nullable Integer temperature, TemperatureUnit unit) { if (temperature == null) { return null; } - return unit.getTemperatureText(temperature); + return unit.getTemperatureText(context, temperature); } @Nullable - public static String getShortTemperature(@Nullable Integer temperature, TemperatureUnit unit) { + public static String getShortTemperature(Context context, + @Nullable Integer temperature, TemperatureUnit unit) { if (temperature == null) { return null; } - return unit.getShortTemperatureText(temperature); + return unit.getShortTemperatureText(context, temperature); } @Nullable - public static String getTrendTemperature(@Nullable Integer from, @Nullable Integer to, + public static String getTrendTemperature(Context context, + @Nullable Integer night, @Nullable Integer day, TemperatureUnit unit) { - if (from == null || to == null) { + if (night == null || day == null) { return null; } - return getShortTemperature(from, unit) + "/" + getShortTemperature(to, unit); + if (SettingsOptionManager.getInstance(context).isExchangeDayNightTempEnabled()) { + return getShortTemperature(context, day, unit) + "/" + getShortTemperature(context, night, unit); + } else { + return getShortTemperature(context, night, unit) + "/" + getShortTemperature(context, day, unit); + } } public boolean isValid() { diff --git a/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/UV.java b/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/UV.java index 05f4bf36c..4d860f3af 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/UV.java +++ b/app/src/main/java/wangdaye/com/geometricweather/basic/model/weather/UV.java @@ -1,5 +1,6 @@ package wangdaye.com.geometricweather.basic.model.weather; +import android.annotation.SuppressLint; import android.content.Context; import android.text.TextUtils; @@ -54,10 +55,11 @@ public boolean isValidIndex() { return index != null; } + @SuppressLint("DefaultLocale") public String getUVDescription() { StringBuilder builder = new StringBuilder(); if (index != null) { - builder.append(index); + builder.append(String.format("%d", index)); } if (level != null) { builder.append( diff --git a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/DailyWeatherAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/DailyWeatherAdapter.java index caea452f2..804870ea3 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/DailyWeatherAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/DailyWeatherAdapter.java @@ -1,6 +1,7 @@ package wangdaye.com.geometricweather.daily.adapter; import android.content.Context; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,6 +45,7 @@ import wangdaye.com.geometricweather.daily.adapter.model.Overview; import wangdaye.com.geometricweather.daily.adapter.model.Title; import wangdaye.com.geometricweather.daily.adapter.model.Value; +import wangdaye.com.geometricweather.databinding.ItemWeatherDailyPollenBinding; import wangdaye.com.geometricweather.settings.SettingsOptionManager; public class DailyWeatherAdapter extends RecyclerView.Adapter { @@ -134,7 +136,11 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { } else if (DailyAstro.isCode(viewType)) { return new AstroHolder(parent); } else if (DailyPollen.isCode(viewType)) { - return new PollenHolder(parent); + return new PollenHolder( + ItemWeatherDailyPollenBinding.inflate( + LayoutInflater.from(parent.getContext()) + ) + ); } else if (DailyUV.isCode(viewType)) { return new UVHolder(parent); } else if (DailyWind.isCode(viewType)) { @@ -177,37 +183,37 @@ private List getHalfDayOptionalModelList(Context context, HalfDay hal if (temperature.getRealFeelTemperature() != null) { list.add(new Value( context.getString(R.string.real_feel_temperature), - temperatureUnit.getTemperatureText(temperature.getRealFeelTemperature()) + temperatureUnit.getTemperatureText(context, temperature.getRealFeelTemperature()) )); } if (temperature.getRealFeelShaderTemperature() != null) { list.add(new Value( context.getString(R.string.real_feel_shader_temperature), - temperatureUnit.getTemperatureText(temperature.getRealFeelShaderTemperature()) + temperatureUnit.getTemperatureText(context, temperature.getRealFeelShaderTemperature()) )); } if (temperature.getApparentTemperature() != null) { list.add(new Value( context.getString(R.string.apparent_temperature), - temperatureUnit.getTemperatureText(temperature.getApparentTemperature()) + temperatureUnit.getTemperatureText(context, temperature.getApparentTemperature()) )); } if (temperature.getWindChillTemperature() != null) { list.add(new Value( context.getString(R.string.wind_chill_temperature), - temperatureUnit.getTemperatureText(temperature.getWindChillTemperature()) + temperatureUnit.getTemperatureText(context, temperature.getWindChillTemperature()) )); } if (temperature.getWetBulbTemperature() != null) { list.add(new Value( context.getString(R.string.wet_bulb_temperature), - temperatureUnit.getTemperatureText(temperature.getWetBulbTemperature()) + temperatureUnit.getTemperatureText(context, temperature.getWetBulbTemperature()) )); } if (temperature.getDegreeDayTemperature() != null) { list.add(new Value( context.getString(R.string.degree_day_temperature), - temperatureUnit.getTemperatureText(temperature.getDegreeDayTemperature()) + temperatureUnit.getTemperatureText(context, temperature.getDegreeDayTemperature()) )); } list.add(new Margin()); @@ -255,30 +261,30 @@ private List getHalfDayOptionalModelList(Context context, HalfDay hal list.add(new Title(R.drawable.ic_water_percent, context.getString(R.string.precipitation_probability))); list.add(new Value( context.getString(R.string.total), - ProbabilityUnit.PERCENT.getProbabilityText(probability.getTotal()) + ProbabilityUnit.PERCENT.getProbabilityText(context, probability.getTotal()) )); if (probability.getRain() != null && probability.getRain() > 0) { list.add(new Value( context.getString(R.string.rain), - ProbabilityUnit.PERCENT.getProbabilityText(probability.getRain()) + ProbabilityUnit.PERCENT.getProbabilityText(context, probability.getRain()) )); } if (probability.getSnow() != null && probability.getSnow() > 0) { list.add(new Value( context.getString(R.string.snow), - ProbabilityUnit.PERCENT.getProbabilityText(probability.getSnow()) + ProbabilityUnit.PERCENT.getProbabilityText(context, probability.getSnow()) )); } if (probability.getIce() != null && probability.getIce() > 0) { list.add(new Value( context.getString(R.string.ice), - ProbabilityUnit.PERCENT.getProbabilityText(probability.getIce()) + ProbabilityUnit.PERCENT.getProbabilityText(context, probability.getIce()) )); } if (probability.getThunderstorm() != null && probability.getThunderstorm() > 0) { list.add(new Value( context.getString(R.string.thunderstorm), - ProbabilityUnit.PERCENT.getProbabilityText(probability.getThunderstorm()) + ProbabilityUnit.PERCENT.getProbabilityText(context, probability.getThunderstorm()) )); } list.add(new Margin()); diff --git a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/OverviewHolder.java b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/OverviewHolder.java index eafcc56da..fd2fee29f 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/OverviewHolder.java +++ b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/OverviewHolder.java @@ -43,6 +43,6 @@ public void onBindView(DailyWeatherAdapter.ViewModel model, int position) { provider.getWeatherAnimators(overview.getHalfDay().getWeatherCode(), overview.isDaytime()) ); title.setText(overview.getHalfDay().getWeatherText() - + " " + overview.getHalfDay().getTemperature().getTemperature(unit)); + + " " + overview.getHalfDay().getTemperature().getTemperature(title.getContext(), unit)); } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/PollenHolder.java b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/PollenHolder.java index aaa01a184..3d5b0ac51 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/PollenHolder.java +++ b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/PollenHolder.java @@ -3,85 +3,57 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; -import android.view.LayoutInflater; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.appcompat.widget.AppCompatImageView; import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.model.option.unit.PollenUnit; import wangdaye.com.geometricweather.basic.model.weather.Pollen; import wangdaye.com.geometricweather.daily.adapter.DailyWeatherAdapter; import wangdaye.com.geometricweather.daily.adapter.model.DailyPollen; +import wangdaye.com.geometricweather.databinding.ItemWeatherDailyPollenBinding; public class PollenHolder extends DailyWeatherAdapter.ViewHolder { - private AppCompatImageView grassIcon; - private TextView grassTitle; - private TextView grassValue; - - private AppCompatImageView ragweedIcon; - private TextView ragweedTitle; - private TextView ragweedValue; - - private AppCompatImageView treeIcon; - private TextView treeTitle; - private TextView treeValue; - - private AppCompatImageView moldIcon; - private TextView moldTitle; - private TextView moldValue; - + private ItemWeatherDailyPollenBinding binding; private PollenUnit unit; - public PollenHolder(ViewGroup parent) { - super(LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_weather_daily_pollen, parent, false)); - grassIcon = itemView.findViewById(R.id.item_weather_daily_pollen_grassIcon); - grassTitle = itemView.findViewById(R.id.item_weather_daily_pollen_grassTitle); - grassValue = itemView.findViewById(R.id.item_weather_daily_pollen_grassValue); - ragweedIcon = itemView.findViewById(R.id.item_weather_daily_pollen_ragweedIcon); - ragweedTitle = itemView.findViewById(R.id.item_weather_daily_pollen_ragweedTitle); - ragweedValue = itemView.findViewById(R.id.item_weather_daily_pollen_ragweedValue); - treeIcon = itemView.findViewById(R.id.item_weather_daily_pollen_treeIcon); - treeTitle = itemView.findViewById(R.id.item_weather_daily_pollen_treeTitle); - treeValue = itemView.findViewById(R.id.item_weather_daily_pollen_treeValue); - moldIcon = itemView.findViewById(R.id.item_weather_daily_pollen_moldIcon); - moldTitle = itemView.findViewById(R.id.item_weather_daily_pollen_moldTitle); - moldValue = itemView.findViewById(R.id.item_weather_daily_pollen_moldValue); - - unit = PollenUnit.PPCM; + public PollenHolder(ItemWeatherDailyPollenBinding binding) { + super(binding.getRoot()); + this.binding = binding; + this.unit = PollenUnit.PPCM; } - @SuppressLint("SetTextI18n") + @SuppressLint({"SetTextI18n", "RestrictedApi"}) @Override public void onBindView(DailyWeatherAdapter.ViewModel model, int position) { Context context = itemView.getContext(); Pollen pollen = ((DailyPollen) model).getPollen(); - grassIcon.setSupportImageTintList(ColorStateList.valueOf( + binding.grassIcon.setSupportImageTintList(ColorStateList.valueOf( Pollen.getPollenColor(itemView.getContext(), pollen.getGrassLevel()) )); - grassTitle.setText(context.getString(R.string.grass)); - grassValue.setText(unit.getPollenText(context, pollen.getGrassIndex()) + " - " + pollen.getGrassDescription()); + binding.grassTitle.setText(context.getString(R.string.grass)); + binding.grassValue.setText(unit.getPollenText(context, pollen.getGrassIndex()) + + " - " + pollen.getGrassDescription()); - ragweedIcon.setSupportImageTintList(ColorStateList.valueOf( + binding.ragweedIcon.setSupportImageTintList(ColorStateList.valueOf( Pollen.getPollenColor(itemView.getContext(), pollen.getRagweedLevel()) )); - ragweedTitle.setText(context.getString(R.string.ragweed)); - ragweedValue.setText(unit.getPollenText(context, pollen.getRagweedIndex()) + " - " + pollen.getRagweedDescription()); + binding.ragweedTitle.setText(context.getString(R.string.ragweed)); + binding.ragweedValue.setText(unit.getPollenText(context, pollen.getRagweedIndex()) + + " - " + pollen.getRagweedDescription()); - treeIcon.setSupportImageTintList(ColorStateList.valueOf( + binding.treeIcon.setSupportImageTintList(ColorStateList.valueOf( Pollen.getPollenColor(itemView.getContext(), pollen.getTreeLevel()) )); - treeTitle.setText(context.getString(R.string.tree)); - treeValue.setText(unit.getPollenText(context, pollen.getTreeIndex()) + " - " + pollen.getTreeDescription()); + binding.treeTitle.setText(context.getString(R.string.tree)); + binding.treeValue.setText(unit.getPollenText(context, pollen.getTreeIndex()) + + " - " + pollen.getTreeDescription()); - moldIcon.setSupportImageTintList(ColorStateList.valueOf( + binding.moldIcon.setSupportImageTintList(ColorStateList.valueOf( Pollen.getPollenColor(itemView.getContext(), pollen.getMoldLevel()) )); - moldTitle.setText(context.getString(R.string.mold)); - moldValue.setText(unit.getPollenText(context, pollen.getMoldIndex()) + " - " + pollen.getMoldDescription()); + binding.moldTitle.setText(context.getString(R.string.mold)); + binding.moldValue.setText(unit.getPollenText(context, pollen.getMoldIndex()) + + " - " + pollen.getMoldDescription()); } } \ No newline at end of file diff --git a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/WindHolder.java b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/WindHolder.java index 5fef5880e..11b58d1a7 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/WindHolder.java +++ b/app/src/main/java/wangdaye/com/geometricweather/daily/adapter/holder/WindHolder.java @@ -26,7 +26,7 @@ public class WindHolder extends DailyWeatherAdapter.ViewHolder { private LinearLayout speed; private TextView speedText; - private TextView gageText; + private TextView gaugeText; private SpeedUnit unit; @@ -38,12 +38,12 @@ public WindHolder(ViewGroup parent) { directionText = itemView.findViewById(R.id.item_weather_daily_wind_directionValue); speed = itemView.findViewById(R.id.item_weather_daily_wind_speed); speedText = itemView.findViewById(R.id.item_weather_daily_wind_speedValue); - gageText = itemView.findViewById(R.id.item_weather_daily_wind_levelValue); + gaugeText = itemView.findViewById(R.id.item_weather_daily_wind_levelValue); unit = SettingsOptionManager.getInstance(parent.getContext()).getSpeedUnit(); } - @SuppressLint("SetTextI18n") + @SuppressLint({"SetTextI18n", "RestrictedApi"}) @Override public void onBindView(DailyWeatherAdapter.ViewModel model, int position) { Wind wind = ((DailyWind) model).getWind(); @@ -65,6 +65,6 @@ public void onBindView(DailyWeatherAdapter.ViewModel model, int position) { speed.setVisibility(View.GONE); } - gageText.setText(wind.getLevel()); + gaugeText.setText(wind.getLevel()); } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/MainActivity.java b/app/src/main/java/wangdaye/com/geometricweather/main/MainActivity.java index 489c4e322..68189ef3f 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/MainActivity.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/MainActivity.java @@ -17,7 +17,6 @@ import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.ViewModelProvider; import androidx.appcompat.app.AppCompatDelegate; -import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -27,8 +26,6 @@ import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; -import com.google.android.material.appbar.AppBarLayout; - import java.util.List; import java.util.concurrent.TimeUnit; @@ -40,6 +37,7 @@ import wangdaye.com.geometricweather.basic.model.option.DarkMode; import wangdaye.com.geometricweather.basic.model.option.provider.WeatherSource; import wangdaye.com.geometricweather.basic.model.resource.Resource; +import wangdaye.com.geometricweather.databinding.ActivityMainBinding; import wangdaye.com.geometricweather.main.adapter.main.MainAdapter; import wangdaye.com.geometricweather.main.dialog.LocationHelpDialog; import wangdaye.com.geometricweather.ui.fragment.LocationManageFragment; @@ -47,7 +45,6 @@ import wangdaye.com.geometricweather.resource.provider.ResourceProvider; import wangdaye.com.geometricweather.resource.provider.ResourcesProviderFactory; import wangdaye.com.geometricweather.settings.SettingsOptionManager; -import wangdaye.com.geometricweather.ui.widget.verticalScrollView.VerticalRecyclerView; import wangdaye.com.geometricweather.ui.widget.weatherView.WeatherView; import wangdaye.com.geometricweather.ui.widget.weatherView.WeatherViewController; import wangdaye.com.geometricweather.ui.widget.weatherView.circularSkyView.CircularSkyWeatherView; @@ -56,14 +53,12 @@ import wangdaye.com.geometricweather.remoteviews.WidgetUtils; import wangdaye.com.geometricweather.utils.helpter.IntentHelper; import wangdaye.com.geometricweather.utils.SnackbarUtils; -import wangdaye.com.geometricweather.ui.widget.InkPageIndicator; import wangdaye.com.geometricweather.ui.widget.SwipeSwitchLayout; import wangdaye.com.geometricweather.utils.DisplayUtils; import wangdaye.com.geometricweather.background.polling.PollingManager; import wangdaye.com.geometricweather.utils.manager.ThemeManager; import wangdaye.com.geometricweather.utils.manager.ThreadManager; import wangdaye.com.geometricweather.utils.manager.TimeManager; -import wangdaye.com.geometricweather.ui.widget.verticalScrollView.VerticalSwipeRefreshLayout; import wangdaye.com.geometricweather.utils.manager.ShortcutsManager; /** @@ -74,20 +69,10 @@ public class MainActivity extends GeoActivity implements SwipeRefreshLayout.OnRefreshListener { private MainActivityViewModel viewModel; + private ActivityMainBinding binding; - private CoordinatorLayout background; @Nullable private LocationManageFragment manageFragment; - private WeatherView weatherView; - private AppBarLayout appBar; - private Toolbar toolbar; - - private InkPageIndicator indicator; - - private SwipeSwitchLayout switchLayout; - private VerticalSwipeRefreshLayout refreshLayout; - private VerticalRecyclerView recyclerView; - @Nullable private MainAdapter adapter; @Nullable private AnimatorSet recyclerViewAnimator; @@ -134,14 +119,8 @@ public void onReceive(Context context, Intent intent) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - DisplayUtils.setSystemBarStyle(MainActivity.this, getWindow(), true, - false, false, true, false); - - if (MainDisplayUtils.isMultiFragmentEnabled(this)) { - setContentView(R.layout.activity_main_tablet); - } else { - setContentView(R.layout.activity_main); - } + binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); // attach weather view. switch (SettingsOptionManager.getInstance(this).getUiStyle()) { @@ -153,7 +132,7 @@ protected void onCreate(Bundle savedInstanceState) { weatherView = new CircularSkyWeatherView(this); break; } - ((CoordinatorLayout) findViewById(R.id.activity_main_switchView).getParent()).addView( + ((CoordinatorLayout) binding.switchLayout.getParent()).addView( (View) weatherView, 0, new CoordinatorLayout.LayoutParams( @@ -161,6 +140,8 @@ protected void onCreate(Bundle savedInstanceState) { ViewGroup.LayoutParams.MATCH_PARENT ) ); + weatherView.setSystemBarStyle(MainActivity.this, getWindow(), + false, false, true, false); resetUIUpdateFlag(); ensureResourceProvider(); @@ -255,7 +236,7 @@ protected void onDestroy() { @Override public View getSnackbarContainer() { - return background; + return binding.background; } // init. @@ -277,9 +258,9 @@ private String getLocationId(@Nullable Intent intent) { @SuppressLint("ClickableViewAccessibility") private void initView() { - this.background = findViewById(R.id.activity_main_background); - if (MainDisplayUtils.isMultiFragmentEnabled(this)) { + binding.locationContainer.setVisibility(View.VISIBLE); + this.manageFragment = new LocationManageFragment(); manageFragment.setDrawerMode(true); manageFragment.setRequestCodes(SEARCH_ACTIVITY, SELECT_PROVIDER_ACTIVITY); @@ -297,12 +278,13 @@ public void onLocationListChanged() { getSupportFragmentManager() .beginTransaction() .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) - .replace(R.id.activity_main_locationContainer, manageFragment) + .replace(R.id.location_container, manageFragment) .commit(); + } else { + binding.locationContainer.setVisibility(View.GONE); } - this.appBar = findViewById(R.id.activity_main_appBar); - ViewCompat.setOnApplyWindowInsetsListener(appBar, (v, insets) -> { + ViewCompat.setOnApplyWindowInsetsListener(binding.appBar, (v, insets) -> { v.setPadding( manageFragment != null ? 0 : insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), @@ -312,10 +294,10 @@ public void onLocationListChanged() { return insets; }); - this.toolbar = findViewById(R.id.activity_main_toolbar); - toolbar.inflateMenu(R.menu.activity_main); - toolbar.getMenu().getItem(0).setVisible(!MainDisplayUtils.isMultiFragmentEnabled(this)); - toolbar.setOnMenuItemClickListener(menuItem -> { + binding.toolbar.inflateMenu(R.menu.activity_main); + binding.toolbar.getMenu().getItem(0).setVisible( + !MainDisplayUtils.isMultiFragmentEnabled(this)); + binding.toolbar.setOnMenuItemClickListener(menuItem -> { switch (menuItem.getItemId()) { case R.id.action_manage: IntentHelper.startManageActivityForResult(this, MANAGE_ACTIVITY); @@ -328,15 +310,13 @@ public void onLocationListChanged() { return true; }); - this.switchLayout = findViewById(R.id.activity_main_switchView); - switchLayout.setOnSwitchListener(switchListener); + binding.switchLayout.setOnSwitchListener(switchListener); - this.refreshLayout = findViewById(R.id.activity_main_refreshView); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { - refreshLayout.setOnApplyWindowInsetsListener((v, insets) -> { + binding.refreshLayout.setOnApplyWindowInsetsListener((v, insets) -> { int startPosition = insets.getSystemWindowInsetTop() + getResources().getDimensionPixelSize(R.dimen.normal_margin); - refreshLayout.setProgressViewOffset( + binding.refreshLayout.setProgressViewOffset( false, startPosition, (int) (startPosition + 64 * getResources().getDisplayMetrics().density) @@ -344,13 +324,11 @@ public void onLocationListChanged() { return insets; }); } + binding.refreshLayout.setOnRefreshListener(this); - refreshLayout.setOnRefreshListener(this); - - this.recyclerView = findViewById(R.id.activity_main_recyclerView); - recyclerView.setLayoutManager(new MainLayoutManager()); - recyclerView.setOnTouchListener(indicatorStateListener); - ViewCompat.setOnApplyWindowInsetsListener(recyclerView, (v, insets) -> { + binding.recyclerView.setLayoutManager(new MainLayoutManager()); + binding.recyclerView.setOnTouchListener(indicatorStateListener); + ViewCompat.setOnApplyWindowInsetsListener(binding.recyclerView, (v, insets) -> { v.setPadding( manageFragment != null ? 0 : insets.getSystemWindowInsetLeft(), 0, @@ -360,8 +338,7 @@ public void onLocationListChanged() { return insets; }); - this.indicator = findViewById(R.id.activity_main_indicator); - indicator.setSwitchView(switchLayout); + binding.indicator.setSwitchView(binding.switchLayout); viewModel.getCurrentLocation().observe(this, resource -> { boolean updateInBackground = resource.consumeUpdatedInBackground(); @@ -386,18 +363,18 @@ public void onLocationListChanged() { }); viewModel.getIndicator().observe(this, resource -> { - switchLayout.setEnabled(resource.total > 1); + binding.switchLayout.setEnabled(resource.total > 1); - if (switchLayout.getTotalCount() != resource.total - || switchLayout.getPosition() != resource.index) { - switchLayout.setData(resource.index, resource.total); - indicator.setSwitchView(switchLayout); + if (binding.switchLayout.getTotalCount() != resource.total + || binding.switchLayout.getPosition() != resource.index) { + binding.switchLayout.setData(resource.index, resource.total); + binding.indicator.setSwitchView(binding.switchLayout); } if (resource.total > 1) { - indicator.setVisibility(View.VISIBLE); + binding.indicator.setVisibility(View.VISIBLE); } else { - indicator.setVisibility(View.GONE); + binding.indicator.setVisibility(View.GONE); } }); } @@ -448,8 +425,8 @@ private void drawUI(Location location, boolean defaultLocation, boolean updatedI WeatherViewController.setWeatherCode( weatherView, location.getWeather(), daytime, resourceProvider); - refreshLayout.setColorSchemeColors(weatherView.getThemeColors(themeManager.isLightTheme())[0]); - refreshLayout.setProgressBackgroundColorSchemeColor(themeManager.getRootColor(this)); + binding.refreshLayout.setColorSchemeColors(weatherView.getThemeColors(themeManager.isLightTheme())[0]); + binding.refreshLayout.setProgressBackgroundColorSchemeColor(themeManager.getRootColor(this)); boolean listAnimationEnabled = SettingsOptionManager.getInstance(this).isListAnimationEnabled(); boolean itemAnimationEnabled = SettingsOptionManager.getInstance(this).isItemAnimationEnabled(); @@ -457,7 +434,7 @@ private void drawUI(Location location, boolean defaultLocation, boolean updatedI if (adapter == null) { adapter = new MainAdapter( this, location, resourceProvider, listAnimationEnabled, itemAnimationEnabled); - recyclerView.setAdapter(adapter); + binding.recyclerView.setAdapter(adapter); } else { adapter.reset( this, location, resourceProvider, listAnimationEnabled, itemAnimationEnabled); @@ -465,20 +442,20 @@ private void drawUI(Location location, boolean defaultLocation, boolean updatedI } OnScrollListener l = new OnScrollListener(); - recyclerView.clearOnScrollListeners(); - recyclerView.addOnScrollListener(l); - recyclerView.post(() -> l.onScrolled(recyclerView, 0, 0)); + binding.recyclerView.clearOnScrollListeners(); + binding.recyclerView.addOnScrollListener(l); + binding.recyclerView.post(() -> l.onScrolled(binding.recyclerView, 0, 0)); - indicator.setCurrentIndicatorColor(themeManager.getAccentColor(this)); - indicator.setIndicatorColor(themeManager.getTextSubtitleColor(this)); + binding.indicator.setCurrentIndicatorColor(themeManager.getAccentColor(this)); + binding.indicator.setIndicatorColor(themeManager.getTextSubtitleColor(this)); if (!listAnimationEnabled) { - recyclerView.setAlpha(0f); + binding.recyclerView.setAlpha(0f); recyclerViewAnimator = new AnimatorSet(); recyclerViewAnimator.playTogether( - ObjectAnimator.ofFloat(recyclerView, "alpha", 0f, 1f), + ObjectAnimator.ofFloat(binding.recyclerView, "alpha", 0f, 1f), ObjectAnimator.ofFloat( - recyclerView, + binding.recyclerView, "translationY", DisplayUtils.dpToPx(this, 40), 0f ) @@ -498,15 +475,17 @@ private void resetUI(Location location) { && location.getWeather() == null) { WeatherViewController.setWeatherCode( weatherView, null, themeManager.isLightTheme(), resourceProvider); - refreshLayout.setColorSchemeColors(weatherView.getThemeColors(themeManager.isLightTheme())[0]); - refreshLayout.setProgressBackgroundColorSchemeColor(themeManager.getRootColor(this)); + binding.refreshLayout.setColorSchemeColors( + weatherView.getThemeColors(themeManager.isLightTheme())[0]); + binding.refreshLayout.setProgressBackgroundColorSchemeColor( + themeManager.getRootColor(this)); } weatherView.setGravitySensorEnabled( SettingsOptionManager.getInstance(this).isGravitySensorEnabled()); - toolbar.setTitle(location.getCityName(this)); + binding.toolbar.setTitle(location.getCityName(this)); - switchLayout.reset(); + binding.switchLayout.reset(); if (recyclerViewAnimator != null) { recyclerViewAnimator.cancel(); @@ -549,7 +528,7 @@ private void setDarkMode(boolean dayTime) { } private void setRefreshing(final boolean b) { - refreshLayout.post(() -> refreshLayout.setRefreshing(b)); + binding.refreshLayout.post(() -> binding.refreshLayout.setRefreshing(b)); } private void refreshBackgroundViews(boolean resetBackground, List locationList, @@ -591,12 +570,12 @@ private void refreshBackgroundViews(boolean resetBackground, List loca public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: - indicator.setDisplayState(true); + binding.indicator.setDisplayState(true); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: - indicator.setDisplayState(false); + binding.indicator.setDisplayState(false); break; } return false; @@ -614,7 +593,7 @@ public boolean onTouch(View v, MotionEvent event) { @Override public void onSwipeProgressChanged(int swipeDirection, float progress) { - indicator.setDisplayState(progress != 0); + binding.indicator.setDisplayState(progress != 0); indexSwitched = false; @@ -629,7 +608,7 @@ public void onSwipeProgressChanged(int swipeDirection, float progress) { } if (indexSwitched) { - toolbar.setTitle(location.getCityName(MainActivity.this)); + binding.toolbar.setTitle(location.getCityName(MainActivity.this)); if (location.getWeather() != null) { WeatherViewController.setWeatherCode( weatherView, @@ -646,7 +625,7 @@ public void onSwipeReleased(int swipeDirection, boolean doSwitch) { if (doSwitch) { resetUIUpdateFlag(); - indicator.setDisplayState(false); + binding.indicator.setDisplayState(false); viewModel.setLocation( MainActivity.this, swipeDirection == SwipeSwitchLayout.SWIPE_DIRECTION_LEFT ? 1 : -1 @@ -705,23 +684,23 @@ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { // set translation y of toolbar. if (adapter != null && firstCardMarginTop > 0) { if (firstCardMarginTop - >= appBar.getMeasuredHeight() + adapter.getCurrentTemperatureTextHeight(recyclerView)) { + >= binding.appBar.getMeasuredHeight() + adapter.getCurrentTemperatureTextHeight(recyclerView)) { if (scrollY < firstCardMarginTop - - appBar.getMeasuredHeight() + - binding.appBar.getMeasuredHeight() - adapter.getCurrentTemperatureTextHeight(recyclerView)) { - appBar.setTranslationY(0); - } else if (scrollY > firstCardMarginTop - appBar.getY()) { - appBar.setTranslationY(-appBar.getMeasuredHeight()); + binding.appBar.setTranslationY(0); + } else if (scrollY > firstCardMarginTop - binding.appBar.getY()) { + binding.appBar.setTranslationY(-binding.appBar.getMeasuredHeight()); } else { - appBar.setTranslationY( + binding.appBar.setTranslationY( firstCardMarginTop - adapter.getCurrentTemperatureTextHeight(recyclerView) - scrollY - - appBar.getMeasuredHeight() + - binding.appBar.getMeasuredHeight() ); } } else { - appBar.setTranslationY(-scrollY); + binding.appBar.setTranslationY(-scrollY); } } @@ -738,7 +717,7 @@ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { } if (topChanged) { - DisplayUtils.setSystemBarColor(MainActivity.this, getWindow(), true, + weatherView.setSystemBarColor(MainActivity.this, getWindow(), topOverlap, false, true, false); } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/DetailsAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/DetailsAdapter.java index 4b773a6d2..b8b3fab80 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/DetailsAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/DetailsAdapter.java @@ -143,7 +143,10 @@ public DetailsAdapter(Context context, @NonNull Weather weather) { new Index( R.drawable.ic_water, context.getString(R.string.dew_point), - settings.getTemperatureUnit().getTemperatureText(weather.getCurrent().getDewPoint()) + settings.getTemperatureUnit().getTemperatureText( + context, + weather.getCurrent().getDewPoint() + ) ) ); } @@ -153,7 +156,9 @@ public DetailsAdapter(Context context, @NonNull Weather weather) { new Index( R.drawable.ic_cloud, context.getString(R.string.cloud_cover), - CloudCoverUnit.PERCENT.getCloudCoverText(weather.getCurrent().getCloudCover()) + CloudCoverUnit.PERCENT.getCloudCoverText( + weather.getCurrent().getCloudCover() + ) ) ); } @@ -163,7 +168,10 @@ public DetailsAdapter(Context context, @NonNull Weather weather) { new Index( R.drawable.ic_top, context.getString(R.string.ceiling), - settings.getDistanceUnit().getDistanceText(context, weather.getCurrent().getCeiling()) + settings.getDistanceUnit().getDistanceText( + context, + weather.getCurrent().getCeiling() + ) ) ); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/AirQualityViewHolder.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/AirQualityViewHolder.java index 795ce6fc0..c45ab112c 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/AirQualityViewHolder.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/AirQualityViewHolder.java @@ -4,6 +4,7 @@ import android.animation.ArgbEvaluator; import android.animation.FloatEvaluator; import android.animation.ValueAnimator; +import android.annotation.SuppressLint; import android.view.LayoutInflater; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; @@ -49,6 +50,7 @@ public AirQualityViewHolder(ViewGroup parent) { this.recyclerView = itemView.findViewById(R.id.container_main_aqi_recyclerView); } + @SuppressLint("DefaultLocale") @Override public void onBindView(GeoActivity activity, @NonNull Location location, @NonNull ResourceProvider provider, @@ -70,7 +72,7 @@ public void onBindView(GeoActivity activity, @NonNull Location location, if (itemAnimationEnabled) { progress.setProgress(0); - progress.setText("0"); + progress.setText(String.format("%d", 0)); progress.setProgressColor( ContextCompat.getColor(context, R.color.colorLevel_1), themeManager.isLightTheme() @@ -79,7 +81,7 @@ public void onBindView(GeoActivity activity, @NonNull Location location, } else { int aqiColor = weather.getCurrent().getAirQuality().getAqiColor(progress.getContext()); progress.setProgress(aqiIndex); - progress.setText(String.valueOf(aqiIndex)); + progress.setText(String.format("%d", aqiIndex)); progress.setProgressColor(aqiColor, themeManager.isLightTheme()); progress.setArcBackgroundColor( ColorUtils.setAlphaComponent(aqiColor, (int) (255 * 0.1)) @@ -94,6 +96,7 @@ public void onBindView(GeoActivity activity, @NonNull Location location, recyclerView.setLayoutManager(new LinearLayoutManager(context)); } + @SuppressLint("DefaultLocale") @Override public void onEnterScreen() { if (itemAnimationEnabled && enable && weather != null) { @@ -119,7 +122,7 @@ public void onEnterScreen() { ValueAnimator aqiNumber = ValueAnimator.ofObject(new FloatEvaluator(), 0, aqiIndex); aqiNumber.addUpdateListener(animation -> { progress.setProgress((Float) animation.getAnimatedValue()); - progress.setText(Integer.toString((int) progress.getProgress())); + progress.setText(String.format("%d", (int) progress.getProgress())); }); attachAnimatorSet = new AnimatorSet(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/DailyViewHolder.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/DailyViewHolder.java index 9a6ad377a..bece5d644 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/DailyViewHolder.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/DailyViewHolder.java @@ -17,6 +17,7 @@ import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.GeoActivity; import wangdaye.com.geometricweather.basic.model.location.Location; +import wangdaye.com.geometricweather.basic.model.option.appearance.DailyTrendDisplay; import wangdaye.com.geometricweather.basic.model.option.provider.WeatherSource; import wangdaye.com.geometricweather.basic.model.weather.Daily; import wangdaye.com.geometricweather.basic.model.weather.Weather; @@ -80,6 +81,7 @@ public void onBindView(GeoActivity activity, @NonNull Location location, if (tagList.size() < 2) { tagView.setVisibility(View.GONE); } else { + tagView.setVisibility(View.VISIBLE); int decorCount = tagView.getItemDecorationCount(); for (int i = 0; i < decorCount; i++) { tagView.removeItemDecorationAt(0); @@ -104,9 +106,16 @@ public void onBindView(GeoActivity activity, @NonNull Location location, trendRecyclerView.setHasFixedSize(true); trendRecyclerView.setLayoutManager( - new TrendHorizontalLinearLayoutManager(context, DisplayUtils.isLandscape(context) ? 7 : 5)); + new TrendHorizontalLinearLayoutManager( + context, + DisplayUtils.isLandscape(context) ? 7 : 5 + ) + ); trendRecyclerView.setAdapter(trendAdapter); - setTrendAdapterByTag(location.getFormattedId(), weather, location.getTimeZone(), (MainTag) tagList.get(0)); + trendRecyclerView.setKeyLineVisibility( + SettingsOptionManager.getInstance(context).isTrendHorizontalLinesEnabled()); + setTrendAdapterByTag(location.getFormattedId(), weather, location.getTimeZone(), + (MainTag) tagList.get(0)); } private void setTrendAdapterByTag(String formattedId, Weather weather, TimeZone timeZone, MainTag tag) { @@ -166,13 +175,41 @@ private void setTrendAdapterByTag(String formattedId, Weather weather, TimeZone private List getTagList(Weather weather, WeatherSource source) { List tagList = new ArrayList<>(); - tagList.add(new MainTag(context.getString(R.string.tag_temperature), MainTag.Type.TEMPERATURE)); - tagList.add(new MainTag(context.getString(R.string.tag_aqi), MainTag.Type.AIR_QUALITY)); - if (source == WeatherSource.ACCU) { - tagList.add(new MainTag(context.getString(R.string.tag_wind), MainTag.Type.WIND)); - tagList.add(new MainTag(context.getString(R.string.tag_uv), MainTag.Type.UV_INDEX)); - tagList.addAll(getPrecipitationTagList(weather)); + List displayList + = SettingsOptionManager.getInstance(context).getDailyTrendDisplayList(); + for (DailyTrendDisplay d : displayList) { + switch (d) { + case TAG_TEMPERATURE: + tagList.add(new MainTag(context.getString(R.string.tag_temperature), MainTag.Type.TEMPERATURE)); + break; + + case TAG_AIR_QUALITY: + tagList.add(new MainTag(context.getString(R.string.tag_aqi), MainTag.Type.AIR_QUALITY)); + break; + + case TAG_WIND: + if (source == WeatherSource.ACCU) { + tagList.add(new MainTag(context.getString(R.string.tag_wind), MainTag.Type.WIND)); + } + break; + + case TAG_UV_INDEX: + if (source == WeatherSource.ACCU) { + tagList.add(new MainTag(context.getString(R.string.tag_uv), MainTag.Type.UV_INDEX)); + } + break; + + case TAG_PRECIPITATION: + if (source == WeatherSource.ACCU) { + tagList.addAll(getPrecipitationTagList(weather)); + } + break; + } + } + if (tagList.size() == 0) { + tagList.add(new MainTag(context.getString(R.string.tag_temperature), MainTag.Type.TEMPERATURE)); } + return tagList; } diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HeaderViewHolder.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HeaderViewHolder.java index 7c8583619..fcfcdbe4c 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HeaderViewHolder.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HeaderViewHolder.java @@ -83,14 +83,14 @@ public void onBindView(Context context, @NonNull Location location, @NonNull Res Math.max(temperatureCFrom, Math.abs(temperatureCTo) / 10f * 1000) ) ); - temperature.setPostfixString(unit.getUnitShortAbbreviation()); + temperature.setPostfixString(unit.getShortAbbreviation(context)); weather.setText( location.getWeather().getCurrent().getWeatherText() + ", " + context.getString(R.string.feels_like) + " " - + location.getWeather().getCurrent().getTemperature().getShortRealFeeTemperature(unit) + + location.getWeather().getCurrent().getTemperature().getShortRealFeeTemperature(context, unit) ); if (location.getWeather().getCurrent().getAirQuality().getAqiText() == null) { @@ -119,12 +119,13 @@ protected Animator getEnterAnimator(List pendingAnimatorList) { return a; } + @SuppressLint("DefaultLocale") @Override public void onEnterScreen() { super.onEnterScreen(); temperature.setNumberString( - String.valueOf(unit.getTemperature(temperatureCFrom)), - String.valueOf(unit.getTemperature(temperatureCTo)) + String.format("%d", unit.getTemperature(temperatureCFrom)), + String.format("%d", unit.getTemperature(temperatureCTo)) ); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HourlyViewHolder.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HourlyViewHolder.java index 0b710f890..02c966ae1 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HourlyViewHolder.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/main/holder/HourlyViewHolder.java @@ -120,8 +120,14 @@ public void onBindView(GeoActivity activity, @NonNull Location location, @NonNul trendRecyclerView.setHasFixedSize(true); trendRecyclerView.setLayoutManager( - new TrendHorizontalLinearLayoutManager(context, DisplayUtils.isLandscape(context) ? 7 : 5)); + new TrendHorizontalLinearLayoutManager( + context, + DisplayUtils.isLandscape(context) ? 7 : 5 + ) + ); trendRecyclerView.setAdapter(trendAdapter); + trendRecyclerView.setKeyLineVisibility( + SettingsOptionManager.getInstance(context).isTrendHorizontalLinesEnabled()); setTrendAdapterByTag(weather, (MainTag) tagList.get(0)); List minutelyList = weather.getMinutelyForecast(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/DailyTrendAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/DailyTrendAdapter.java index 9c92b7b64..468f93ee1 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/DailyTrendAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/DailyTrendAdapter.java @@ -1,5 +1,6 @@ package wangdaye.com.geometricweather.main.adapter.trend; +import android.content.Context; import android.view.ViewGroup; import androidx.annotation.NonNull; @@ -95,11 +96,13 @@ public int getItemViewType(int position) { class DailyTemperatureAdapter extends wangdaye.com.geometricweather.main.adapter.trend.daily.DailyTemperatureAdapter { + private Context c; + public DailyTemperatureAdapter(GeoActivity activity, TrendRecyclerView parent, String formattedId, @NonNull Weather weather, @NonNull TimeZone timeZone, ResourceProvider provider, TemperatureUnit unit) { super(activity, parent, formattedId, weather, timeZone, true, provider, unit); - + this.c = activity; } @Override @@ -124,21 +127,21 @@ protected int getNighttimeTemperature(Weather weather, int index, TemperatureUni @Override protected String getDaytimeTemperatureString(Weather weather, int index, TemperatureUnit unit) { - return weather.getDailyForecast().get(index).day().getTemperature().getTemperature(unit); + return weather.getDailyForecast().get(index).day().getTemperature().getTemperature(c, unit); } @Override protected String getNighttimeTemperatureString(Weather weather, int index, TemperatureUnit unit) { - return weather.getDailyForecast().get(index).night().getTemperature().getTemperature(unit); + return weather.getDailyForecast().get(index).night().getTemperature().getTemperature(c, unit); } @Override protected String getShortDaytimeTemperatureString(Weather weather, int index, TemperatureUnit unit) { - return weather.getDailyForecast().get(index).day().getTemperature().getShortTemperature(unit); + return weather.getDailyForecast().get(index).day().getTemperature().getShortTemperature(c, unit); } @Override protected String getShortNighttimeTemperatureString(Weather weather, int index, TemperatureUnit unit) { - return weather.getDailyForecast().get(index).night().getTemperature().getShortTemperature(unit); + return weather.getDailyForecast().get(index).night().getTemperature().getShortTemperature(c, unit); } } \ No newline at end of file diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/HourlyTrendAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/HourlyTrendAdapter.java index f9ec0819a..8ff5640f3 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/HourlyTrendAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/HourlyTrendAdapter.java @@ -1,5 +1,6 @@ package wangdaye.com.geometricweather.main.adapter.trend; +import android.content.Context; import android.view.ViewGroup; import androidx.annotation.NonNull; @@ -67,9 +68,12 @@ public int getItemViewType(int position) { class HourlyTemperatureAdapter extends wangdaye.com.geometricweather.main.adapter.trend.hourly.HourlyTemperatureAdapter { + private Context c; + public HourlyTemperatureAdapter(GeoActivity activity, TrendRecyclerView parent, @NonNull Weather weather, ResourceProvider provider, TemperatureUnit unit) { super(activity, parent, weather, true, provider, unit); + this.c = activity; } @Override @@ -84,11 +88,11 @@ protected int getTemperature(Weather weather, int index, TemperatureUnit unit) { @Override protected String getTemperatureString(Weather weather, int index, TemperatureUnit unit) { - return weather.getHourlyForecast().get(index).getTemperature().getTemperature(unit); + return weather.getHourlyForecast().get(index).getTemperature().getTemperature(c, unit); } @Override protected String getShortTemperatureString(Weather weather, int index, TemperatureUnit unit) { - return weather.getHourlyForecast().get(index).getTemperature().getShortTemperature(unit); + return weather.getHourlyForecast().get(index).getTemperature().getShortTemperature(c, unit); } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyAirQualityAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyAirQualityAdapter.java index 63cf9f763..95eaabbea 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyAirQualityAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyAirQualityAdapter.java @@ -50,7 +50,7 @@ class ViewHolder extends RecyclerView.ViewHolder { dailyItem.setChartItemView(polylineAndHistogramView); } - @SuppressLint("SetTextI18n, InflateParams") + @SuppressLint({"SetTextI18n, InflateParams", "DefaultLocale"}) void onBindView(int position) { Context context = itemView.getContext(); Daily daily = weather.getDailyForecast().get(position); @@ -74,7 +74,7 @@ void onBindView(int position) { null, null, null, null, (float) (index == null ? 0 : index), - String.valueOf(index == null ? 0 : index), + String.format("%d", index == null ? 0 : index), (float) highestIndex, 0f ); diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyTemperatureAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyTemperatureAdapter.java index 354fe32cb..9bae0898b 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyTemperatureAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyTemperatureAdapter.java @@ -16,6 +16,7 @@ import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.GeoActivity; +import wangdaye.com.geometricweather.basic.model.option.unit.ProbabilityUnit; import wangdaye.com.geometricweather.basic.model.option.unit.TemperatureUnit; import wangdaye.com.geometricweather.basic.model.weather.Daily; import wangdaye.com.geometricweather.basic.model.weather.Temperature; @@ -98,7 +99,7 @@ void onBindView(int position) { (float) highestTemperature, (float) lowestTemperature, p < 5 ? null : p, - p < 5 ? null : ((int) p + "%"), + p < 5 ? null : ProbabilityUnit.PERCENT.getProbabilityText(context, p), 100f, 0f ); @@ -198,7 +199,11 @@ public DailyTemperatureAdapter(GeoActivity activity, TrendRecyclerView parent, keyLineList.add( new TrendRecyclerView.KeyLine( weather.getYesterday().getDaytimeTemperature(), - Temperature.getShortTemperature(weather.getYesterday().getDaytimeTemperature(), unit), + Temperature.getShortTemperature( + activity, + weather.getYesterday().getDaytimeTemperature(), + unit + ), activity.getString(R.string.yesterday), TrendRecyclerView.KeyLine.ContentPosition.ABOVE_LINE ) @@ -206,7 +211,11 @@ public DailyTemperatureAdapter(GeoActivity activity, TrendRecyclerView parent, keyLineList.add( new TrendRecyclerView.KeyLine( weather.getYesterday().getNighttimeTemperature(), - Temperature.getShortTemperature(weather.getYesterday().getNighttimeTemperature(), unit), + Temperature.getShortTemperature( + activity, + weather.getYesterday().getNighttimeTemperature(), + unit + ), activity.getString(R.string.yesterday), TrendRecyclerView.KeyLine.ContentPosition.BELOW_LINE ) diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyUVAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyUVAdapter.java index b3580b2c5..bd7558f9e 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyUVAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/daily/DailyUVAdapter.java @@ -51,7 +51,7 @@ class ViewHolder extends RecyclerView.ViewHolder { dailyItem.setChartItemView(polylineAndHistogramView); } - @SuppressLint("SetTextI18n, InflateParams") + @SuppressLint({"SetTextI18n, InflateParams", "DefaultLocale"}) void onBindView(int position) { Context context = itemView.getContext(); Daily daily = weather.getDailyForecast().get(position); @@ -75,7 +75,7 @@ void onBindView(int position) { null, null, null, null, (float) (index == null ? 0 : index), - String.valueOf(index == null ? 0 : index), + String.format("%d", index == null ? 0 : index), (float) highestIndex, 0f ); diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/hourly/HourlyTemperatureAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/hourly/HourlyTemperatureAdapter.java index e16798cad..5b15c2e3c 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/hourly/HourlyTemperatureAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/adapter/trend/hourly/HourlyTemperatureAdapter.java @@ -14,6 +14,7 @@ import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.GeoActivity; +import wangdaye.com.geometricweather.basic.model.option.unit.ProbabilityUnit; import wangdaye.com.geometricweather.basic.model.option.unit.TemperatureUnit; import wangdaye.com.geometricweather.basic.model.weather.Hourly; import wangdaye.com.geometricweather.basic.model.weather.Temperature; @@ -81,7 +82,7 @@ void onBindView(int position) { (float) highestTemperature, (float) lowestTemperature, p < 5 ? null : p, - p < 5 ? null : ((int) p + "%"), + p < 5 ? null : ProbabilityUnit.PERCENT.getProbabilityText(context, p), 100f, 0f ); @@ -165,7 +166,11 @@ public HourlyTemperatureAdapter(GeoActivity activity, TrendRecyclerView parent, keyLineList.add( new TrendRecyclerView.KeyLine( weather.getYesterday().getDaytimeTemperature(), - Temperature.getShortTemperature(weather.getYesterday().getDaytimeTemperature(), unit), + Temperature.getShortTemperature( + activity, + weather.getYesterday().getDaytimeTemperature(), + unit + ), activity.getString(R.string.yesterday), TrendRecyclerView.KeyLine.ContentPosition.ABOVE_LINE ) @@ -173,7 +178,11 @@ public HourlyTemperatureAdapter(GeoActivity activity, TrendRecyclerView parent, keyLineList.add( new TrendRecyclerView.KeyLine( weather.getYesterday().getNighttimeTemperature(), - Temperature.getShortTemperature(weather.getYesterday().getNighttimeTemperature(), unit), + Temperature.getShortTemperature( + activity, + weather.getYesterday().getNighttimeTemperature(), + unit + ), activity.getString(R.string.yesterday), TrendRecyclerView.KeyLine.ContentPosition.BELOW_LINE ) diff --git a/app/src/main/java/wangdaye/com/geometricweather/main/dialog/HourlyWeatherDialog.java b/app/src/main/java/wangdaye/com/geometricweather/main/dialog/HourlyWeatherDialog.java index 5f8fb53a0..676879147 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/main/dialog/HourlyWeatherDialog.java +++ b/app/src/main/java/wangdaye/com/geometricweather/main/dialog/HourlyWeatherDialog.java @@ -91,12 +91,14 @@ private void initWidget(View view) { PrecipitationUnit precipitationUnit = settings.getPrecipitationUnit(); StringBuilder builder = new StringBuilder( - hourly.getWeatherText() + " " + hourly.getTemperature().getTemperature(temperatureUnit) + hourly.getWeatherText() + + " " + + hourly.getTemperature().getTemperature(requireActivity(), temperatureUnit) ); if (hourly.getTemperature().getRealFeelTemperature() != null) { builder.append("\n") .append(getString(R.string.feels_like)) - .append(hourly.getTemperature().getRealFeelTemperature(temperatureUnit)); + .append(hourly.getTemperature().getRealFeelTemperature(requireActivity(), temperatureUnit)); } if (hourly.getPrecipitation().getTotal() != null) { Float p = hourly.getPrecipitation().getTotal(); @@ -111,7 +113,7 @@ private void initWidget(View view) { builder.append("\n") .append(getString(R.string.precipitation_probability)) .append(" : ") - .append(ProbabilityUnit.PERCENT.getProbabilityText(p)); + .append(ProbabilityUnit.PERCENT.getProbabilityText(requireActivity(), p)); } weatherText.setText(builder.toString()); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/WidgetUtils.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/WidgetUtils.java index c1a99bfb7..70684a9da 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/WidgetUtils.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/WidgetUtils.java @@ -69,12 +69,12 @@ public static void updateWidgetIfNecessary(Context context, List locat } } - public static String[] buildWidgetDayStyleText(Weather weather, TemperatureUnit unit) { + public static String[] buildWidgetDayStyleText(Context context, Weather weather, TemperatureUnit unit) { String[] texts = new String[] { weather.getCurrent().getWeatherText(), - weather.getCurrent().getTemperature().getTemperature(unit), - weather.getDailyForecast().get(0).day().getTemperature().getShortTemperature(unit), - weather.getDailyForecast().get(0).night().getTemperature().getShortTemperature(unit) + weather.getCurrent().getTemperature().getTemperature(context, unit), + weather.getDailyForecast().get(0).day().getTemperature().getShortTemperature(context, unit), + weather.getDailyForecast().get(0).night().getTemperature().getShortTemperature(context, unit) }; TextPaint paint = new TextPaint(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/config/AbstractWidgetConfigActivity.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/config/AbstractWidgetConfigActivity.java index 19156960b..c7dea2a3b 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/config/AbstractWidgetConfigActivity.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/config/AbstractWidgetConfigActivity.java @@ -6,6 +6,7 @@ import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; @@ -35,6 +36,7 @@ import android.widget.RelativeLayout; import android.widget.RemoteViews; import android.widget.Switch; +import android.widget.TextView; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.textfield.TextInputEditText; @@ -47,6 +49,7 @@ import wangdaye.com.geometricweather.basic.model.location.Location; import wangdaye.com.geometricweather.settings.SettingsOptionManager; import wangdaye.com.geometricweather.ui.widget.insets.FitBottomSystemBarNestedScrollView; +import wangdaye.com.geometricweather.ui.widget.insets.FitTopSystemBarAppBarLayout; import wangdaye.com.geometricweather.utils.DisplayUtils; import wangdaye.com.geometricweather.utils.SnackbarUtils; import wangdaye.com.geometricweather.db.DatabaseHelper; @@ -110,12 +113,15 @@ public abstract class AbstractWidgetConfigActivity extends GeoActivity protected String[] clockFonts; protected String[] clockFontValues; + private long lastBackPressedTime = -1; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_widget_config); initData(); + readConfig(); initView(); updateHostView(); @@ -130,6 +136,23 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } } + @Override + public void onBackPressed() { + if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { + setBottomSheetState(true); + return; + } + + long time = System.currentTimeMillis(); + if (time - lastBackPressedTime < 2000) { + super.onBackPressed(); + return; + } + + lastBackPressedTime = time; + SnackbarUtils.showSnackbar(this, getString(R.string.feedback_click_again_to_exit)); + } + @Override public View getSnackbarContainer() { return container; @@ -221,6 +244,18 @@ public void initData() { this.clockFontValues = res.getStringArray(R.array.clock_font_values); } + private void readConfig() { + SharedPreferences sharedPreferences = getSharedPreferences(getSharedPreferencesName(), MODE_PRIVATE); + viewTypeValueNow = sharedPreferences.getString(getString(R.string.key_view_type), viewTypeValueNow); + cardStyleValueNow = sharedPreferences.getString(getString(R.string.key_card_style), cardStyleValueNow); + cardAlpha = sharedPreferences.getInt(getString(R.string.key_card_alpha), cardAlpha); + hideSubtitle = sharedPreferences.getBoolean(getString(R.string.key_hide_subtitle), hideSubtitle); + subtitleDataValueNow = sharedPreferences.getString(getString(R.string.key_subtitle_data), subtitleDataValueNow); + textColorValueNow = sharedPreferences.getString(getString(R.string.key_text_color), textColorValueNow); + textSize = sharedPreferences.getInt(getString(R.string.key_text_size), textSize); + clockFontValueNow = sharedPreferences.getString(getString(R.string.key_clock_font), clockFontValueNow); + } + @CallSuper public void initView() { this.wallpaper = findViewById(R.id.activity_widget_config_wall); @@ -254,6 +289,7 @@ public void initView() { AppCompatSpinner viewTypeSpinner = findViewById(R.id.activity_widget_config_styleSpinner); viewTypeSpinner.setOnItemSelectedListener(new ViewTypeSpinnerSelectedListener()); viewTypeSpinner.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, viewTypes)); + viewTypeSpinner.setSelection(indexValue(viewTypeValues, viewTypeValueNow), true); this.cardStyleContainer = findViewById(R.id.activity_widget_config_showCardContainer); AppCompatSpinner cardStyleSpinner = findViewById(R.id.activity_widget_config_showCardSpinner); @@ -261,6 +297,7 @@ public void initView() { cardStyleSpinner.setAdapter( new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, cardStyles) ); + cardStyleSpinner.setSelection(indexValue(cardStyleValues, cardStyleValueNow), true); this.cardAlphaContainer = findViewById(R.id.activity_widget_config_cardAlphaContainer); BubbleSeekBar cardAlphaSeekBar = findViewById(R.id.activity_widget_config_cardAlphaSeekBar); @@ -275,10 +312,12 @@ public void initView() { return array; }); cardAlphaSeekBar.setOnProgressChangedListener(new CardAlphaChangedListener()); + cardAlphaSeekBar.setProgress(cardAlpha); this.hideSubtitleContainer = findViewById(R.id.activity_widget_config_hideSubtitleContainer); Switch hideSubtitleSwitch = findViewById(R.id.activity_widget_config_hideSubtitleSwitch); hideSubtitleSwitch.setOnCheckedChangeListener(new HideSubtitleSwitchCheckListener()); + hideSubtitleSwitch.setChecked(hideSubtitle); this.subtitleDataContainer = findViewById(R.id.activity_widget_config_subtitleDataContainer); AppCompatSpinner subtitleDataSpinner = findViewById(R.id.activity_widget_config_subtitleDataSpinner); @@ -286,6 +325,10 @@ public void initView() { subtitleDataSpinner.setAdapter( new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, subtitleData) ); + subtitleDataSpinner.setSelection( + indexValue(subtitleDataValues, isCustomSubtitle() ? "custom" : subtitleDataValueNow), + true + ); this.textColorContainer = findViewById(R.id.activity_widget_config_blackTextContainer); AppCompatSpinner textStyleSpinner = findViewById(R.id.activity_widget_config_blackTextSpinner); @@ -293,6 +336,7 @@ public void initView() { textStyleSpinner.setAdapter( new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, textColors) ); + textStyleSpinner.setSelection(indexValue(textColorValues, textColorValueNow), true); this.textSizeContainer = findViewById(R.id.activity_widget_config_textSizeContainer); BubbleSeekBar textSizeSeekBar = findViewById(R.id.activity_widget_config_textSizeSeekBar); @@ -305,6 +349,7 @@ public void initView() { return array; }); textSizeSeekBar.setOnProgressChangedListener(new TextSizeChangedListener()); + textSizeSeekBar.setProgress(textSize); this.clockFontContainer = findViewById(R.id.activity_widget_config_clockFontContainer); AppCompatSpinner clockFontSpinner = findViewById(R.id.activity_widget_config_clockFontSpinner); @@ -312,6 +357,7 @@ public void initView() { clockFontSpinner.setAdapter( new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, clockFonts) ); + clockFontSpinner.setSelection(indexValue(clockFontValues, cardStyleValueNow), true); Button doneButton = findViewById(R.id.activity_widget_config_doneButton); doneButton.setOnClickListener(v -> { @@ -345,10 +391,6 @@ public void initView() { finish(); }); - bottomSheetBehavior = BottomSheetBehavior.from( - findViewById(R.id.activity_widget_config_custom_subtitle)); - bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); - bottomSheetScrollView = findViewById(R.id.activity_widget_config_custom_scrollView); subtitleInputLayout = findViewById(R.id.activity_widget_config_subtitle_inputLayout); @@ -375,10 +417,29 @@ public void afterTextChanged(Editable editable) { updateHostView(); } }); + if (isCustomSubtitle()) { + subtitleInputter.setText(subtitleDataValueNow); + } else { + subtitleInputter.setText(""); + } + + TextView subtitleCustomKeywords = findViewById(R.id.activity_widget_config_custom_subtitle_keywords); + subtitleCustomKeywords.setText(getSubtitleCustomKeywords()); LinearLayout scrollContainer = findViewById(R.id.activity_widget_config_scrollContainer); scrollContainer.post(() -> scrollContainer.setPaddingRelative( 0, 0, 0, subtitleInputLayout.getMeasuredHeight())); + + FitTopSystemBarAppBarLayout bottomSheet = findViewById(R.id.activity_widget_config_custom_subtitle); + bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); + bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + bottomSheet.post(() -> { + bottomSheetBehavior.setPeekHeight( + subtitleInputLayout.getMeasuredHeight() + + bottomSheetScrollView.getWindowInsets().bottom + ); + setBottomSheetState(isCustomSubtitle()); + }); } public final void updateHostView() { @@ -392,6 +453,16 @@ public final void updateHostView() { widgetContainer.addView(view, params); } + private void setBottomSheetState(boolean visible) { + if (visible) { + bottomSheetBehavior.setHideable(false); + bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + } else { + bottomSheetBehavior.setHideable(true); + bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + } + } + public abstract RemoteViews getRemoteViews(); public Location getLocationNow() { @@ -400,6 +471,84 @@ public Location getLocationNow() { public abstract String getSharedPreferencesName(); + private int indexValue(String[] values, String current) { + for (int i = 0; i < values.length; i ++) { + if (values[i].equals(current)) { + return i; + } + } + return 0; + } + + private boolean isCustomSubtitle() { + for (String v : subtitleDataValues) { + if (!v.equals("custom") && v.equals(subtitleDataValueNow)) { + return false; + } + } + return true; + } + + private String getSubtitleCustomKeywords() { + return getString(R.string.feedback_custom_subtitle_keyword_cw) + + getString(R.string.feedback_custom_subtitle_keyword_ct) + + getString(R.string.feedback_custom_subtitle_keyword_ctd) + + getString(R.string.feedback_custom_subtitle_keyword_at) + + getString(R.string.feedback_custom_subtitle_keyword_atd) + + getString(R.string.feedback_custom_subtitle_keyword_cpb) + + getString(R.string.feedback_custom_subtitle_keyword_cp) + + getString(R.string.feedback_custom_subtitle_keyword_cwd) + + getString(R.string.feedback_custom_subtitle_keyword_cuv) + + getString(R.string.feedback_custom_subtitle_keyword_ch) + + getString(R.string.feedback_custom_subtitle_keyword_cps) + + getString(R.string.feedback_custom_subtitle_keyword_cv) + + getString(R.string.feedback_custom_subtitle_keyword_cdp) + + getString(R.string.feedback_custom_subtitle_keyword_al) + + getString(R.string.feedback_custom_subtitle_keyword_als) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_l) + + getString(R.string.feedback_custom_subtitle_keyword_lat) + + getString(R.string.feedback_custom_subtitle_keyword_lon) + + getString(R.string.feedback_custom_subtitle_keyword_ut) + + getString(R.string.feedback_custom_subtitle_keyword_d) + + getString(R.string.feedback_custom_subtitle_keyword_lc) + + getString(R.string.feedback_custom_subtitle_keyword_w) + + getString(R.string.feedback_custom_subtitle_keyword_ws) + + getString(R.string.feedback_custom_subtitle_keyword_dd) + + getString(R.string.feedback_custom_subtitle_keyword_hd) + + getString(R.string.feedback_custom_subtitle_keyword_enter) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xdw) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xnw) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xdt) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xnt) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xdtd) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xntd) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xdp) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xnp) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xdwd) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xnwd) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xsr) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xss) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xmr) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xms) + + "\n" + + getString(R.string.feedback_custom_subtitle_keyword_xmp); + } + // interface. // on request weather listener. @@ -515,18 +664,8 @@ public void onNothingSelected(AdapterView adapterView) { private class SubtitleDataSpinnerSelectedListener implements AppCompatSpinner.OnItemSelectedListener { @Override public void onItemSelected(AdapterView adapterView, View view, int i, long l) { - if (subtitleDataValues[i].equals("custom")) { - bottomSheetBehavior.setPeekHeight( - subtitleInputLayout.getMeasuredHeight() + bottomSheetScrollView.getWindowInsets().bottom, - true - ); - bottomSheetBehavior.setHideable(false); - bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); - } else { - bottomSheetBehavior.setPeekHeight(0); - bottomSheetBehavior.setHideable(true); - bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); - } + setBottomSheetState(subtitleDataValues[i].equals("custom")); + if (!subtitleDataValueNow.equals(subtitleDataValues[i])) { if (subtitleDataValues[i].equals("custom")) { Editable editable = subtitleInputter.getText(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/AbstractRemoteViewsPresenter.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/AbstractRemoteViewsPresenter.java index d7fa94ba3..46b54bbc6 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/AbstractRemoteViewsPresenter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/AbstractRemoteViewsPresenter.java @@ -22,6 +22,7 @@ import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; +import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -238,25 +239,26 @@ public static String getCustomSubtitle(Context context, @Nullable String subtitl "$ct$", weather.getCurrent() .getTemperature() - .getTemperature(temperatureUnit) + "" + .getTemperature(context, temperatureUnit) + "" ).replace( "$ctd$", weather.getCurrent() .getTemperature() - .getShortTemperature(temperatureUnit) + "" + .getShortTemperature(context, temperatureUnit) + "" ).replace( "$at$", weather.getCurrent() .getTemperature() - .getRealFeelTemperature(temperatureUnit) + "" + .getRealFeelTemperature(context, temperatureUnit) + "" ).replace( "$atd$", weather.getCurrent() .getTemperature() - .getShortRealFeeTemperature(temperatureUnit) + "" + .getShortRealFeeTemperature(context, temperatureUnit) + "" ).replace( "$cpb$", ProbabilityUnit.PERCENT.getProbabilityText( + context, WidgetUtils.getNonNullValue( weather.getCurrent() .getPrecipitationProbability() @@ -290,12 +292,33 @@ public static String getCustomSubtitle(Context context, @Nullable String subtitl 0 ) ) - ).replace("$cps$", pressureUnit.getPressureText( - context, WidgetUtils.getNonNullValue(weather.getCurrent().getPressure(), 0)) - ).replace("$cv$", distanceUnit.getDistanceText( - context, WidgetUtils.getNonNullValue(weather.getCurrent().getVisibility(), 0)) - ).replace("$cdp$", temperatureUnit.getTemperatureText( - WidgetUtils.getNonNullValue(weather.getCurrent().getDewPoint(), 0)) + ).replace( + "$cps$", + pressureUnit.getPressureText( + context, + WidgetUtils.getNonNullValue( + weather.getCurrent().getPressure(), + 0 + ) + ) + ).replace( + "$cv$", + distanceUnit.getDistanceText( + context, + WidgetUtils.getNonNullValue( + weather.getCurrent().getVisibility(), + 0 + ) + ) + ).replace( + "$cdp$", + temperatureUnit.getTemperatureText( + context, + WidgetUtils.getNonNullValue( + weather.getCurrent().getDewPoint(), + 0 + ) + ) ).replace("$l$", location.getCityName(context)) .replace("$lat$", String.valueOf(location.getLatitude())) .replace("$lon$", String.valueOf(location.getLongitude())) @@ -315,14 +338,15 @@ public static String getCustomSubtitle(Context context, @Nullable String subtitl ).replace("$dd$", weather.getCurrent().getDailyForecast() + "") .replace("$hd$", weather.getCurrent().getHourlyForecast() + "") .replace("$enter$", "\n"); + subtitle = replaceAlerts(subtitle, weather); subtitle = replaceDaytimeWeatherSubtitle(subtitle, weather); subtitle = replaceNighttimeWeatherSubtitle(subtitle, weather); - subtitle = replaceDaytimeTemperatureSubtitle(subtitle, weather, temperatureUnit); - subtitle = replaceNighttimeTemperatureSubtitle(subtitle, weather, temperatureUnit); - subtitle = replaceDaytimeDegreeTemperatureSubtitle(subtitle, weather, temperatureUnit); - subtitle = replaceNighttimeDegreeTemperatureSubtitle(subtitle, weather, temperatureUnit); - subtitle = replaceDaytimePrecipitationSubtitle(subtitle, weather); - subtitle = replaceNighttimePrecipitationSubtitle(subtitle, weather); + subtitle = replaceDaytimeTemperatureSubtitle(context, subtitle, weather, temperatureUnit); + subtitle = replaceNighttimeTemperatureSubtitle(context, subtitle, weather, temperatureUnit); + subtitle = replaceDaytimeDegreeTemperatureSubtitle(context, subtitle, weather, temperatureUnit); + subtitle = replaceNighttimeDegreeTemperatureSubtitle(context, subtitle, weather, temperatureUnit); + subtitle = replaceDaytimePrecipitationSubtitle(context, subtitle, weather); + subtitle = replaceNighttimePrecipitationSubtitle(context, subtitle, weather); subtitle = replaceDaytimeWindSubtitle(subtitle, weather); subtitle = replaceNighttimeWindSubtitle(subtitle, weather); subtitle = replaceSunriseSubtitle(context, subtitle, weather); @@ -333,6 +357,29 @@ public static String getCustomSubtitle(Context context, @Nullable String subtitl return subtitle; } + private static String replaceAlerts(@NonNull String subtitle, @NonNull Weather weather) { + StringBuilder defaultBuilder = new StringBuilder(); + StringBuilder shortBuilder = new StringBuilder(); + for (int i = 0; i < weather.getAlertList().size(); i ++) { + defaultBuilder.append(weather.getAlertList().get(i).getDescription()) + .append(", ") + .append( + DateFormat.getDateTimeInstance( + DateFormat.DEFAULT, + DateFormat.SHORT + ).format(weather.getAlertList().get(i).getDate()) + ); + shortBuilder.append(weather.getAlertList().get(i).getDescription()); + + if (i != weather.getAlertList().size() - 1) { + defaultBuilder.append("\n"); + shortBuilder.append("\n"); + } + } + return subtitle.replace("$al$", defaultBuilder.toString()) + .replace("$als$", shortBuilder.toString()); + } + private static String replaceDaytimeWeatherSubtitle(@NonNull String subtitle, @NonNull Weather weather) { for (int i = 0; i < SUBTITLE_DAILY_ITEM_LENGTH; i ++) { subtitle = subtitle.replace( @@ -353,8 +400,8 @@ private static String replaceNighttimeWeatherSubtitle(@NonNull String subtitle, return subtitle; } - private static String replaceDaytimeTemperatureSubtitle(@NonNull String subtitle, @NonNull Weather weather, - TemperatureUnit unit) { + private static String replaceDaytimeTemperatureSubtitle(Context context, @NonNull String subtitle, + @NonNull Weather weather, TemperatureUnit unit) { for (int i = 0; i < SUBTITLE_DAILY_ITEM_LENGTH; i ++) { subtitle = subtitle.replace( @@ -363,14 +410,14 @@ private static String replaceDaytimeTemperatureSubtitle(@NonNull String subtitle .get(i) .day() .getTemperature() - .getTemperature(unit) + "" + .getTemperature(context, unit) + "" ); } return subtitle; } - private static String replaceNighttimeTemperatureSubtitle(@NonNull String subtitle, @NonNull Weather weather, - TemperatureUnit unit) { + private static String replaceNighttimeTemperatureSubtitle(Context context, @NonNull String subtitle, + @NonNull Weather weather, TemperatureUnit unit) { for (int i = 0; i < SUBTITLE_DAILY_ITEM_LENGTH; i ++) { subtitle = subtitle.replace( "$" + i + "nt$", @@ -378,13 +425,15 @@ private static String replaceNighttimeTemperatureSubtitle(@NonNull String subtit .get(i) .night() .getTemperature() - .getTemperature(unit) + "" + .getTemperature(context, unit) + "" ); } return subtitle; } - private static String replaceDaytimeDegreeTemperatureSubtitle(@NonNull String subtitle, @NonNull Weather weather, + private static String replaceDaytimeDegreeTemperatureSubtitle(Context context, + @NonNull String subtitle, + @NonNull Weather weather, TemperatureUnit unit) { for (int i = 0; i < SUBTITLE_DAILY_ITEM_LENGTH; i ++) { subtitle = subtitle.replace( @@ -393,13 +442,15 @@ private static String replaceDaytimeDegreeTemperatureSubtitle(@NonNull String su .get(i) .day() .getTemperature() - .getShortTemperature(unit) + "" + .getShortTemperature(context, unit) + "" ); } return subtitle; } - private static String replaceNighttimeDegreeTemperatureSubtitle(@NonNull String subtitle, @NonNull Weather weather, + private static String replaceNighttimeDegreeTemperatureSubtitle(Context context, + @NonNull String subtitle, + @NonNull Weather weather, TemperatureUnit unit) { for (int i = 0; i < SUBTITLE_DAILY_ITEM_LENGTH; i ++) { subtitle = subtitle.replace( @@ -408,17 +459,20 @@ private static String replaceNighttimeDegreeTemperatureSubtitle(@NonNull String .get(i) .night() .getTemperature() - .getShortTemperature(unit) + "" + .getShortTemperature(context, unit) + "" ); } return subtitle; } - private static String replaceDaytimePrecipitationSubtitle(@NonNull String subtitle, @NonNull Weather weather) { + private static String replaceDaytimePrecipitationSubtitle(Context context, + @NonNull String subtitle, + @NonNull Weather weather) { for (int i = 0; i < SUBTITLE_DAILY_ITEM_LENGTH; i ++) { subtitle = subtitle.replace( "$" + i + "dp$", ProbabilityUnit.PERCENT.getProbabilityText( + context, WidgetUtils.getNonNullValue( weather.getDailyForecast() .get(i) @@ -433,11 +487,14 @@ private static String replaceDaytimePrecipitationSubtitle(@NonNull String subtit return subtitle; } - private static String replaceNighttimePrecipitationSubtitle(@NonNull String subtitle, @NonNull Weather weather) { + private static String replaceNighttimePrecipitationSubtitle(Context context, + @NonNull String subtitle, + @NonNull Weather weather) { for (int i = 0; i < SUBTITLE_DAILY_ITEM_LENGTH; i ++) { subtitle = subtitle.replace( "$" + i + "np$", ProbabilityUnit.PERCENT.getProbabilityText( + context, WidgetUtils.getNonNullValue( weather.getDailyForecast() .get(i) diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayDetailsWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayDetailsWidgetIMP.java index 8e9f2d29a..95959ac39 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayDetailsWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayDetailsWidgetIMP.java @@ -97,12 +97,13 @@ public static RemoteViews getRemoteViews(Context context, R.id.widget_clock_day_subtitle, location.getCityName(context) + " " - + weather.getCurrent().getTemperature().getTemperature(temperatureUnit) + + weather.getCurrent().getTemperature().getTemperature(context, temperatureUnit) ); views.setTextViewText( R.id.widget_clock_day_todayTemp, context.getString(R.string.today) + " " + Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), temperatureUnit @@ -113,7 +114,7 @@ public static RemoteViews getRemoteViews(Context context, R.id.widget_clock_day_sensibleTemp, context.getString(R.string.feels_like) + " " - + weather.getCurrent().getTemperature().getRealFeelTemperature(temperatureUnit) + + weather.getCurrent().getTemperature().getRealFeelTemperature(context, temperatureUnit) ); views.setTextViewText( diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayHorizontalWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayHorizontalWidgetIMP.java index e6b913412..a65846630 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayHorizontalWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayHorizontalWidgetIMP.java @@ -94,7 +94,7 @@ public static RemoteViews getRemoteViews(Context context, R.id.widget_clock_day_subtitle, location.getCityName(context) + " " - + weather.getCurrent().getTemperature().getTemperature(temperatureUnit) + + weather.getCurrent().getTemperature().getTemperature(context, temperatureUnit) ); views.setTextColor(R.id.widget_clock_day_clock_light, textColorInt); diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayVerticalWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayVerticalWidgetIMP.java index a500205d2..89237086f 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayVerticalWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayVerticalWidgetIMP.java @@ -146,7 +146,7 @@ private static RemoteViews buildWidgetViewDayPart(Context context, Location loca ); views.setTextViewText( R.id.widget_clock_day_subtitle, - getSubtitleText(weather, viewStyle, temperatureUnit) + getSubtitleText(context, weather, viewStyle, temperatureUnit) ); views.setTextViewText( R.id.widget_clock_day_time, @@ -262,18 +262,18 @@ private static String getTitleText(Context context, Location location, } switch (viewStyle) { case "rectangle": - return WidgetUtils.buildWidgetDayStyleText(weather, unit)[0]; + return WidgetUtils.buildWidgetDayStyleText(context, weather, unit)[0]; case "symmetry": return location.getCityName(context) + "\n" - + weather.getCurrent().getTemperature().getTemperature(unit); + + weather.getCurrent().getTemperature().getTemperature(context, unit); case "vertical": case "tile": return weather.getCurrent().getWeatherText() + " " - + weather.getCurrent().getTemperature().getTemperature(unit); + + weather.getCurrent().getTemperature().getTemperature(context, unit); case "mini": return weather.getCurrent().getWeatherText(); @@ -281,13 +281,15 @@ private static String getTitleText(Context context, Location location, return ""; } - private static String getSubtitleText(Weather weather, String viewStyle, TemperatureUnit unit) { + private static String getSubtitleText(Context context, Weather weather, String viewStyle, + TemperatureUnit unit) { switch (viewStyle) { case "rectangle": - return WidgetUtils.buildWidgetDayStyleText(weather, unit)[1]; + return WidgetUtils.buildWidgetDayStyleText(context, weather, unit)[1]; case "symmetry": return weather.getCurrent().getWeatherText() + "\n" + Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), unit @@ -295,13 +297,14 @@ private static String getSubtitleText(Weather weather, String viewStyle, Tempera case "tile": return Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), unit ); case "mini": - return weather.getCurrent().getTemperature().getTemperature(unit); + return weather.getCurrent().getTemperature().getTemperature(context, unit); } return ""; } @@ -372,7 +375,7 @@ private static String getTimeText(Context context, Location location, case "sensible_time": return context.getString(R.string.feels_like) + " " - + weather.getCurrent().getTemperature().getRealFeelTemperature(unit); + + weather.getCurrent().getTemperature().getRealFeelTemperature(context, unit); } return getCustomSubtitle(context, subtitleData, location, weather); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayWeekWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayWeekWidgetIMP.java index 0bea40aeb..5efa6d46f 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayWeekWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/ClockDayWeekWidgetIMP.java @@ -97,7 +97,7 @@ public static RemoteViews getRemoteViews(Context context, R.id.widget_clock_day_week_subtitle, location.getCityName(context) + " " - + weather.getCurrent().getTemperature().getTemperature(temperatureUnit) + + weather.getCurrent().getTemperature().getTemperature(context, temperatureUnit) ); views.setTextViewText( @@ -123,23 +123,23 @@ public static RemoteViews getRemoteViews(Context context, views.setTextViewText( R.id.widget_clock_day_week_temp_1, - getTemp(weather, 0, temperatureUnit) + getTemp(context, weather, 0, temperatureUnit) ); views.setTextViewText( R.id.widget_clock_day_week_temp_2, - getTemp(weather, 1, temperatureUnit) + getTemp(context, weather, 1, temperatureUnit) ); views.setTextViewText( R.id.widget_clock_day_week_temp_3, - getTemp(weather, 2, temperatureUnit) + getTemp(context, weather, 2, temperatureUnit) ); views.setTextViewText( R.id.widget_clock_day_week_temp_4, - getTemp(weather, 3, temperatureUnit) + getTemp(context, weather, 3, temperatureUnit) ); views.setTextViewText( R.id.widget_clock_day_week_temp_5, - getTemp(weather, 4, temperatureUnit) + getTemp(context, weather, 4, temperatureUnit) ); boolean weekIconDaytime = isWeekIconDaytime(weekIconMode, dayTime); @@ -279,8 +279,9 @@ public static boolean isEnable(Context context) { return widgetIds != null && widgetIds.length > 0; } - private static String getTemp(Weather weather, int index, TemperatureUnit unit) { + private static String getTemp(Context context, Weather weather, int index, TemperatureUnit unit) { return Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(index).night().getTemperature().getTemperature(), weather.getDailyForecast().get(index).day().getTemperature().getTemperature(), unit diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DailyTrendWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DailyTrendWidgetIMP.java index 91343faa6..b2978ccaa 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DailyTrendWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DailyTrendWidgetIMP.java @@ -170,8 +170,8 @@ private static View getDrawableView(Context context, Location location, items[i].getTrendItemView().setData( buildTemperatureArrayForItem(daytimeTemperatures, i), buildTemperatureArrayForItem(nighttimeTemperatures, i), - daily.day().getTemperature().getShortTemperature(temperatureUnit), - daily.night().getTemperature().getShortTemperature(temperatureUnit), + daily.day().getTemperature().getShortTemperature(context, temperatureUnit), + daily.night().getTemperature().getShortTemperature(context, temperatureUnit), (float) highestTemperature, (float) lowestTemperature, p < 5 ? null : p, diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWeekWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWeekWidgetIMP.java index 6394b7a4b..294473dee 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWeekWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWeekWidgetIMP.java @@ -111,23 +111,23 @@ public static RemoteViews getRemoteViews(Context context, Location location, views.setTextViewText( R.id.widget_day_week_temp_1, - getTemp(weather, 0, temperatureUnit) + getTemp(context, weather, 0, temperatureUnit) ); views.setTextViewText( R.id.widget_day_week_temp_2, - getTemp(weather, 1, temperatureUnit) + getTemp(context, weather, 1, temperatureUnit) ); views.setTextViewText( R.id.widget_day_week_temp_3, - getTemp(weather, 2, temperatureUnit) + getTemp(context, weather, 2, temperatureUnit) ); views.setTextViewText( R.id.widget_day_week_temp_4, - getTemp(weather, 3, temperatureUnit) + getTemp(context, weather, 3, temperatureUnit) ); views.setTextViewText( R.id.widget_day_week_temp_5, - getTemp(weather, 4, temperatureUnit) + getTemp(context, weather, 4, temperatureUnit) ); boolean weekIconDaytime = isWeekIconDaytime(weekIconMode, dayTime); @@ -257,7 +257,7 @@ private static RemoteViews buildWidgetViewDayPart(Context context, ResourceProvi ); views.setTextViewText( R.id.widget_day_week_subtitle, - getSubtitleText(weather, viewStyle, temperatureUnit) + getSubtitleText(context, weather, viewStyle, temperatureUnit) ); views.setTextViewText( R.id.widget_day_week_time, @@ -300,28 +300,30 @@ private static String getTitleText(Context context, Location location, } switch (viewStyle) { case "rectangle": - return WidgetUtils.buildWidgetDayStyleText(weather, unit)[0]; + return WidgetUtils.buildWidgetDayStyleText(context, weather, unit)[0]; case "symmetry": return location.getCityName(context) + "\n" - + weather.getCurrent().getTemperature().getTemperature(unit); + + weather.getCurrent().getTemperature().getTemperature(context, unit); case "tile": return weather.getCurrent().getWeatherText() + " " - + weather.getCurrent().getTemperature().getTemperature(unit); + + weather.getCurrent().getTemperature().getTemperature(context, unit); } return ""; } - private static String getSubtitleText(Weather weather, String viewStyle, TemperatureUnit unit) { + private static String getSubtitleText(Context context, Weather weather, String viewStyle, + TemperatureUnit unit) { switch (viewStyle) { case "rectangle": - return WidgetUtils.buildWidgetDayStyleText(weather, unit)[1]; + return WidgetUtils.buildWidgetDayStyleText(context, weather, unit)[1]; case "tile": return Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), unit @@ -329,6 +331,7 @@ private static String getSubtitleText(Weather weather, String viewStyle, Tempera case "symmetry": return weather.getCurrent().getWeatherText() + "\n" + Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), unit @@ -404,13 +407,14 @@ private static String getTimeText(Context context, Location location, case "sensible_time": return context.getString(R.string.feels_like) + " " - + weather.getCurrent().getTemperature().getShortRealFeeTemperature(unit); + + weather.getCurrent().getTemperature().getShortRealFeeTemperature(context, unit); } return getCustomSubtitle(context, subtitleData, location, weather); } - private static String getTemp(Weather weather, int index, TemperatureUnit unit) { + private static String getTemp(Context context, Weather weather, int index, TemperatureUnit unit) { return Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(index).night().getTemperature().getTemperature(), weather.getDailyForecast().get(index).day().getTemperature().getTemperature(), unit diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWidgetIMP.java index 4e01a45d2..7f8d9002b 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/DayWidgetIMP.java @@ -178,7 +178,7 @@ private static RemoteViews buildWidgetView(Context context, Location location, } views.setTextViewText( R.id.widget_day_subtitle, - getSubtitleText(weather, viewStyle, temperatureUnit) + getSubtitleText(context, weather, viewStyle, temperatureUnit) ); if (!viewStyle.equals("pixel")) { views.setTextViewText( @@ -230,22 +230,22 @@ private static String getTitleText(Context context, Location location, } switch (viewStyle) { case "rectangle": - return WidgetUtils.buildWidgetDayStyleText(weather, unit)[0]; + return WidgetUtils.buildWidgetDayStyleText(context, weather, unit)[0]; case "symmetry": return location.getCityName(context) + "\n" - + weather.getCurrent().getTemperature().getTemperature(unit); + + weather.getCurrent().getTemperature().getTemperature(context, unit); case "tile": case "mini": return weather.getCurrent().getWeatherText() + " " - + weather.getCurrent().getTemperature().getTemperature(unit); + + weather.getCurrent().getTemperature().getTemperature(context, unit); case "nano": case "pixel": - return weather.getCurrent().getTemperature().getTemperature(unit); + return weather.getCurrent().getTemperature().getTemperature(context, unit); case "vertical": return String.valueOf( @@ -259,13 +259,14 @@ private static String getTitleText(Context context, Location location, return ""; } - private static String getSubtitleText(Weather weather, String viewStyle, TemperatureUnit unit) { + private static String getSubtitleText(Context context, Weather weather, String viewStyle, TemperatureUnit unit) { switch (viewStyle) { case "rectangle": - return WidgetUtils.buildWidgetDayStyleText(weather, unit)[1]; + return WidgetUtils.buildWidgetDayStyleText(context, weather, unit)[1]; case "tile": return Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), unit @@ -273,6 +274,7 @@ private static String getSubtitleText(Weather weather, String viewStyle, Tempera case "symmetry": return weather.getCurrent().getWeatherText() + "\n" + Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), unit @@ -280,16 +282,17 @@ private static String getSubtitleText(Weather weather, String viewStyle, Tempera case "vertical": return weather.getCurrent().getWeatherText() + " " + Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), unit ); case "oreo": - return weather.getCurrent().getTemperature().getTemperature(unit); + return weather.getCurrent().getTemperature().getTemperature(context, unit); case "oreo_google_sans": - return unit.getLongTemperatureText(weather.getCurrent().getTemperature().getTemperature()); + return unit.getLongTemperatureText(context, weather.getCurrent().getTemperature().getTemperature()); } return ""; } @@ -356,7 +359,7 @@ private static String getTimeText(Context context, Location location, Weather we case "sensible_time": return context.getString(R.string.feels_like) + " " - + weather.getCurrent().getTemperature().getShortRealFeeTemperature(unit); + + weather.getCurrent().getTemperature().getShortRealFeeTemperature(context, unit); } return getCustomSubtitle(context, subtitleData, location, weather); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/HourlyTrendWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/HourlyTrendWidgetIMP.java index 14a8bc406..66f83cc81 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/HourlyTrendWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/HourlyTrendWidgetIMP.java @@ -148,7 +148,7 @@ private static View getDrawableView(Context context, Location location, boolean items[i].getTrendItemView().setData( buildTemperatureArrayForItem(temperatures, i), null, - hourly.getTemperature().getShortTemperature(temperatureUnit), + hourly.getTemperature().getShortTemperature(context, temperatureUnit), null, (float) highestTemperature, (float) lowestTemperature, diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/MultiCityWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/MultiCityWidgetIMP.java index 4f4016cd1..c3e371349 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/MultiCityWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/MultiCityWidgetIMP.java @@ -95,6 +95,7 @@ public static RemoteViews getRemoteViews(Context context, views.setTextViewText( R.id.widget_multi_city_horizontal_content_1, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), temperatureUnit @@ -133,6 +134,7 @@ public static RemoteViews getRemoteViews(Context context, views.setTextViewText( R.id.widget_multi_city_horizontal_content_2, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), temperatureUnit @@ -174,6 +176,7 @@ public static RemoteViews getRemoteViews(Context context, views.setTextViewText( R.id.widget_multi_city_horizontal_content_3, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), temperatureUnit diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/TextWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/TextWidgetIMP.java index 5f6d73d3a..d5002e13d 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/TextWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/TextWidgetIMP.java @@ -64,7 +64,7 @@ public static RemoteViews getRemoteViews(Context context, Location location, ); views.setTextViewText( R.id.widget_text_temperature, - weather.getCurrent().getTemperature().getShortTemperature(temperatureUnit) + weather.getCurrent().getTemperature().getShortTemperature(context, temperatureUnit) ); views.setTextColor(R.id.widget_text_date, textColorInt); diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/WeekWidgetIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/WeekWidgetIMP.java index 577e6e5cb..bb7a433d8 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/WeekWidgetIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/WeekWidgetIMP.java @@ -92,19 +92,19 @@ public static RemoteViews getRemoteViews(Context context, Location location, views.setTextViewText( R.id.widget_week_temp_1, - getTemp(weather, 0, temperatureUnit)); + getTemp(context, weather, 0, temperatureUnit)); views.setTextViewText( R.id.widget_week_temp_2, - getTemp(weather, 1, temperatureUnit)); + getTemp(context, weather, 1, temperatureUnit)); views.setTextViewText( R.id.widget_week_temp_3, - getTemp(weather, 2, temperatureUnit)); + getTemp(context, weather, 2, temperatureUnit)); views.setTextViewText( R.id.widget_week_temp_4, - getTemp(weather, 3, temperatureUnit)); + getTemp(context, weather, 3, temperatureUnit)); views.setTextViewText( R.id.widget_week_temp_5, - getTemp(weather, 4, temperatureUnit)); + getTemp(context, weather, 4, temperatureUnit)); boolean weekIconDaytime = isWeekIconDaytime(weekIconMode, dayTime); views.setImageViewUri( @@ -190,8 +190,9 @@ public static boolean isEnable(Context context) { return widgetIds != null && widgetIds.length > 0; } - private static String getTemp(Weather weather, int index, TemperatureUnit unit) { + private static String getTemp(Context context, Weather weather, int index, TemperatureUnit unit) { return Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(index).night().getTemperature().getTemperature(), weather.getDailyForecast().get(index).day().getTemperature().getTemperature(), unit diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/ForecastNotificationIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/ForecastNotificationIMP.java index 1d35156a9..5645e6941 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/ForecastNotificationIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/ForecastNotificationIMP.java @@ -105,18 +105,18 @@ public static void buildForecastAndSendIt(Context context, Location location, bo if (today) { builder.setContentTitle(context.getString(R.string.day) + " " + weather.getDailyForecast().get(0).day().getWeatherText() - + " " + weather.getDailyForecast().get(0).day().getTemperature().getTemperature(temperatureUnit) + + " " + weather.getDailyForecast().get(0).day().getTemperature().getTemperature(context, temperatureUnit) ).setContentText(context.getString(R.string.night) + " " + weather.getDailyForecast().get(0).night().getWeatherText() - + " " + weather.getDailyForecast().get(0).night().getTemperature().getTemperature(temperatureUnit) + + " " + weather.getDailyForecast().get(0).night().getTemperature().getTemperature(context, temperatureUnit) ); } else { builder.setContentTitle(context.getString(R.string.day) + " " + weather.getDailyForecast().get(1).day().getWeatherText() - + " " + weather.getDailyForecast().get(0).day().getTemperature().getTemperature(temperatureUnit) + + " " + weather.getDailyForecast().get(0).day().getTemperature().getTemperature(context, temperatureUnit) ).setContentText(context.getString(R.string.night) + " " + weather.getDailyForecast().get(1).night().getWeatherText() - + " " + weather.getDailyForecast().get(1).night().getTemperature().getTemperature(temperatureUnit) + + " " + weather.getDailyForecast().get(1).night().getTemperature().getTemperature(context, temperatureUnit) ); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NativeNormalNotificationIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NativeNormalNotificationIMP.java index d8bbc2002..022c09ed9 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NativeNormalNotificationIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NativeNormalNotificationIMP.java @@ -119,7 +119,7 @@ static void buildNotificationAndSendIt(Context context, Location location, StringBuilder content = new StringBuilder(); if (!tempIcon) { - content.append(weather.getCurrent().getTemperature().getTemperature(temperatureUnit)) + content.append(weather.getCurrent().getTemperature().getTemperature(context, temperatureUnit)) .append(" "); } content.append(weather.getCurrent().getWeatherText()); diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NormalNotificationIMP.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NormalNotificationIMP.java index a4cddaf3f..332c31bf8 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NormalNotificationIMP.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/presenter/notification/NormalNotificationIMP.java @@ -226,6 +226,7 @@ private static RemoteViews buildBaseView(Context context, RemoteViews views, views.setTextViewText( R.id.notification_base_realtimeTemp, Temperature.getShortTemperature( + context, weather.getCurrent().getTemperature().getTemperature(), temperatureUnit ) @@ -313,6 +314,7 @@ private static RemoteViews buildBigView(Context context, RemoteViews views, views.setTextViewText( // set temps 1. R.id.notification_big_temp_1, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(0).night().getTemperature().getTemperature(), weather.getDailyForecast().get(0).day().getTemperature().getTemperature(), temperatureUnit @@ -336,6 +338,7 @@ private static RemoteViews buildBigView(Context context, RemoteViews views, views.setTextViewText( // set temps 2. R.id.notification_big_temp_2, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(1).night().getTemperature().getTemperature(), weather.getDailyForecast().get(1).day().getTemperature().getTemperature(), temperatureUnit @@ -359,6 +362,7 @@ private static RemoteViews buildBigView(Context context, RemoteViews views, views.setTextViewText( // set temps 3. R.id.notification_big_temp_3, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(2).night().getTemperature().getTemperature(), weather.getDailyForecast().get(2).day().getTemperature().getTemperature(), temperatureUnit @@ -382,6 +386,7 @@ private static RemoteViews buildBigView(Context context, RemoteViews views, views.setTextViewText( // set temps 4. R.id.notification_big_temp_4, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(3).night().getTemperature().getTemperature(), weather.getDailyForecast().get(3).day().getTemperature().getTemperature(), temperatureUnit @@ -405,6 +410,7 @@ private static RemoteViews buildBigView(Context context, RemoteViews views, views.setTextViewText( // set temps 5. R.id.notification_big_temp_5, Temperature.getTrendTemperature( + context, weather.getDailyForecast().get(4).night().getTemperature().getTemperature(), weather.getDailyForecast().get(4).day().getTemperature().getTemperature(), temperatureUnit diff --git a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/trend/TrendLinearLayout.java b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/trend/TrendLinearLayout.java index 2f96d0240..c63e396d2 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/remoteviews/trend/TrendLinearLayout.java +++ b/app/src/main/java/wangdaye/com/geometricweather/remoteviews/trend/TrendLinearLayout.java @@ -106,13 +106,13 @@ public void onDraw(Canvas canvas) { paint.setTextAlign(Paint.Align.LEFT); paint.setColor(textColor); canvas.drawText( - Temperature.getShortTemperature(historyTemps[0], unit), + Temperature.getShortTemperature(getContext(), historyTemps[0], unit), 2 * MARGIN_TEXT, historyTempYs[0] - paint.getFontMetrics().bottom - MARGIN_TEXT, paint ); canvas.drawText( - Temperature.getShortTemperature(historyTemps[1], unit), + Temperature.getShortTemperature(getContext(), historyTemps[1], unit), 2 * MARGIN_TEXT, historyTempYs[1] - paint.getFontMetrics().top + MARGIN_TEXT, paint diff --git a/app/src/main/java/wangdaye/com/geometricweather/settings/SettingsOptionManager.java b/app/src/main/java/wangdaye/com/geometricweather/settings/SettingsOptionManager.java index df28c6aa5..5f9461c7f 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/settings/SettingsOptionManager.java +++ b/app/src/main/java/wangdaye/com/geometricweather/settings/SettingsOptionManager.java @@ -11,6 +11,7 @@ import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.model.option.WidgetWeekIconMode; +import wangdaye.com.geometricweather.basic.model.option.appearance.DailyTrendDisplay; import wangdaye.com.geometricweather.basic.model.option.utils.OptionMapper; import wangdaye.com.geometricweather.basic.model.option.appearance.CardDisplay; import wangdaye.com.geometricweather.basic.model.option.appearance.Language; @@ -70,7 +71,15 @@ public static SettingsOptionManager getInstance(Context context) { + "&allergen" + "&sunrise_sunset" + "&life_details"; + private List dailyTrendDisplayList; + private static final String DEFAULT_DAILY_TREND_DISPLAY = "temperature" + + "&air_quality" + + "&wind" + + "&uv_index" + + "&precipitation"; + private boolean trendHorizontalLinesEnabled; + private boolean exchangeDayNightTempEnabled; private boolean gravitySensorEnabled; private boolean listAnimationEnabled; private boolean itemAnimationEnabled; @@ -178,6 +187,19 @@ private SettingsOptionManager(Context context) { sharedPreferences.getString(context.getString(R.string.key_card_display), DEFAULT_CARD_DISPLAY) ); + dailyTrendDisplayList = OptionMapper.getDailyTrendDisplayList( + sharedPreferences.getString( + context.getString(R.string.key_daily_trend_display), + DEFAULT_DAILY_TREND_DISPLAY + ) + ); + + trendHorizontalLinesEnabled = sharedPreferences.getBoolean( + context.getString(R.string.key_trend_horizontal_line_switch), true); + + exchangeDayNightTempEnabled = sharedPreferences.getBoolean( + context.getString(R.string.key_exchange_day_night_temp_switch), false); + gravitySensorEnabled = sharedPreferences.getBoolean( context.getString(R.string.key_gravity_sensor_switch), true); @@ -380,6 +402,30 @@ public void setCardDisplayList(List cardDisplayList) { this.cardDisplayList = cardDisplayList; } + public List getDailyTrendDisplayList() { + return dailyTrendDisplayList; + } + + public void setDailyTrendDisplayList(List dailyTrendDisplayList) { + this.dailyTrendDisplayList = dailyTrendDisplayList; + } + + public boolean isTrendHorizontalLinesEnabled() { + return trendHorizontalLinesEnabled; + } + + public void setTrendHorizontalLinesEnabled(boolean trendHorizontalLinesEnabled) { + this.trendHorizontalLinesEnabled = trendHorizontalLinesEnabled; + } + + public boolean isExchangeDayNightTempEnabled() { + return exchangeDayNightTempEnabled; + } + + public void setExchangeDayNightTempEnabled(boolean exchangeDayNightTempEnabled) { + this.exchangeDayNightTempEnabled = exchangeDayNightTempEnabled; + } + public boolean isGravitySensorEnabled() { return gravitySensorEnabled; } diff --git a/app/src/main/java/wangdaye/com/geometricweather/settings/activity/DailyTrendDisplayManageActivity.java b/app/src/main/java/wangdaye/com/geometricweather/settings/activity/DailyTrendDisplayManageActivity.java new file mode 100644 index 000000000..ac312b6cd --- /dev/null +++ b/app/src/main/java/wangdaye/com/geometricweather/settings/activity/DailyTrendDisplayManageActivity.java @@ -0,0 +1,229 @@ +package wangdaye.com.geometricweather.settings.activity; + +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.annotation.SuppressLint; +import android.graphics.Canvas; +import android.os.Build; +import android.os.Bundle; +import android.view.View; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import wangdaye.com.geometricweather.R; +import wangdaye.com.geometricweather.basic.GeoActivity; +import wangdaye.com.geometricweather.basic.model.option.appearance.DailyTrendDisplay; +import wangdaye.com.geometricweather.basic.model.option.utils.OptionMapper; +import wangdaye.com.geometricweather.databinding.ActivityDailyTrendDisplayManageBinding; +import wangdaye.com.geometricweather.settings.SettingsOptionManager; +import wangdaye.com.geometricweather.settings.adapter.DailyTrendDisplayAdapter; +import wangdaye.com.geometricweather.ui.adapter.TagAdapter; +import wangdaye.com.geometricweather.ui.decotarion.GridMarginsDecoration; +import wangdaye.com.geometricweather.ui.decotarion.ListDecoration; + +public class DailyTrendDisplayManageActivity extends GeoActivity { + + ActivityDailyTrendDisplayManageBinding binding; + private DailyTrendDisplayAdapter dailyTrendDisplayAdapter; + private TagAdapter tagAdapter; + + private @Nullable AnimatorSet bottomAnimator; + private @Nullable Boolean bottomBarVisibility; + + private class DailyTrendTag implements TagAdapter.Tag { + + DailyTrendDisplay tag; + + DailyTrendTag(DailyTrendDisplay tag) { + this.tag = tag; + } + + @Override + public String getName() { + return tag.getTagName(DailyTrendDisplayManageActivity.this); + } + } + + private class CardDisplaySwipeCallback extends ItemTouchHelper.SimpleCallback { + + CardDisplaySwipeCallback(int dragDirs, int swipeDirs) { + super(dragDirs, swipeDirs); + } + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, + @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + setResult(RESULT_OK); + + int fromPosition = viewHolder.getAdapterPosition(); + int toPosition = target.getAdapterPosition(); + + dailyTrendDisplayAdapter.moveItem(fromPosition, toPosition); + ((DailyTrendDisplayAdapter.ViewHolder) viewHolder).drawDrag(DailyTrendDisplayManageActivity.this, false); + return true; + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + setResult(RESULT_OK); + dailyTrendDisplayAdapter.removeItem(viewHolder.getAdapterPosition()); + } + + @Override + public void onChildDraw(@NonNull Canvas c, + @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, + float dX, float dY, int actionState, boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + switch (actionState) { + case ItemTouchHelper.ACTION_STATE_SWIPE: + ((DailyTrendDisplayAdapter.ViewHolder) viewHolder).drawSwipe(dX); + break; + + case ItemTouchHelper.ACTION_STATE_DRAG: + ((DailyTrendDisplayAdapter.ViewHolder) viewHolder) + .drawDrag(DailyTrendDisplayManageActivity.this, dY != 0); + break; + + case ItemTouchHelper.ACTION_STATE_IDLE: + ((DailyTrendDisplayAdapter.ViewHolder) viewHolder) + .drawSwipe(0) + .drawDrag(DailyTrendDisplayManageActivity.this, false); + break; + } + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.binding = ActivityDailyTrendDisplayManageBinding.inflate(getLayoutInflater()); + this.setContentView(binding.getRoot()); + + binding.toolbar.setNavigationIcon(R.drawable.ic_toolbar_back); + binding.toolbar.setNavigationOnClickListener(view -> finish()); + + List displayTags + = SettingsOptionManager.getInstance(this).getDailyTrendDisplayList(); + dailyTrendDisplayAdapter = new DailyTrendDisplayAdapter(displayTags, dailyTrendDisplay -> { + setResult(RESULT_OK); + tagAdapter.insertItem(new DailyTrendTag(dailyTrendDisplay)); + resetBottomBarVisibility(); + }); + + binding.recyclerView.setLayoutManager(new LinearLayoutManager(this)); + binding.recyclerView.addItemDecoration(new ListDecoration(this)); + binding.recyclerView.setAdapter(dailyTrendDisplayAdapter); + + new ItemTouchHelper( + new CardDisplaySwipeCallback( + ItemTouchHelper.UP | ItemTouchHelper.DOWN, + ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT + ) + ).attachToRecyclerView(binding.recyclerView); + + List otherTags = new ArrayList<>(); + otherTags.add(DailyTrendDisplay.TAG_TEMPERATURE); + otherTags.add(DailyTrendDisplay.TAG_AIR_QUALITY); + otherTags.add(DailyTrendDisplay.TAG_WIND); + otherTags.add(DailyTrendDisplay.TAG_UV_INDEX); + otherTags.add(DailyTrendDisplay.TAG_PRECIPITATION); + for (int i = otherTags.size() - 1; i >= 0; i --) { + for (int j = 0; j < displayTags.size(); j ++) { + if (otherTags.get(i) == displayTags.get(j)) { + otherTags.remove(i); + break; + } + } + } + List tagList = new ArrayList<>(); + for (DailyTrendDisplay tag : otherTags) { + tagList.add(new DailyTrendTag(tag)); + } + tagAdapter = new TagAdapter(this, tagList, (checked, oldPosition, newPosition) -> { + setResult(RESULT_OK); + DailyTrendTag tag = (DailyTrendTag) tagAdapter.removeItem(newPosition); + dailyTrendDisplayAdapter.insertItem(tag.tag); + resetBottomBarVisibility(); + return true; + }); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { + binding.bottomBar.setOnApplyWindowInsetsListener((v, insets) -> { + binding.bottomBar.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; + }); + } + + binding.bottomRecyclerView.setLayoutManager( + new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)); + binding.bottomRecyclerView.addItemDecoration( + new GridMarginsDecoration( + getResources().getDimension(R.dimen.normal_margin), binding.bottomRecyclerView + ) + ); + binding.bottomRecyclerView.setAdapter(tagAdapter); + + bottomAnimator = null; + bottomBarVisibility = false; + binding.bottomRecyclerView.post(this::resetBottomBarVisibility); + } + + @Override + protected void onStop() { + super.onStop(); + PreferenceManager.getDefaultSharedPreferences(this) + .edit() + .putString( + getString(R.string.key_daily_trend_display), + OptionMapper.getDailyTrendDisplayValue(dailyTrendDisplayAdapter.getDailyTrendDisplayList()) + ).apply(); + SettingsOptionManager.getInstance(this).setDailyTrendDisplayList( + dailyTrendDisplayAdapter.getDailyTrendDisplayList()); + } + + @Override + public View getSnackbarContainer() { + return binding.container; + } + + @SuppressLint("MissingSuperCall") + @Override + protected void onSaveInstanceState(@NotNull Bundle outState) { + // do nothing. + } + + private void resetBottomBarVisibility() { + boolean visible = tagAdapter.getItemCount() != 0; + if (bottomBarVisibility == null || bottomBarVisibility != visible) { + bottomBarVisibility = visible; + + if (bottomAnimator != null) { + bottomAnimator.cancel(); + } + bottomAnimator = new AnimatorSet(); + bottomAnimator.playTogether( + ObjectAnimator.ofFloat(binding.bottomBar, "alpha", + binding.bottomBar.getAlpha(), visible ? 1 : 0), + ObjectAnimator.ofFloat(binding.bottomBar, "translationY", + binding.bottomBar.getTranslationY(), visible ? 0 : binding.bottomBar.getMeasuredHeight()) + ); + bottomAnimator.setDuration(visible ? 350 : 150); + bottomAnimator.setInterpolator(visible + ? new DecelerateInterpolator(2f) + : new AccelerateInterpolator(2f)); + bottomAnimator.start(); + } + } +} diff --git a/app/src/main/java/wangdaye/com/geometricweather/settings/adapter/DailyTrendDisplayAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/settings/adapter/DailyTrendDisplayAdapter.java new file mode 100644 index 000000000..2e211dde6 --- /dev/null +++ b/app/src/main/java/wangdaye/com/geometricweather/settings/adapter/DailyTrendDisplayAdapter.java @@ -0,0 +1,114 @@ +package wangdaye.com.geometricweather.settings.adapter; + +import android.content.Context; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +import wangdaye.com.geometricweather.R; +import wangdaye.com.geometricweather.basic.model.option.appearance.DailyTrendDisplay; +import wangdaye.com.geometricweather.utils.DisplayUtils; + +public class DailyTrendDisplayAdapter extends RecyclerView.Adapter { + + private List dailyTrendDisplayList; + private OnItemRemoveListener listener; + + public class ViewHolder extends RecyclerView.ViewHolder { + + RelativeLayout container; + AppCompatImageView deleteImageLeft; + AppCompatImageView deleteImageRight; + RelativeLayout item; + TextView title; + ImageButton deleteButton; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + container = itemView.findViewById(R.id.item_card_display_container); + deleteImageLeft = itemView.findViewById(R.id.item_card_display_deleteIconLeft); + deleteImageRight = itemView.findViewById(R.id.item_card_display_deleteIconRight); + item = itemView.findViewById(R.id.item_card_display); + title = itemView.findViewById(R.id.item_card_display_title); + deleteButton = itemView.findViewById(R.id.item_card_display_deleteBtn); + deleteButton.setOnClickListener(v -> removeItem(getAdapterPosition())); + } + + void onBindView(DailyTrendDisplay dailyTrendDisplay) { + title.setText(dailyTrendDisplay.getTagName(title.getContext())); + drawSwipe(0); + drawDrag(title.getContext(), false); + } + + public ViewHolder drawDrag(Context context, boolean elevate) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + container.setElevation(DisplayUtils.dpToPx(context, elevate ? 10 : 0)); + } + return this; + } + + public ViewHolder drawSwipe(float dX) { + container.setTranslationX(0); + item.setTranslationX(dX); + deleteImageLeft.setTranslationX((float) Math.min(0.5 * (dX - deleteImageLeft.getMeasuredWidth()), 0)); + deleteImageRight.setTranslationX((float) Math.max(0.5 * (dX + deleteImageRight.getMeasuredWidth()), 0)); + return this; + } + } + + public DailyTrendDisplayAdapter(List dailyTrendDisplayList, OnItemRemoveListener listener) { + this.dailyTrendDisplayList = dailyTrendDisplayList; + this.listener = listener; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate( + R.layout.item_card_display, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.onBindView(dailyTrendDisplayList.get(position)); + } + + @Override + public int getItemCount() { + return dailyTrendDisplayList.size(); + } + + public List getDailyTrendDisplayList() { + return dailyTrendDisplayList; + } + + public void insertItem(DailyTrendDisplay dailyTrendDisplay) { + dailyTrendDisplayList.add(dailyTrendDisplay); + notifyItemInserted(dailyTrendDisplayList.size() - 1); + } + + public void removeItem(int adapterPosition) { + DailyTrendDisplay dailyTrendDisplay = dailyTrendDisplayList.remove(adapterPosition); + notifyItemRemoved(adapterPosition); + listener.onRemoved(dailyTrendDisplay); + } + + public void moveItem(int fromPosition, int toPosition) { + dailyTrendDisplayList.add(toPosition, dailyTrendDisplayList.remove(fromPosition)); + notifyItemMoved(fromPosition, toPosition); + } + + public interface OnItemRemoveListener { + void onRemoved(DailyTrendDisplay dailyTrendDisplay); + } +} diff --git a/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/AppearanceSettingsFragment.java b/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/AppearanceSettingsFragment.java index 987ac31ec..c4dd8ad67 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/AppearanceSettingsFragment.java +++ b/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/AppearanceSettingsFragment.java @@ -8,6 +8,7 @@ import wangdaye.com.geometricweather.GeometricWeather; import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.GeoActivity; +import wangdaye.com.geometricweather.basic.model.weather.Temperature; import wangdaye.com.geometricweather.resource.provider.ResourcesProviderFactory; import wangdaye.com.geometricweather.basic.model.option.utils.OptionMapper; import wangdaye.com.geometricweather.settings.SettingsOptionManager; @@ -45,6 +46,36 @@ public void onCreate(Bundle savedInstanceState) { initIconProviderPreference(); // set card display preference in onStart(). + // set daily trend display preference in onStart(). + + // horizontal lines in trend. + findPreference(getString(R.string.key_trend_horizontal_line_switch)).setOnPreferenceChangeListener((preference, newValue) -> { + getSettingsOptionManager().setTrendHorizontalLinesEnabled((Boolean) newValue); + return true; + }); + + // exchange day night temperature. + Preference exchangeDayNightTemperature = findPreference(getString(R.string.key_exchange_day_night_temp_switch)); + exchangeDayNightTemperature.setSummary( + Temperature.getTrendTemperature( + requireActivity(), + 3, + 7, + SettingsOptionManager.getInstance(requireActivity()).getTemperatureUnit() + ) + ); + exchangeDayNightTemperature.setOnPreferenceChangeListener((preference, newValue) -> { + getSettingsOptionManager().setExchangeDayNightTempEnabled((Boolean) newValue); + preference.setSummary( + Temperature.getTrendTemperature( + requireActivity(), + 3, + 7, + SettingsOptionManager.getInstance(requireActivity()).getTemperatureUnit() + ) + ); + return true; + }); // sensor. findPreference(getString(R.string.key_gravity_sensor_switch)).setOnPreferenceChangeListener((preference, newValue) -> { @@ -94,6 +125,17 @@ public void onStart() { IntentHelper.startCardDisplayManageActivityForResult(requireActivity(), 0); return true; }); + + // daily trend display. + Preference dailyTrendDisplay = findPreference(getString(R.string.key_daily_trend_display)); + dailyTrendDisplay.setSummary(OptionMapper.getDailyTrendDisplaySummary( + getActivity(), + SettingsOptionManager.getInstance(getActivity()).getDailyTrendDisplayList() + )); + dailyTrendDisplay.setOnPreferenceClickListener(preference -> { + IntentHelper.startDailyTrendDisplayManageActivityForResult(requireActivity(), 1); + return true; + }); } @Override diff --git a/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/SettingsFragment.java b/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/SettingsFragment.java index 0cb865a47..a44133d17 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/SettingsFragment.java +++ b/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/SettingsFragment.java @@ -1,5 +1,6 @@ package wangdaye.com.geometricweather.settings.fragment; +import android.content.Intent; import android.os.Build; import android.os.Bundle; @@ -12,6 +13,28 @@ import wangdaye.com.geometricweather.basic.GeoActivity; import wangdaye.com.geometricweather.basic.model.option.NotificationStyle; import wangdaye.com.geometricweather.basic.model.option.utils.OptionMapper; +import wangdaye.com.geometricweather.remoteviews.config.ClockDayDetailsWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.ClockDayHorizontalWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.ClockDayVerticalWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.ClockDayWeekWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.DailyTrendWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.DayWeekWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.DayWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.HourlyTrendWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.MultiCityWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.TextWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.config.WeekWidgetConfigActivity; +import wangdaye.com.geometricweather.remoteviews.presenter.ClockDayDetailsWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.ClockDayHorizontalWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.ClockDayVerticalWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.ClockDayWeekWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.DailyTrendWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.DayWeekWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.DayWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.HourlyTrendWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.MultiCityWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.TextWidgetIMP; +import wangdaye.com.geometricweather.remoteviews.presenter.WeekWidgetIMP; import wangdaye.com.geometricweather.settings.dialog.RunningInBackgroundDialog; import wangdaye.com.geometricweather.settings.dialog.RunningInBackgroundODialog; import wangdaye.com.geometricweather.settings.dialog.TimeSetterDialog; @@ -199,6 +222,94 @@ private void initWidgetPart() { PollingManager.resetNormalBackgroundTask(requireActivity(), true); return true; }); + + // day. + Preference day = findPreference(getString(R.string.key_widget_day)); + day.setVisible(DayWidgetIMP.isEnable(requireActivity())); + day.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), DayWidgetConfigActivity.class)); + return true; + }); + + // week. + Preference week = findPreference(getString(R.string.key_widget_week)); + week.setVisible(WeekWidgetIMP.isEnable(requireActivity())); + week.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), WeekWidgetConfigActivity.class)); + return true; + }); + + // day + week. + Preference dayWeek = findPreference(getString(R.string.key_widget_day_week)); + dayWeek.setVisible(DayWeekWidgetIMP.isEnable(requireActivity())); + dayWeek.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), DayWeekWidgetConfigActivity.class)); + return true; + }); + + // clock + day (horizontal). + Preference clockDayHorizontal = findPreference(getString(R.string.key_widget_clock_day_horizontal)); + clockDayHorizontal.setVisible(ClockDayHorizontalWidgetIMP.isEnable(requireActivity())); + clockDayHorizontal.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), ClockDayHorizontalWidgetConfigActivity.class)); + return true; + }); + + // clock + day (details). + Preference clockDayDetails = findPreference(getString(R.string.key_widget_clock_day_details)); + clockDayDetails.setVisible(ClockDayDetailsWidgetIMP.isEnable(requireActivity())); + clockDayDetails.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), ClockDayDetailsWidgetConfigActivity.class)); + return true; + }); + + // clock + day (vertical). + Preference clockDayVertical = findPreference(getString(R.string.key_widget_clock_day_vertical)); + clockDayVertical.setVisible(ClockDayVerticalWidgetIMP.isEnable(requireActivity())); + clockDayVertical.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), ClockDayVerticalWidgetConfigActivity.class)); + return true; + }); + + // clock + day + week. + Preference clockDayWeek = findPreference(getString(R.string.key_widget_clock_day_week)); + clockDayWeek.setVisible(ClockDayWeekWidgetIMP.isEnable(requireActivity())); + clockDayWeek.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), ClockDayWeekWidgetConfigActivity.class)); + return true; + }); + + // text. + Preference text = findPreference(getString(R.string.key_widget_text)); + text.setVisible(TextWidgetIMP.isEnable(requireActivity())); + text.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), TextWidgetConfigActivity.class)); + return true; + }); + + // daily trend. + Preference dailyTrend = findPreference(getString(R.string.key_widget_trend_daily)); + dailyTrend.setVisible(DailyTrendWidgetIMP.isEnable(requireActivity())); + dailyTrend.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), DailyTrendWidgetConfigActivity.class)); + return true; + }); + + // hourly trend. + Preference hourlyTrend = findPreference(getString(R.string.key_widget_trend_hourly)); + hourlyTrend.setVisible(HourlyTrendWidgetIMP.isEnable(requireActivity())); + hourlyTrend.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), HourlyTrendWidgetConfigActivity.class)); + return true; + }); + + // multi city. + Preference multiCity = findPreference(getString(R.string.key_widget_multi_city)); + multiCity.setVisible(MultiCityWidgetIMP.isEnable(requireActivity())); + multiCity.setOnPreferenceClickListener(preference -> { + startActivity(new Intent(requireActivity(), MultiCityWidgetConfigActivity.class)); + return true; + }); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/UnitSettingsFragment.java b/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/UnitSettingsFragment.java index 8c8115f21..35a8e62bd 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/UnitSettingsFragment.java +++ b/app/src/main/java/wangdaye/com/geometricweather/settings/fragment/UnitSettingsFragment.java @@ -22,10 +22,14 @@ public void onCreate(Bundle savedInstanceState) { // temperature. ListPreference temperature = findPreference(getString(R.string.key_temperature_unit)); - temperature.setSummary(getSettingsOptionManager().getTemperatureUnit().getAbbreviation()); + temperature.setSummary( + getSettingsOptionManager().getTemperatureUnit().getAbbreviation(requireActivity()) + ); temperature.setOnPreferenceChangeListener((p, newValue) -> { getSettingsOptionManager().setTemperatureUnit(OptionMapper.getTemperatureUnit((String) newValue)); - temperature.setSummary(getSettingsOptionManager().getTemperatureUnit().getAbbreviation()); + temperature.setSummary( + getSettingsOptionManager().getTemperatureUnit().getAbbreviation(requireActivity()) + ); SnackbarUtils.showSnackbar( (GeoActivity) requireActivity(), getString(R.string.feedback_refresh_ui_after_refresh)); return true; diff --git a/app/src/main/java/wangdaye/com/geometricweather/settings/model/AboutAppTranslator.java b/app/src/main/java/wangdaye/com/geometricweather/settings/model/AboutAppTranslator.java index 34ee41ea7..f1f635d4d 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/settings/model/AboutAppTranslator.java +++ b/app/src/main/java/wangdaye/com/geometricweather/settings/model/AboutAppTranslator.java @@ -128,6 +128,16 @@ public static List buildTranslatorList() { "istrios@gmail.com", R.drawable.flag_el )); + list.add(new AboutAppTranslator( + "이서경", + "ng0972@naver.com", + R.drawable.flag_ko + )); + list.add(new AboutAppTranslator( + "rikupin1105", + "https://github.com/rikupin1105", + R.drawable.flag_ja + )); return list; } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/activity/SearcActivity.java b/app/src/main/java/wangdaye/com/geometricweather/ui/activity/SearchActivity.java similarity index 71% rename from app/src/main/java/wangdaye/com/geometricweather/ui/activity/SearcActivity.java rename to app/src/main/java/wangdaye/com/geometricweather/ui/activity/SearchActivity.java index 2cc995673..3a25d244d 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/activity/SearcActivity.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/activity/SearchActivity.java @@ -11,7 +11,6 @@ import androidx.annotation.ColorInt; import androidx.annotation.NonNull; -import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.app.ActivityCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -23,12 +22,9 @@ import android.view.animation.Transformation; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; -import android.widget.RelativeLayout; import android.widget.TextView; -import com.github.rahatarmanahmed.cpv.CircularProgressView; import com.turingtechnologies.materialscrollbar.CustomIndicator; -import com.turingtechnologies.materialscrollbar.DragScrollBar; import java.util.ArrayList; import java.util.List; @@ -36,6 +32,7 @@ import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.GeoActivity; import wangdaye.com.geometricweather.basic.model.location.Location; +import wangdaye.com.geometricweather.databinding.ActivitySearchBinding; import wangdaye.com.geometricweather.utils.DisplayUtils; import wangdaye.com.geometricweather.utils.SnackbarUtils; import wangdaye.com.geometricweather.db.DatabaseHelper; @@ -47,16 +44,10 @@ * Search activity. * */ -public class SearcActivity extends GeoActivity - implements View.OnClickListener, EditText.OnEditorActionListener, - WeatherHelper.OnRequestLocationListener { +public class SearchActivity extends GeoActivity + implements EditText.OnEditorActionListener, WeatherHelper.OnRequestLocationListener { - private CoordinatorLayout container; - private RelativeLayout searchContainer; - private EditText editText; - - private RecyclerView recyclerView; - private CircularProgressView progressView; + private ActivitySearchBinding binding; private LocationAdapter adapter; private WeatherHelper weatherHelper; @@ -114,7 +105,8 @@ protected int getIndicatorHeight() { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_search); + this.binding = ActivitySearchBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); boolean lightTheme = !DisplayUtils.isDarkMode(this); DisplayUtils.setSystemBarStyle(this, getWindow(), @@ -142,7 +134,7 @@ public void onBackPressed() { @Override public View getSnackbarContainer() { - return container; + return binding.container; } // init. @@ -155,26 +147,19 @@ private void initData() { } private void initWidget() { - this.container = findViewById(R.id.activity_search_container); - - findViewById(R.id.activity_search_searchBar).setOnClickListener(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - findViewById(R.id.activity_search_searchBar) - .setTransitionName(getString(R.string.transition_activity_search_bar)); + binding.searchBar.setTransitionName(getString(R.string.transition_activity_search_bar)); } - this.searchContainer = findViewById(R.id.activity_search_searchContainer); - - findViewById(R.id.activity_search_backBtn).setOnClickListener(this); - findViewById(R.id.activity_search_clearBtn).setOnClickListener(this); + binding.backBtn.setOnClickListener(v -> finishSelf(false)); + binding.clearBtn.setOnClickListener(v -> binding.editText.setText("")); - this.editText = findViewById(R.id.activity_search_editText); - editText.setOnEditorActionListener(this); + binding.editText.setOnEditorActionListener(this); new Handler().post(() -> { - editText.requestFocus(); + binding.editText.requestFocus(); InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (inputManager != null) { - inputManager.showSoftInput(editText, 0); + inputManager.showSoftInput(binding.editText, 0); } }); @@ -201,15 +186,14 @@ private void initWidget() { } } ); - this.recyclerView = findViewById(R.id.activity_search_recyclerView); - recyclerView.setLayoutManager(layoutManager); - recyclerView.addItemDecoration(new ListDecoration(this)); - recyclerView.setAdapter(adapter); + binding.recyclerView.setLayoutManager(layoutManager); + binding.recyclerView.addItemDecoration(new ListDecoration(this)); + binding.recyclerView.setAdapter(adapter); - DragScrollBar scrollBar = findViewById(R.id.activity_search_scrollBar); - scrollBar.setIndicator(new WeatherSourceIndicator(this).setTextSize(16), true); + binding.scrollBar.setIndicator( + new WeatherSourceIndicator(this).setTextSize(16), true); - recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @ColorInt int sourceColor = Color.TRANSPARENT; @ColorInt int color; @@ -219,22 +203,21 @@ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); color = adapter.getItemSourceColor(layoutManager.findFirstVisibleItemPosition()); if (color != sourceColor) { - scrollBar.setHandleColor(color); - scrollBar.setHandleOffColor(color); + binding.scrollBar.setHandleColor(color); + binding.scrollBar.setHandleOffColor(color); } } }); - this.progressView = findViewById(R.id.activity_search_progress); - progressView.setAlpha(0); + binding.progress.setAlpha(0); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - searchContainer.setAlpha(1f); + binding.searchContainer.setAlpha(1f); } else { AnimatorSet animationSet = (AnimatorSet) AnimatorInflater.loadAnimator( this, R.animator.search_container_in); animationSet.setStartDelay(350); - animationSet.setTarget(searchContainer); + animationSet.setTarget(binding.searchContainer); animationSet.start(); } } @@ -243,7 +226,7 @@ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { private void finishSelf(boolean selected) { setResult(selected ? RESULT_OK : RESULT_CANCELED, null); - searchContainer.setAlpha(0); + binding.searchContainer.setAlpha(0); ActivityCompat.finishAfterTransition(this); } @@ -252,29 +235,29 @@ private void setState(int stateTo) { return; } - recyclerView.clearAnimation(); - progressView.clearAnimation(); + binding.recyclerView.clearAnimation(); + binding.progress.clearAnimation(); switch (stateTo) { case STATE_SHOWING: if (state == STATE_LOADING) { - recyclerView.setVisibility(View.VISIBLE); + binding.recyclerView.setVisibility(View.VISIBLE); - ShowAnimation show = new ShowAnimation(recyclerView); + ShowAnimation show = new ShowAnimation(binding.recyclerView); show.setDuration(150); - recyclerView.startAnimation(show); + binding.recyclerView.startAnimation(show); - HideAnimation hide = new HideAnimation(progressView); + HideAnimation hide = new HideAnimation(binding.progress); hide.setDuration(150); - progressView.startAnimation(hide); + binding.progress.startAnimation(hide); } break; case STATE_LOADING: if (state == STATE_SHOWING) { - recyclerView.setAlpha(0); - progressView.setAlpha(1); - recyclerView.setVisibility(View.GONE); + binding.recyclerView.setAlpha(0); + binding.progress.setAlpha(1); + binding.recyclerView.setVisibility(View.GONE); } break; } @@ -283,21 +266,6 @@ private void setState(int stateTo) { // interface. - // on click listener. - - @Override - public void onClick(View view) { - switch (view.getId()) { - case R.id.activity_search_backBtn: - finishSelf(false); - break; - - case R.id.activity_search_clearBtn: - editText.setText(""); - break; - } - } - // on editor action listener. @Override @@ -305,7 +273,7 @@ public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { if (!TextUtils.isEmpty(textView.getText().toString())) { InputMethodManager manager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); if (manager != null) { - manager.hideSoftInputFromWindow(editText.getWindowToken(), 0); + manager.hideSoftInputFromWindow(binding.editText.getWindowToken(), 0); } query = textView.getText().toString(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/DailyPollenAdapter.java b/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/DailyPollenAdapter.java index 412613865..27844831f 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/DailyPollenAdapter.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/DailyPollenAdapter.java @@ -5,10 +5,8 @@ import android.content.res.ColorStateList; import android.view.LayoutInflater; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.appcompat.widget.AppCompatImageView; import androidx.recyclerview.widget.RecyclerView; import wangdaye.com.geometricweather.R; @@ -16,6 +14,7 @@ import wangdaye.com.geometricweather.basic.model.weather.Daily; import wangdaye.com.geometricweather.basic.model.weather.Pollen; import wangdaye.com.geometricweather.basic.model.weather.Weather; +import wangdaye.com.geometricweather.databinding.ItemPollenDailyBinding; public class DailyPollenAdapter extends RecyclerView.Adapter { @@ -24,74 +23,48 @@ public class DailyPollenAdapter extends RecyclerView.Adapter listener.onClick(v, model.location.getFormattedId())); + binding.container.setOnClickListener(v -> listener.onClick(v, model.location.getFormattedId())); } @SuppressLint("SetTextI18n") @@ -74,44 +43,45 @@ protected void onBindView(Context context, LocationModel model, ResourceProvider model.location.isCurrentPosition() ? R.color.colorPrimary : R.color.colorTextAlert); if (model.currentPosition) { - swipeIconEnd.setImageResource(R.drawable.ic_settings); + binding.swipeIconEnd.setImageResource(R.drawable.ic_settings); } else { - swipeIconEnd.setImageResource(model.residentPosition ? R.drawable.ic_tag_off : R.drawable.ic_tag_plus); + binding.swipeIconEnd.setImageResource( + model.residentPosition ? R.drawable.ic_tag_off : R.drawable.ic_tag_plus); } - locationItemView.setBackgroundColor(themeManager.getRootColor(context)); + binding.item.setBackgroundColor(themeManager.getRootColor(context)); - residentIcon.setVisibility(model.residentPosition ? View.VISIBLE : View.GONE); + binding.residentIcon.setVisibility(model.residentPosition ? View.VISIBLE : View.GONE); if (model.weatherCode != null) { - weatherIcon.setVisibility(View.VISIBLE); - weatherIcon.setImageDrawable( + binding.weatherIcon.setVisibility(View.VISIBLE); + binding.weatherIcon.setImageDrawable( resourceProvider.getWeatherIcon( model.weatherCode, TimeManager.isDaylight(model.location) ) ); } else { - weatherIcon.setVisibility(View.GONE); + binding.weatherIcon.setVisibility(View.GONE); } - title.setTextColor(themeManager.getTextTitleColor(context)); - title.setText(model.title); + binding.title.setTextColor(themeManager.getTextTitleColor(context)); + binding.title.setText(model.title); - alerts.setTextColor(themeManager.getTextSubtitleColor(context)); + binding.alerts.setTextColor(themeManager.getTextSubtitleColor(context)); if (!TextUtils.isEmpty(model.alerts)) { - alerts.setVisibility(View.VISIBLE); - alerts.setText(model.alerts); + binding.alerts.setVisibility(View.VISIBLE); + binding.alerts.setText(model.alerts); } else { - alerts.setVisibility(View.GONE); + binding.alerts.setVisibility(View.GONE); } - subtitle.setTextColor(themeManager.getTextContentColor(context)); - subtitle.setText(model.subtitle); + binding.subtitle.setTextColor(themeManager.getTextContentColor(context)); + binding.subtitle.setText(model.subtitle); // source. - source.setText("Powered by " + model.weatherSource.getSourceUrl()); - source.setTextColor(model.weatherSource.getSourceColor()); + binding.source.setText("Powered by " + model.weatherSource.getSourceUrl()); + binding.source.setTextColor(model.weatherSource.getSourceColor()); drawSwipe(context, 0); drawDrag(context, false); @@ -119,7 +89,7 @@ protected void onBindView(Context context, LocationModel model, ResourceProvider public void drawDrag(Context context, boolean elevate) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - locationItemContainer.setElevation(DisplayUtils.dpToPx(context, elevate ? 10 : 0)); + binding.container.setElevation(DisplayUtils.dpToPx(context, elevate ? 10 : 0)); } } @@ -127,29 +97,33 @@ public void drawSwipe(Context context, float dX) { if (itemView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { if (dX < 0 && direction >= 0) { direction = -1; - locationItemContainer.setBackgroundColor(ContextCompat.getColor(context, R.color.striking_red)); + binding.container.setBackgroundColor(ContextCompat.getColor(context, R.color.striking_red)); } else if (dX > 0 && direction <= 0) { direction = 1; - locationItemContainer.setBackgroundColor(swipeEndColor); + binding.container.setBackgroundColor(swipeEndColor); } - locationItemContainer.setTranslationX(0); - locationItemView.setTranslationX(dX); - swipeIconStart.setTranslationX((float) Math.max(0.5 * (dX + swipeIconEnd.getMeasuredWidth()), 0)); - swipeIconEnd.setTranslationX((float) Math.min(0.5 * (dX - swipeIconStart.getMeasuredWidth()), 0)); + binding.container.setTranslationX(0); + binding.item.setTranslationX(dX); + binding.swipeIconStart.setTranslationX( + (float) Math.max(0.5 * (dX + binding.swipeIconEnd.getMeasuredWidth()), 0)); + binding.swipeIconEnd.setTranslationX( + (float) Math.min(0.5 * (dX - binding.swipeIconStart.getMeasuredWidth()), 0)); } else { if (dX < 0 && direction >= 0) { direction = -1; - locationItemContainer.setBackgroundColor(swipeEndColor); + binding.container.setBackgroundColor(swipeEndColor); } else if (dX > 0 && direction <= 0) { direction = 1; - locationItemContainer.setBackgroundColor(ContextCompat.getColor(context, R.color.striking_red)); + binding.container.setBackgroundColor(ContextCompat.getColor(context, R.color.striking_red)); } - locationItemContainer.setTranslationX(0); - locationItemView.setTranslationX(dX); - swipeIconStart.setTranslationX((float) Math.min(0.5 * (dX - swipeIconStart.getMeasuredWidth()), 0)); - swipeIconEnd.setTranslationX((float) Math.max(0.5 * (dX + swipeIconEnd.getMeasuredWidth()), 0)); + binding.container.setTranslationX(0); + binding.item.setTranslationX(dX); + binding.swipeIconStart.setTranslationX( + (float) Math.min(0.5 * (dX - binding.swipeIconStart.getMeasuredWidth()), 0)); + binding.swipeIconEnd.setTranslationX( + (float) Math.max(0.5 * (dX + binding.swipeIconEnd.getMeasuredWidth()), 0)); } } } diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/location/LocationModel.java b/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/location/LocationModel.java index d8c95b976..5f72d8d07 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/location/LocationModel.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/adapter/location/LocationModel.java @@ -54,7 +54,7 @@ public LocationModel(Context context, Location location, TemperatureUnit unit, W : location.getCityName(context)); if (location.getWeather() != null) { builder.append(", ").append( - location.getWeather().getCurrent().getTemperature().getTemperature(unit) + location.getWeather().getCurrent().getTemperature().getTemperature(context, unit) ); } title = builder.toString(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/NumberAnimTextView.java b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/NumberAnimTextView.java index 3e7a8cb29..11251f45b 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/NumberAnimTextView.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/NumberAnimTextView.java @@ -6,6 +6,7 @@ import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.content.Context; +import android.text.BidiFormatter; import android.util.AttributeSet; import android.view.animation.DecelerateInterpolator; import android.widget.TextView; @@ -78,7 +79,7 @@ public void setNumberString(String numberStart, String numberEnd) { start(); } else { // 数字不合法 直接调用 setText 设置最终值 - setText(mPrefixString + numberEnd + mPostfixString); + setText(mPrefixString + BidiFormatter.getInstance().unicodeWrap(numberEnd) + mPostfixString); } } @@ -128,17 +129,19 @@ private void start() { setText(mPrefixString + format(new BigDecimal(mNumEnd)) + mPostfixString); return; } + BidiFormatter f = BidiFormatter.getInstance(); + animator = ValueAnimator.ofObject(new BigDecimalEvaluator(), new BigDecimal(mNumStart), new BigDecimal(mNumEnd)); animator.setDuration(mDuration); animator.setInterpolator(new DecelerateInterpolator(3f)); animator.addUpdateListener(valueAnimator -> { BigDecimal value = (BigDecimal) valueAnimator.getAnimatedValue(); - setText(mPrefixString + format(value) + mPostfixString); + setText(mPrefixString + f.unicodeWrap(format(value)) + mPostfixString); }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - setText(mPrefixString + mNumEnd + mPostfixString); + setText(mPrefixString + f.unicodeWrap(mNumEnd) + mPostfixString); } }); animator.start(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/trend/TrendRecyclerView.java b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/trend/TrendRecyclerView.java index 4fe0aff08..512ad4cee 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/trend/TrendRecyclerView.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/trend/TrendRecyclerView.java @@ -36,6 +36,8 @@ public class TrendRecyclerView extends RecyclerView private int drawingBoundaryBottom; private @Nullable List keyLineList; + private boolean keyLineVisibility = true; + private @Nullable Float highestData; private @Nullable Float lowestData; @@ -171,7 +173,8 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); - if (keyLineList == null + if (!keyLineVisibility + || keyLineList == null || keyLineList.size() == 0 || highestData == null || lowestData == null) { @@ -242,6 +245,11 @@ public void setData(List keyLineList, float highestData, float lowestDa invalidate(); } + public void setKeyLineVisibility(boolean visibility) { + this.keyLineVisibility = visibility; + invalidate(); + } + public void setLineColor(@ColorInt int lineColor) { this.lineColor = lineColor; invalidate(); diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/WeatherView.java b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/WeatherView.java index 0894d4d22..fc7e67796 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/WeatherView.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/WeatherView.java @@ -1,5 +1,8 @@ package wangdaye.com.geometricweather.ui.widget.weatherView; +import android.content.Context; +import android.view.Window; + import androidx.annotation.ColorInt; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -68,4 +71,12 @@ void setWeather(@WeatherView.WeatherKindRule int weatherKind, boolean daytime, void setDrawable(boolean drawable); void setGravitySensorEnabled(boolean enabled); + + void setSystemBarStyle(Context context, Window window, + boolean statusShader, boolean lightStatus, + boolean navigationShader, boolean lightNavigation); + + void setSystemBarColor(Context context, Window window, + boolean statusShader, boolean lightStatus, + boolean navigationShader, boolean lightNavigation); } diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/circularSkyView/CircularSkyWeatherView.java b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/circularSkyView/CircularSkyWeatherView.java index b02572fe7..538b2a3c2 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/circularSkyView/CircularSkyWeatherView.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/circularSkyView/CircularSkyWeatherView.java @@ -20,6 +20,7 @@ import android.util.AttributeSet; import android.view.LayoutInflater; +import android.view.Window; import android.view.animation.Animation; import android.view.animation.Transformation; import android.widget.FrameLayout; @@ -29,9 +30,9 @@ import wangdaye.com.geometricweather.R; import wangdaye.com.geometricweather.basic.model.weather.WeatherCode; +import wangdaye.com.geometricweather.databinding.ContainerCircularSkyViewBinding; import wangdaye.com.geometricweather.resource.ResourceHelper; import wangdaye.com.geometricweather.resource.provider.ResourceProvider; -import wangdaye.com.geometricweather.ui.widget.AnimatableIconView; import wangdaye.com.geometricweather.ui.widget.weatherView.WeatherView; import wangdaye.com.geometricweather.ui.widget.weatherView.WeatherViewController; import wangdaye.com.geometricweather.utils.DisplayUtils; @@ -49,10 +50,7 @@ public class CircularSkyWeatherView extends FrameLayout @ColorInt private int backgroundColor; private boolean daytime; - private WeatherIconControlView controlView; - private CircleView circleView; - private FrameLayout starContainer; - private AnimatableIconView flagIcon; + private ContainerCircularSkyViewBinding binding; @Size(3) private Drawable[] iconDrawables; @Size(3) private Animator[] iconAnimators; @@ -74,7 +72,7 @@ private class StarAlphaAnimation extends Animation { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); - starContainer.setAlpha(startAlpha + (endAlpha - startAlpha) * interpolatedTime); + binding.starContainer.setAlpha(startAlpha + (endAlpha - startAlpha) * interpolatedTime); } } @@ -119,30 +117,25 @@ private void initialize() { this.backgroundColor = getBackgroundColor(); setBackgroundColor(backgroundColor); + this.binding = ContainerCircularSkyViewBinding.inflate(LayoutInflater.from(getContext())); + /* this.controlView = (WeatherIconControlView) LayoutInflater.from(getContext()).inflate( - R.layout.container_circular_sky_view, this, false); - controlView.setOnWeatherIconChangingListener(this); - addView(controlView); + R.layout.container_circular_sky_view, this, false);*/ + binding.controller.setOnWeatherIconChangingListener(this); + addView(binding.getRoot()); - this.controlView = findViewById(R.id.container_circular_sky_view_controller); - - this.circleView = findViewById(R.id.container_circular_sky_view_circularSkyView); - - this.starContainer = findViewById(R.id.container_circular_sky_view_starContainer); if (daytime) { - starContainer.setAlpha(0); + binding.starContainer.setAlpha(0); } else { - starContainer.setAlpha(1); + binding.starContainer.setAlpha(1); } - this.flagIcon = findViewById(R.id.container_circular_sky_view_icon); - this.iconDrawables = new Drawable[] {null, null, null}; this.iconAnimators = new Animator[] {null, null, null}; AppCompatImageView[] starts = new AppCompatImageView[] { - findViewById(R.id.container_circular_sky_view_star_1), - findViewById(R.id.container_circular_sky_view_star_2)}; + findViewById(R.id.star_1), + findViewById(R.id.star_2)}; Glide.with(getContext()) .load(R.drawable.star_1) .diskCacheStrategy(DiskCacheStrategy.NONE) @@ -181,7 +174,8 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ) ); - this.firstCardMarginTop = (int) (circleView.getMeasuredHeight() - DisplayUtils.dpToPx(getContext(), 28)); + this.firstCardMarginTop = (int) ( + binding.circularSky.getMeasuredHeight() - DisplayUtils.dpToPx(getContext(), 28)); } @Override @@ -196,7 +190,7 @@ protected boolean fitSystemWindows(Rect insets) { * @return Return true whether execute switch animation. * */ public boolean showCircles() { - if (circleView.showCircle(daytime)) { + if (binding.circularSky.showCircle(daytime)) { changeStarAlPha(); return true; } @@ -204,11 +198,12 @@ public boolean showCircles() { } private void changeStarAlPha() { - starContainer.clearAnimation(); + binding.starContainer.clearAnimation(); - StarAlphaAnimation animation = new StarAlphaAnimation(starContainer.getAlpha(), daytime ? 0 : 1); + StarAlphaAnimation animation = new StarAlphaAnimation( + binding.starContainer.getAlpha(), daytime ? 0 : 1); animation.setDuration(500); - starContainer.startAnimation(animation); + binding.starContainer.startAnimation(animation); } // interface. @@ -234,7 +229,7 @@ public void setWeather(@WeatherKindRule int weatherKind, boolean daytime, iconDrawables = ResourceHelper.getWeatherIcons(provider, weatherCode, daytime); iconAnimators = ResourceHelper.getWeatherAnimators(provider, weatherCode, daytime); - controlView.showWeatherIcon(); + binding.controller.showWeatherIcon(); int newColor = getBackgroundColor(); if (showCircles() || newColor != backgroundColor) { @@ -259,14 +254,14 @@ public void setWeather(@WeatherKindRule int weatherKind, boolean daytime, @Override public void onClick() { - circleView.touchCircle(); - flagIcon.startAnimators(); + binding.circularSky.touchCircle(); + binding.icon.startAnimators(); } @Override public void onScroll(int scrollY) { - controlView.setTranslationY( - -circleView.getMeasuredHeight() + binding.controller.setTranslationY( + -binding.circularSky.getMeasuredHeight() * Math.min(1f, 1f * scrollY / firstCardMarginTop) ); } @@ -315,9 +310,25 @@ public void setGravitySensorEnabled(boolean enabled) { // do nothing. } + @Override + public void setSystemBarStyle(Context context, Window window, + boolean statusShader, boolean lightStatus, + boolean navigationShader, boolean lightNavigation) { + DisplayUtils.setSystemBarStyle(context, window, true, + statusShader, lightNavigation, navigationShader, lightNavigation); + } + + @Override + public void setSystemBarColor(Context context, Window window, + boolean statusShader, boolean lightStatus, + boolean navigationShader, boolean lightNavigation) { + DisplayUtils.setSystemBarColor(context, window, true, + statusShader, lightNavigation, navigationShader, lightNavigation); + } + @Override public void OnWeatherIconChanging() { - flagIcon.setAnimatableIcon(iconDrawables, iconAnimators); - flagIcon.startAnimators(); + binding.icon.setAnimatableIcon(iconDrawables, iconAnimators); + binding.icon.startAnimators(); } } \ No newline at end of file diff --git a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/materialWeatherView/MaterialWeatherView.java b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/materialWeatherView/MaterialWeatherView.java index 4f3611694..96a8cf274 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/materialWeatherView/MaterialWeatherView.java +++ b/app/src/main/java/wangdaye/com/geometricweather/ui/widget/weatherView/materialWeatherView/MaterialWeatherView.java @@ -13,6 +13,7 @@ import android.util.DisplayMetrics; import android.view.OrientationEventListener; import android.view.View; +import android.view.Window; import androidx.annotation.ColorInt; import androidx.annotation.IntDef; @@ -260,8 +261,8 @@ protected void onDraw(Canvas canvas) { if (implementor != null && rotators != null) { canvas.save(); canvas.translate( - (getMeasuredWidth() - sizes[0]) / 2, - (getMeasuredHeight() - sizes[1]) / 2 + (getMeasuredWidth() - sizes[0]) / 2f, + (getMeasuredHeight() - sizes[1]) / 2f ); implementor.draw( sizes, canvas, @@ -427,4 +428,20 @@ public void setDrawable(boolean drawable) { public void setGravitySensorEnabled(boolean enabled) { this.gravitySensorEnabled = enabled; } + + @Override + public void setSystemBarStyle(Context context, Window window, + boolean statusShader, boolean lightStatus, + boolean navigationShader, boolean lightNavigation) { + DisplayUtils.setSystemBarStyle(context, window, true, + statusShader, lightNavigation, navigationShader, lightNavigation); + } + + @Override + public void setSystemBarColor(Context context, Window window, + boolean statusShader, boolean lightStatus, + boolean navigationShader, boolean lightNavigation) { + DisplayUtils.setSystemBarColor(context, window, true, + statusShader, lightNavigation, navigationShader, lightNavigation); + } } \ No newline at end of file diff --git a/app/src/main/java/wangdaye/com/geometricweather/utils/DisplayUtils.java b/app/src/main/java/wangdaye/com/geometricweather/utils/DisplayUtils.java index b9dd0c125..86a7f0c8d 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/utils/DisplayUtils.java +++ b/app/src/main/java/wangdaye/com/geometricweather/utils/DisplayUtils.java @@ -147,6 +147,10 @@ public static boolean isLandscape(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } + public static boolean isRtl(Context context) { + return context.getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; + } + public static boolean isDarkMode(Context context) { return (context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; diff --git a/app/src/main/java/wangdaye/com/geometricweather/utils/helpter/IntentHelper.java b/app/src/main/java/wangdaye/com/geometricweather/utils/helpter/IntentHelper.java index b9d3bfaba..040e8ace7 100644 --- a/app/src/main/java/wangdaye/com/geometricweather/utils/helpter/IntentHelper.java +++ b/app/src/main/java/wangdaye/com/geometricweather/utils/helpter/IntentHelper.java @@ -16,6 +16,7 @@ import androidx.annotation.RequiresApi; import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityOptionsCompat; +import androidx.core.content.ContextCompat; import androidx.core.util.Pair; import android.view.View; @@ -28,6 +29,7 @@ import wangdaye.com.geometricweather.basic.model.weather.Weather; import wangdaye.com.geometricweather.daily.DailyWeatherActivity; import wangdaye.com.geometricweather.settings.activity.CardDisplayManageActivity; +import wangdaye.com.geometricweather.settings.activity.DailyTrendDisplayManageActivity; import wangdaye.com.geometricweather.ui.activity.AllergenActivity; import wangdaye.com.geometricweather.wallpaper.material.MaterialLiveWallpaperService; import wangdaye.com.geometricweather.settings.activity.AboutActivity; @@ -36,7 +38,7 @@ import wangdaye.com.geometricweather.main.MainActivity; import wangdaye.com.geometricweather.ui.activity.ManageActivity; import wangdaye.com.geometricweather.settings.activity.PreviewIconActivity; -import wangdaye.com.geometricweather.ui.activity.SearcActivity; +import wangdaye.com.geometricweather.ui.activity.SearchActivity; import wangdaye.com.geometricweather.settings.activity.SettingsActivity; import wangdaye.com.geometricweather.utils.SnackbarUtils; @@ -101,7 +103,7 @@ public static void startManageActivityForResult(Activity activity, int requestCo } public static void startSearchActivityForResult(Activity activity, View bar, int requestCode) { - Intent intent = new Intent(activity, SearcActivity.class); + Intent intent = new Intent(activity, SearchActivity.class); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { activity.startActivityForResult(intent, requestCode); @@ -128,6 +130,11 @@ public static void startCardDisplayManageActivityForResult(Activity activity, in new Intent(activity, CardDisplayManageActivity.class), requestCode); } + public static void startDailyTrendDisplayManageActivityForResult(Activity activity, int requestCode) { + activity.startActivityForResult( + new Intent(activity, DailyTrendDisplayManageActivity.class), requestCode); + } + public static void startSelectProviderActivity(Activity activity) { activity.startActivity(new Intent(activity, SelectProviderActivity.class)); } @@ -245,11 +252,7 @@ public static void sendBackgroundUpdateBroadcast(Context context, Location locat } public static void startAwakeForegroundUpdateService(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(getAwakeForegroundUpdateServiceIntent(context)); - } else { - context.startService(getAwakeForegroundUpdateServiceIntent(context)); - } + ContextCompat.startForegroundService(context, getAwakeForegroundUpdateServiceIntent(context)); } public static Intent getAwakeForegroundUpdateServiceIntent(Context context) { diff --git a/app/src/main/res/drawable-ldrtl/ic_toolbar_back.xml b/app/src/main/res/drawable-ldrtl/ic_toolbar_back.xml new file mode 100644 index 000000000..d12e31481 --- /dev/null +++ b/app/src/main/res/drawable-ldrtl/ic_toolbar_back.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/flag_ja.png b/app/src/main/res/drawable/flag_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..0f674ad98da9b6e7890c1bee49f6282b578d7323 GIT binary patch literal 2579 zcmV+u3hecXP)Px;%}GQ-RA>e5TFq-6RTRJPBTb~WF=^1Mixv?#E=8fSin`H-f>vB8__5HXE^PE4 z5Z$zOp*vlvpip#W1rc;%QLxrsK`es0s*yA%O=9wr_u=`Sdw=uJoXos=>6f;8!^}DN zoZtDJJ9j3Ngz*3PzXQW`pyohTa|geor#+XwpQ{=TshvD|a-`Ggyw>aWPRX$@$JIDc z*Qt$-jn`2x>Q09?f+q;;M~@!e*6nsrT#hbC91R0%`O6X8#*o-Qpl;MJM|P*MOAU0+ z8VurXA(kIx^KaF)TCF#vA&u0O8oGml#x&~n`eQm9;#8}}rh;022vdbfgEDIQGJA`$ zd>MW#@@BL7sNmU@>|TOkn*>{s1NWE~ir_35GCQaP#Q=^ni~FZ|<}ze{8 z49Sx^CxGOJPr~E3s%KnM?=Kg8h>5rN`G^ZPrN)&4w>20J8ddsXY^@K=dt2z3ICSI( zHEEE)BL9#Xo484e%x<(fI|c`}d=6wLbPj5HLaYzVQ*Uj+14C+g$Sjujo>~n3kQT*H z_SzV`QgVK+Qz|Iqd@Gc;puLr~u=3T3u>ASAq4m?Rp*?#xbmq^6#^lb>+`TJ|-nKXF zcxXCof8eeVwvTBTYY%~K)G&E?d)QFs?RA3{AvT&Zd6QjW7d_C=;gE?zN50G+_}SIGNVQwuOlo4upx9o(zrg9ofo>!2G!?AFt0_ z%k#L=z|&_&vxnXf^M~J84GWH~?>7XE!SMPhjpto6&xBpC zJYz){jkhZ$x2JG53=@f1uBy|_Ly5ve2{IvDo>3p%Lf=ceE#zLPqwEFy;9)NcA7k>L_gzeaJ4eZDJY zWMrgxr3~skuK=k$zV%9h;=mwX{_6YCm4={P#U-lPUc}3%C0Q}J?pQgIg7*hjSj5ED zhWNVbR$KA{_`O)f!Q7c2q?9E{j!(#Kg6rRE(4se|W3J z2CyM)QoPO3FxsWtO#;~l0)I~8*qjIP$dh?no;HwiS!7l@GKptf_j?IfabHbcFDKSMf*A#2a zE@xM;p!3$D#jl^0C%fPaN318i^t~>wsKAA0!`P;`7-<8W1k>2WF5;wtVwnSFgDA1A z&th{;;YLY-?J9Xv@04=T`ozxA{^P8=L48^@YjzYpLO(z;pl07Nr)|2sAj;NUQ+}(q zIWq@fe14GG0XtxS2$t{F|V(@TcQNT0dsK@>iWtdkr z(Y9^$`bn4+4(3H#1S->&K7C*?=s=J%r=z#+(FKl0-jR-wMqa)Qt1On+K^*Y~8u>nj zX7dm1@Dt>_%O0emgSnLD3=lDvCtjVTQ?4miQN=R=om#r{!D)T^;0Y89?!SkWy?4-F z_0k|dlF>l$pq7UWacGBp!Iur*CZLut!sl)u>y%3z6azZSiX2(l&in5S^|4WTfoo|& zdJB~%j6!m|2%;rf^lI~h4%)hWfI^(SF5=717E7Mg+H6`W0O3G4Nvk?*9fHTJ_tf(T zv>_-#uf7(8ng5ApqEI~$AAHKgQ}rb}_(vS-5f?lM`7%9mMKsqGIw}HE#~@X7_lr*j zd@%!#g+v<`44U3n6OGNwzro_2MVkbQLnio^3;*!PK|aQaa>{@qPraw~16taYVVn?S z9g=U#H`Tp|XS4|19>`x0tQ7F+2l%))q9uL$q&Y|9_8dAG;GbB=+zO>F{aV{xQ=qUQ z8d`%go>87Soxz(U$L2jCPF5E0fmXH9I2Tj39)6@}ad*P;;XVsSj=+y3emM_9q$>dt}zq~Cj zF81G>oh6?T2m7D|lQVg9FlLj3iWBcVONC@Uo`0gmItNeR=AI~;r(;F?o7(NK*l!JPw z9`E&PY))S9?G3b$_4XcAr5_Y8*A(p9^5;YK@11%lm}8KZ@#m{o=NE8dT+$*})bVLW zOzx3vl{5ggJPrS8YICwY^TI{N0JS{zmfE@@&oyOjZ7u#QfVH?pye-7?7b~3gY55}m zQaAqBEgNi#-U}-$E2r1jbNUQu9a}yFTw=z?v^>LFndPbXlo-+6vV`Bja_7}Uyz>rJP^U3MZgnme?{1Hd$@syK#J(>U=C~ge}PSkAEtEExSYJ|A`@gKR>a5|Nckk=H~E^Gc7sV_V($DqBT7| zePDKW_D#8sew5B$wms%@UIEmF`p%p=b7bGXeNUiniH|=t>1yFh$ySRfM$?h|-%^oX zO#{WF3ApHJ2#>b#J?<$0b>!eKOM~oRvqgu-UFn1S2J1x=&=}N>`c= + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c1b88c601..8304a0c2a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -2,62 +2,83 @@ - + android:layout_height="wrap_content" + android:orientation="horizontal"> + + - - + + + + + + + + + + + android:background="@android:color/transparent" + app:elevation="0dp"> - - - + - + - + - + - + diff --git a/app/src/main/res/layout/activity_main_tablet.xml b/app/src/main/res/layout/activity_main_tablet.xml deleted file mode 100644 index 82f7958ed..000000000 --- a/app/src/main/res/layout/activity_main_tablet.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml index 5189fa8c0..246d3c387 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -2,7 +2,7 @@ @@ -13,7 +13,7 @@ android:layout_height="match_parent"> @@ -70,7 +70,7 @@ android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/item_location.xml b/app/src/main/res/layout/item_location.xml index a35d4f6f3..0feb2e03b 100644 --- a/app/src/main/res/layout/item_location.xml +++ b/app/src/main/res/layout/item_location.xml @@ -2,7 +2,7 @@ @@ -83,7 +83,7 @@ @@ -74,7 +74,7 @@ android:layout_weight="1"> @@ -119,7 +119,7 @@ android:layout_weight="1"> @@ -155,7 +155,7 @@ android:layout_weight="1"> diff --git a/app/src/main/res/layout/item_weather_daily_pollen.xml b/app/src/main/res/layout/item_weather_daily_pollen.xml index 765e94df0..097405bd4 100644 --- a/app/src/main/res/layout/item_weather_daily_pollen.xml +++ b/app/src/main/res/layout/item_weather_daily_pollen.xml @@ -20,7 +20,7 @@ android:layout_weight="1"> @@ -56,7 +56,7 @@ android:layout_weight="1"> @@ -100,7 +100,7 @@ android:layout_weight="1"> @@ -136,7 +136,7 @@ android:layout_weight="1"> diff --git a/app/src/main/res/transition/search_activity_enter.xml b/app/src/main/res/transition/search_activity_enter.xml index 5de4109de..f02e22a7d 100644 --- a/app/src/main/res/transition/search_activity_enter.xml +++ b/app/src/main/res/transition/search_activity_enter.xml @@ -7,6 +7,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/transition/search_activity_return.xml b/app/src/main/res/transition/search_activity_return.xml index 5de4109de..f02e22a7d 100644 --- a/app/src/main/res/transition/search_activity_return.xml +++ b/app/src/main/res/transition/search_activity_return.xml @@ -7,6 +7,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/transition/search_activity_shared_enter.xml b/app/src/main/res/transition/search_activity_shared_enter.xml index 191cc9cab..3be7fe938 100644 --- a/app/src/main/res/transition/search_activity_shared_enter.xml +++ b/app/src/main/res/transition/search_activity_shared_enter.xml @@ -10,7 +10,7 @@ android:duration="350" tools:ignore="NewApi"> - + @@ -22,7 +22,7 @@ app:radius_to="0dp" tools:ignore="NewApi"> - + diff --git a/app/src/main/res/transition/search_activity_shared_return.xml b/app/src/main/res/transition/search_activity_shared_return.xml index 16fe123e4..b8696a962 100644 --- a/app/src/main/res/transition/search_activity_shared_return.xml +++ b/app/src/main/res/transition/search_activity_shared_return.xml @@ -10,7 +10,7 @@ android:duration="350" tools:ignore="NewApi"> - + @@ -22,7 +22,7 @@ app:radius_to="8dp" tools:ignore="NewApi"> - + diff --git a/app/src/main/res/values-ar/arrays.xml b/app/src/main/res/values-ar/arrays.xml index 7570a4cc0..05e53eb8f 100644 --- a/app/src/main/res/values-ar/arrays.xml +++ b/app/src/main/res/values-ar/arrays.xml @@ -144,6 +144,16 @@ °ف ك + + ° + ° + ك + + + °م + °ف + ك + @@ -165,4 +175,9 @@ كغم قوة/سم² + + + /m³ + + \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index df06427c0..c7b2d61bc 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -187,64 +187,6 @@ لون الخط حجم الخط خط الساعة - You can input anything, but please pay attention to the length of the text. If you want to quote weather data, please use $ to reference the corresponding keyword.\n\nFor example, \"current weather = $cw$\" will be displayed as \"current weather = Clear Day\". - - \n - $cw$ : Current Weather\n - $ct$ : Current Temperature (℃/℉)\n - $ctd$ : Current Temperature (°)\n - $at$ : Apparent Temperature (℃/℉)\n - $atd$ : Apparent Temperature (°)\n - $cpb$ : Current Precipitation Probability (%)\n - $cp$ : Current Precipitation (mm/L/m²)\n - $cwd$ : Current Wind\n - $cuv$ : Current UV\n - $ch$ : Current Humidity\n - $cps$ : Current Pressure\n - $cv$ : Current Visibility\n - $cdp$ : Current DewPoint\n - \n - $l$ : Location\n - $lat$ : Latitude\n - $lon$ : Longitude\n - $ut$ : Update Time\n - $d$ : Date\n - $lc$ : Lunar Calendar\n - $w$ : Week\n - $ws$ : Week (Short)\n - $dd$ : Daily Description\n - $hd$ : Hourly Description\n - \n - $0dw$, $1dw$, …, $4dw$ : \nDaytime Weather of Today, Tmw, …, 4 days later\n - \n - $0nw$, $1nw$, …, $4nw$ : \nNighttime Weather of Today, Tmw, …, 4 days later\n - \n - $0dt$, $1dt$, …, $4dt$ : \nDaytime Temperature of Today, Tmw, …, 4 days later (℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \nNighttime Temperature of Today, Tmw, …, 4 days later (℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \nDaytime Temperature of Today, Tmw, …, 4 days later (°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \nNighttime Temperature of Today, Tmw, …, 4 days later (°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \nDaytime Precipitation of Today, Tmw, …, 4 days later (%)\n - \n - $0np$, $1np$, …, $4np$ : \nNighttime Precipitation of Today, Tmw, …, 4 days later (%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \nDaytime Wind of Today, Tmw, …, 4 days later\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \nNighttime Wind of Today, Tmw, …, 4 days later\n - \n - $0sr$, $1sr$, …, $4sr$ : \nSunrise of Today, Tmw, …, 4 days later\n - \n - $0ss$, $1ss$, …, $4ss$ : \nSunset of Today, Tmw, …, 4 days later\n - \n - $0mr$, $1mr$, …, $4mr$ : \nMoonrise of Today, Tmw, …, 4 days later\n - \n - $0ms$, $1ms$, …, $4ms$ : \nMoonset of Today, Tmw, …, 4 days later\n - \n - $0mp$, $1mp$, …, $4mp$ : \nMoon Phase of Today, Tmw, …, 4 days later\n - الطقس الوقت diff --git a/app/src/main/res/values-cs/arrays.xml b/app/src/main/res/values-cs/arrays.xml index fa009db64..ebfc19c50 100644 --- a/app/src/main/res/values-cs/arrays.xml +++ b/app/src/main/res/values-cs/arrays.xml @@ -141,7 +141,7 @@ km/h m/s kn - mi/h + mph ft/s @@ -152,13 +152,6 @@ L/m² - - - - - K - - km diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2bfc0a21c..29951a605 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -27,7 +27,7 @@ Síla větru Znatelná teplota Vlhkost vzduchu - UV index + UV záření Doba slunce Předpověď Instrukce @@ -102,11 +102,11 @@ Nový měsíc Dorustající čtvrtina - První čtvrtina - Dorůstající polovina - Plný měsíc - Ubývající polovina - Tři čtvrtiny + Dorůstající polovina + Dorůstající tři čtvrtiny + Úplněk + Ubývající tři čtvrtiny + Ubývající polovina Ubývající čtvrtina Seno @@ -187,64 +187,46 @@ Velikost písma Font hodin Můžete napsat cokoliv, ale dávejte si prosím pozor na délku textu. Pokud chcete citovat data o počasí, tak prosím použijte znak $, aby jste odkazovaly na odpovídající klíčová slova.\n\nNa příklad, \"current weather = $cw$\" se ukáže jako \"current weather = Clear Day\". - - \n - $cw$ : Současné Počasí\n - $ct$ : Současná Teplota (℃/℉)\n - $ctd$ : Současná Teplota (°)\n - $at$ : Zdánlivá Teplota (℃/℉)\n - $atd$ : Zdánlivá Teplota (°)\n - $cpb$ : Současná Pravděpodobnost Srážek (%)\n - $cp$ : Současné Srážky (mm/L/m²)\n - $cwd$ : Současný Vítr\n - $cuv$ : Současné UV\n - $ch$ : Současná Vlhkost\n - $cps$ : Současný Tlak\n - $cv$ : Současná Viditelnost\n - $cdp$ : Současný Rosný Bod\n - \n - $l$ : Poloha\n - $lat$ : Zeměpisná Šířka\n - $lon$ : Zeměpisná délka\n - $ut$ : Čas Obnovy\n - $d$ : Datum\n - $lc$ : Lunarní Kalendář\n - $w$ : Týden\n - $ws$ : Týden (Krátký)\n - $dd$ : Popis Dní\n - $hd$ : Popis Hodin\n - $enter$ : Zadat\n - \n - $0dw$, $1dw$, …, $4dw$ : \nDnešní Počasí Přes Den, Tmw, …, O 4 dny později\n - \n - $0nw$, $1nw$, …, $4nw$ : \nDnešní Počasí Přes Noc, Tmw, …, O 4 dny později\n - \n - $0dt$, $1dt$, …, $4dt$ : \nDnešní Teplota Přes Den, Tmw, …, O 4 dny později (℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \nDnešní Teplota Přes Noc, Tmw, …, O 4 dny později (℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \nDnešní Teplota Přes Den, Tmw, …, O 4 dny později (°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \nDnešní Teplota Přes Noc, Tmw, …, O 4 dny později (°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \Dnešní Srážky Přes Den, Tmw, …, O 4 dny později (%)\n - \n - $0np$, $1np$, …, $4np$ : \nDnešní srážky přes Noc, Tmw, …, O 4 dny později (%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \nDnešní vítr přes den, Tmw, …, O 4 dny později\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \nDnešní vítr přes noc, Tmw, …, O 4 dny později\n - \n - $0sr$, $1sr$, …, $4sr$ : \nDnešní čas východu slunce, Tmw, …, O 4 dny později\n - \n - $0ss$, $1ss$, …, $4ss$ : \nDnešní čas západu slunce Tmw, …, O 4 dny později\n - \n - $0mr$, $1mr$, …, $4mr$ : \nDnešní čas východu měsíce, Tmw, …, O 4 dny později\n - \n - $0ms$, $1ms$, …, $4ms$ : \nDnešní čas západu měsíce, Tmw, …, O 4 dny později\n - \n - $0mp$, $1mp$, …, $4mp$ : \nDnešní fáze měsíce, Tmw, …, O 4 dny později\n - + + $cw$ : Současné Počasí\n + $ct$ : Současná Teplota (℃/℉)\n + $ctd$ : Současná Teplota (°)\n + $at$ : Zdánlivá Teplota (℃/℉)\n + $atd$ : Zdánlivá Teplota (°)\n + $cpb$ : Současná Pravděpodobnost Srážek (%)\n + $cp$ : Současné Srážky (mm/L/m²)\n + $cwd$ : Současný Vítr\n + $cuv$ : Současné UV\n + $ch$ : Současná Vlhkost\n + $cps$ : Současný Tlak\n + $cv$ : Současná Viditelnost\n + $cdp$ : Současný Rosný Bod\n + $l$ : Poloha\n + $lat$ : Zeměpisná Šířka\n + $lon$ : Zeměpisná délka\n + $ut$ : Čas Obnovy\n + $d$ : Datum\n + $lc$ : Lunarní Kalendář\n + $w$ : Týden\n + $ws$ : Týden (Krátký)\n + $dd$ : Popis Dní\n + $hd$ : Popis Hodin\n + $enter$ : Zadat\n + $0dw$, $1dw$, …, $4dw$ : \nDnešní Počasí Přes Den, Tmw, …, O 4 dny později\n + $0nw$, $1nw$, …, $4nw$ : \nDnešní Počasí Přes Noc, Tmw, …, O 4 dny později\n + $0dt$, $1dt$, …, $4dt$ : \nDnešní Teplota Přes Den, Tmw, …, O 4 dny později (℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \nDnešní Teplota Přes Noc, Tmw, …, O 4 dny později (℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \nDnešní Teplota Přes Den, Tmw, …, O 4 dny později (°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \nDnešní Teplota Přes Noc, Tmw, …, O 4 dny později (°)\n + $0dp$, $1dp$, …, $4dp$ : \Dnešní Srážky Přes Den, Tmw, …, O 4 dny později (%)\n + $0np$, $1np$, …, $4np$ : \nDnešní srážky přes Noc, Tmw, …, O 4 dny později (%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \nDnešní vítr přes den, Tmw, …, O 4 dny později\n + $0nwd$, $1nwd$, …, $4nwd$ : \nDnešní vítr přes noc, Tmw, …, O 4 dny později\n + $0sr$, $1sr$, …, $4sr$ : \nDnešní čas východu slunce, Tmw, …, O 4 dny později\n + $0ss$, $1ss$, …, $4ss$ : \nDnešní čas západu slunce Tmw, …, O 4 dny později\n + $0mr$, $1mr$, …, $4mr$ : \nDnešní čas východu měsíce, Tmw, …, O 4 dny později\n + $0ms$, $1ms$, …, $4ms$ : \nDnešní čas západu měsíce, Tmw, …, O 4 dny později\n + $0mp$, $1mp$, …, $4mp$ : \nDnešní fáze měsíce, Tmw, …, O 4 dny později\n Počasí Čas diff --git a/app/src/main/res/values-de/arrays.xml b/app/src/main/res/values-de/arrays.xml index 98343c6b1..7bf353e4d 100644 --- a/app/src/main/res/values-de/arrays.xml +++ b/app/src/main/res/values-de/arrays.xml @@ -1,7 +1,6 @@ - 30 Minuten 1 Stunde @@ -17,14 +16,38 @@ 6 Stunden - + + Sans-Serif light + Sans-Serif + Sans-Serif fett + Analog + + + + Automatisch + Immer hell + Immer dunkel + + Dunkel Grau Hell - + + Automatisch + @string/daytime + @string/nighttime + + + + Ohne + Tag/Nacht Modus + Hell + Dunkel + + Rechteckig Symmetrisch @@ -37,16 +60,10 @@ Oreo (Google sans) - - Automatisch - Immer hell - Immer dunkel - - - + + Hell + Dunkel Automatisch - @string/daytime - @string/nighttime \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3fd85cf9c..c3681e816 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -178,10 +178,8 @@ Sichtbar Verbergen (muss in Systemeinstellungen geöffnet werden) Interface Style, Kartenreihenfolge, Sprache… - "Deaktiviert -Falls keinerlei Dienste im Hintergrund laufen sollten bitte diese Option einschalten." - "Aktiv -Falls Widgets und Benachrichtigungen nicht aktualisieren bitte diese Option ausschalten." + "Deaktiviert\nFalls keinerlei Dienste im Hintergrund laufen sollten bitte diese Option einschalten." + "Aktiv\nFalls Widgets und Benachrichtigungen nicht aktualisieren bitte diese Option ausschalten." Material Wetter Animation als Live Hintergrund setzen Wetteranbieter und Standortdienst auswählen Einheiten für Wetterdaten einstellen @@ -226,6 +224,7 @@ Falls Widgets und Benachrichtigungen nicht aktualisieren bitte diese Option auss Oberflächendesign Einheiten Wetteranbieter + Stil Wochensymbole Schnee Sonne & Mond Temperatur diff --git a/app/src/main/res/values-el/arrays.xml b/app/src/main/res/values-el/arrays.xml index 27b996cf8..f491de023 100644 --- a/app/src/main/res/values-el/arrays.xml +++ b/app/src/main/res/values-el/arrays.xml @@ -152,13 +152,6 @@ Λ/Μ² - - - - - K - - Χλμ diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 7d41f1867..bb06771a0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -193,64 +193,46 @@ Μέγεθος κειμένου Γραμματοσειρά ρολογιού Μπορείτε να εισάγετε οτιδήποτε, αλλά παρακαλώ δώστε προσοχή στο μήκος του κειμένου. Αν θέλετε τα δεδομένα καιρού να εμφανίζονται, χρησιμοποιήστε το $ για σύνδεση με την αντίστοιχη λέξη-κλειδί.\n\nΓια παράδειγμα, \"Ο καιρός τώρα = $cw$\" θα εμφανιστεί ως \"Ο καιρός τώρα = Καθαρή ημέρα\". - - \n - $cw$ : Ο καιρός τώρα\n - $ct$ : Τρέχουσα θερμοκρασία (℃/℉)\n - $ctd$ : Τρέχουσα θερμοκρασία (°)\n - $at$ : Αίσθηση σαν (℃/℉)\n - $atd$ : Αίσθηση σαν (°)\n - $cpb$ : Πιθανότητα βροχόπτωσης (%)\n - $cp$ : Πιθανότητα βροχόπτωσης (mm/L/m²)\n - $cwd$ : Άνεμος\n - $cuv$ : Δείκτης UV\n - $ch$ : Υγρασία\n - $cps$ : Πίεση\n - $cv$ : Ορατότητα\n - $cdp$ : Σημείο δρόσου\n - \n - $l$ : Τοποθεσία\n - $lat$ : Γεωγραφικό πλάτος\n - $lon$ : Γεωγραφικό μήκος\n - $ut$ : Ώρα ενημέρωσης\n - $d$ : Ημερομηνία\n - $lc$ : Σεληνιακό ημερολόγιο\n - $w$ : Εβδομάδα\n - $ws$ : Εβδομάδα (σύντομη)\n - $dd$ : Ημερήσια περιγραφή\n - $hd$ : Ωριαία περιγραφή\n - $enter$ : Καταχώρηση\n - \n - $0dw$, $1dw$, …, $4dw$ : \nΟ καιρός σήμερα, αύριο …, για 4 ημέρες\n - \n - $0nw$, $1nw$, …, $4nw$ : \nΟ καιρός τη νύχτα σήμερα, αύριο, …, για 4 ημέρες\n - \n - $0dt$, $1dt$, …, $4dt$ : \nΟ καιρός την ημέρα σήμερα, αύριο, …, για 4 ημέρες (℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \nΘερμοκρασία νύχτας σήμερα, αύριο, …, για 4 ημέρες (℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \nΘερμοκρασία ημέρας σήμερα, αύριο, …, για 4 ημέρες (°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \nΘερμοκρασία νύχτας σήμερα, αύριο, …, για 4 ημέρες (°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \nΒροχόπτωση ημέρας σήμερα, αύριο, …, για 4 ημέρες (%)\n - \n - $0np$, $1np$, …, $4np$ : \nΒροχόπτωση νύχτας σήμερα, αύριο, …, για 4 ημέρες (%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \nΆνεμος ημέρας σήμερα, αύριο, …, για 4 ημέρες\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \nΆνεμος νύχτας σήμερα, αύριο, …, για 4 ημέρες\n - \n - $0sr$, $1sr$, …, $4sr$ : \nΑνατολή ηλίου σήμερα, αύριο, …, για 4 ημέρες\n - \n - $0ss$, $1ss$, …, $4ss$ : \nΔύση ηλίου σήμερα, αύριο, …, για 4 ημέρες\n - \n - $0mr$, $1mr$, …, $4mr$ : \nΑνατολή σελήνης σήμερα, αύριο, …, για 4 ημέρες\n - \n - $0ms$, $1ms$, …, $4ms$ : \nΔύση σελήνης, αύριο, …, για 4 ημέρες\n - \n - $0mp$, $1mp$, …, $4mp$ : \nΦάση σελήνης σήμερα, αύριο, …, για 4 ημέρες\n - + + $cw$ : Ο καιρός τώρα\n + $ct$ : Τρέχουσα θερμοκρασία (℃/℉)\n + $ctd$ : Τρέχουσα θερμοκρασία (°)\n + $at$ : Αίσθηση σαν (℃/℉)\n + $atd$ : Αίσθηση σαν (°)\n + $cpb$ : Πιθανότητα βροχόπτωσης (%)\n + $cp$ : Πιθανότητα βροχόπτωσης (mm/L/m²)\n + $cwd$ : Άνεμος\n + $cuv$ : Δείκτης UV\n + $ch$ : Υγρασία\n + $cps$ : Πίεση\n + $cv$ : Ορατότητα\n + $cdp$ : Σημείο δρόσου\n + $l$ : Τοποθεσία\n + $lat$ : Γεωγραφικό πλάτος\n + $lon$ : Γεωγραφικό μήκος\n + $ut$ : Ώρα ενημέρωσης\n + $d$ : Ημερομηνία\n + $lc$ : Σεληνιακό ημερολόγιο\n + $w$ : Εβδομάδα\n + $ws$ : Εβδομάδα (σύντομη)\n + $dd$ : Ημερήσια περιγραφή\n + $hd$ : Ωριαία περιγραφή\n + $enter$ : Καταχώρηση\n + $0dw$, $1dw$, …, $4dw$ : \nΟ καιρός σήμερα, αύριο …, για 4 ημέρες\n + $0nw$, $1nw$, …, $4nw$ : \nΟ καιρός τη νύχτα σήμερα, αύριο, …, για 4 ημέρες\n + $0dt$, $1dt$, …, $4dt$ : \nΟ καιρός την ημέρα σήμερα, αύριο, …, για 4 ημέρες (℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \nΘερμοκρασία νύχτας σήμερα, αύριο, …, για 4 ημέρες (℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \nΘερμοκρασία ημέρας σήμερα, αύριο, …, για 4 ημέρες (°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \nΘερμοκρασία νύχτας σήμερα, αύριο, …, για 4 ημέρες (°)\n + $0dp$, $1dp$, …, $4dp$ : \nΒροχόπτωση ημέρας σήμερα, αύριο, …, για 4 ημέρες (%)\n + $0np$, $1np$, …, $4np$ : \nΒροχόπτωση νύχτας σήμερα, αύριο, …, για 4 ημέρες (%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \nΆνεμος ημέρας σήμερα, αύριο, …, για 4 ημέρες\n + $0nwd$, $1nwd$, …, $4nwd$ : \nΆνεμος νύχτας σήμερα, αύριο, …, για 4 ημέρες\n + $0sr$, $1sr$, …, $4sr$ : \nΑνατολή ηλίου σήμερα, αύριο, …, για 4 ημέρες\n + $0ss$, $1ss$, …, $4ss$ : \nΔύση ηλίου σήμερα, αύριο, …, για 4 ημέρες\n + $0mr$, $1mr$, …, $4mr$ : \nΑνατολή σελήνης σήμερα, αύριο, …, για 4 ημέρες\n + $0ms$, $1ms$, …, $4ms$ : \nΔύση σελήνης, αύριο, …, για 4 ημέρες\n + $0mp$, $1mp$, …, $4mp$ : \nΦάση σελήνης σήμερα, αύριο, …, για 4 ημέρες\n Καιρός Ώρα diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 607c3b2dd..5f41a587c 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -130,64 +130,38 @@ Szövegméret Óra Betűtípusa Akármit beírhat, de kérjük figyeljen oda a szöveg hosszúságára. Ha szeretne időjárásadatokat megjeleníteni, kérjük használja a $ jelet a kulcsszóra való hivatkozáshoz.\n\nPéldául, \"Jelenlegi Időjárás = $cw$\" így fog megjelenni: \"Jelenlegi Időjárás = Napos\". - - \n - $cw$ : Jelenlegi Időjárás\n - $ct$ : Jelenlegi Hőmérséklet (℃/℉)\n - $ctd$ : Jelenlegi Hőmérséklet (°)\n - $at$ : Érezhető Hőmérséklet (℃/℉)\n - $atd$ : Érezhető Hőmérséklet (°)\n - $cpb$ : Current Precipitation Probability (%)\n - $cp$ : Current Precipitation (mm/L/m²)\n - $cwd$ : Jelenlegi Szél\n - $cuv$ : Current UV\n - $ch$ : Current Humidity\n - $cps$ : Current Pressure\n - $cv$ : Current Visibility\n - $cdp$ : Current DewPoint\n - \n - $l$ : Elhelyezkedés\n - $lat$ : Szélesség\n - $lon$ : Magasság\n - $ut$ : Frissítési Idő\n - $d$ : Dátum\n - $lc$ : Hold Naptár\n - $w$ : Hét\n - $ws$ : Hét (Rövid)\n - $dd$ : Napi Leírás\n - $hd$ : Óránkénti Leírás\n - $enter$ : Enter\n - \n - $0dw$, $1dw$, …, $4dw$ : \nNappali Időjárás a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0nw$, $1nw$, …, $4nw$ : \nEsti Időjárás a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0dt$, $1dt$, …, $4dt$ : \nNappali Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \nEsti Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \nNappali Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \nEsti Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \nNappali Csapadék a Mai Napra, Tmw, …, 4 nappal később (%)\n - \n - $0np$, $1np$, …, $4np$ : \nEsti Csapadék a Mai Napra, Tmw, …, 4 nappal később (%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \nNappali Szél a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \nEsti Szél a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0sr$, $1sr$, …, $4sr$ : \nNapkelte a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0ss$, $1ss$, …, $4ss$ : \nNapnyugta a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0mr$, $1mr$, …, $4mr$ : \nHoldkelte a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0ms$, $1ms$, …, $4ms$ : \nHoldnyugta a Mai Napra, Tmw, …, 4 nappal később\n - \n - $0mp$, $1mp$, …, $4mp$ : \nHoldfázis a Mai Napra, Tmw, …, 4 nappal később\n - + + $cw$ : Jelenlegi Időjárás\n + $ct$ : Jelenlegi Hőmérséklet (℃/℉)\n + $ctd$ : Jelenlegi Hőmérséklet (°)\n + $at$ : Érezhető Hőmérséklet (℃/℉)\n + $atd$ : Érezhető Hőmérséklet (°)\n + $cwd$ : Jelenlegi Szél\n + $l$ : Elhelyezkedés\n + $lat$ : Szélesség\n + $lon$ : Magasság\n + $ut$ : Frissítési Idő\n + $d$ : Dátum\n + $lc$ : Hold Naptár\n + $w$ : Hét\n + $ws$ : Hét (Rövid)\n + $dd$ : Napi Leírás\n + $hd$ : Óránkénti Leírás\n + $0dw$, $1dw$, …, $4dw$ : \nNappali Időjárás a Mai Napra, Tmw, …, 4 nappal később\n + $0nw$, $1nw$, …, $4nw$ : \nEsti Időjárás a Mai Napra, Tmw, …, 4 nappal később\n + $0dt$, $1dt$, …, $4dt$ : \nNappali Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \nEsti Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \nNappali Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \nEsti Hőmérséklet a Mai Napra, Tmw, …, 4 nappal később (°)\n + $0dp$, $1dp$, …, $4dp$ : \nNappali Csapadék a Mai Napra, Tmw, …, 4 nappal később (%)\n + $0np$, $1np$, …, $4np$ : \nEsti Csapadék a Mai Napra, Tmw, …, 4 nappal később (%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \nNappali Szél a Mai Napra, Tmw, …, 4 nappal később\n + $0nwd$, $1nwd$, …, $4nwd$ : \nEsti Szél a Mai Napra, Tmw, …, 4 nappal később\n + $0sr$, $1sr$, …, $4sr$ : \nNapkelte a Mai Napra, Tmw, …, 4 nappal később\n + $0ss$, $1ss$, …, $4ss$ : \nNapnyugta a Mai Napra, Tmw, …, 4 nappal később\n + $0mr$, $1mr$, …, $4mr$ : \nHoldkelte a Mai Napra, Tmw, …, 4 nappal később\n + $0ms$, $1ms$, …, $4ms$ : \nHoldnyugta a Mai Napra, Tmw, …, 4 nappal később\n + $0mp$, $1mp$, …, $4mp$ : \nHoldfázis a Mai Napra, Tmw, …, 4 nappal később\n Időjárás Idő diff --git a/app/src/main/res/values-ja/arrays.xml b/app/src/main/res/values-ja/arrays.xml new file mode 100644 index 000000000..a04e0cabe --- /dev/null +++ b/app/src/main/res/values-ja/arrays.xml @@ -0,0 +1,142 @@ + + + + + + + + + weather.com.cn (中国のみ) + caiyun.com (中国のみ) + accuweather.com + + + + + Baidu Location + Baidu IP Location (中国のみ) + AMap Location + ネイティブAPI + + + + + 自動 + ライトモード + ダークモード + + + + + 丸い空 + マテリアルアニメーション + + + + + 30分 + 1時間 + 1.5時間 + 2時間 + 2.5時間 + 3時間 + 3.5時間 + 4時間 + 4.5時間 + 5時間 + 5.5時間 + 6時間 + + + + + 自動 + @string/daytime + @string/nighttime + + + + + Native + @string/geometric_weather + + + + + ダーク + グレー + ライト + + + + + 長方形 + 対称的 + タイル + ミニ + ナノ + ピクセル + 垂直 + Oreo + Oreo (Google sans) + + + + + 更新時刻 + 空気質指数 (一部エリアでは無効です) + + 体感温度 + 旧暦 + カスタム + + + + + sans-serif-light + sans-serif + sans-serif-black + analog + + + + + 無し + 自動 + ライトモード + ダークモード + + + + + ライト + ダーク + 自動 + + + + + 自動 + 晴れ + 一部曇り + 曇り + + + みぞれ + ひょう + + かすみ + + 雷雨 + + + + + + 自動 + 日中 + 夜間 + + + \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..9fa5d43b0 --- /dev/null +++ b/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,376 @@ + + + 天気 + + + 現在地 + デフォルト位置 + 現在 + 今日 + 更新時刻 + 現地時間 + 降水量 + 降水確率 + + 降水時間 + 昼間 + 夜間 + 時間 + 昼間 + 夜間 + 気温 + + 風向 + 風速 + 風向計 + 体感温度 + 湿度 + UV指数 + 日照時間 + 予報 + 説明 + 昼間 + 夜間 + 更新 + 体感温度 + 本体設定 + バックグラウンド情報 + 気圧 + 視程 + 露点 + 雲量 + 雲低高度 + 追加する + アプリストアから追加する + GitHub から追加する + 更新 + 再起動 + 編集 + + + :00 + 昨日 + 明日 + + + + + + + + + + 体感温度 + Real feel shader + Apparent + Wind chill + 湿球温度 + Degree day + + 合計 + 雷雨 + + + + + 風力0 + 風力1 + 風力2 + 風力3 + 風力4 + 風力5 + 風力6 + 風力7 + 風力8 + 風力9 + 風力10 + 風力11 + 風力12 + + 霧雨 + + 大雨 + 暴風雨 + + 良い + + 軽度の汚染 + 中程度の汚染 + 重度の汚染 + 深刻な汚染 + + 新月 + 三日月 + 上弦 + 十三夜 + 満月 + 十八夜 + 下弦 + 二十六夜 + + + カビ + ブタクサ + + + 日時予報 + 毎時予報 + 詳細予報 + 降水量予報 + 空気質指数 + アレルギー + 詳細 + 太陽と月 + + + 完了 + キャンセル + 有効 + 無効 + 設定 + ヘルプ + もっと詳しく + + アプリについて + introduce + メール + 寄付 + GitHub + 翻訳者 + Thanks + + Alipay + Wechat + + + + + + M-d + MMM dd日 + EEEE MMM dd日 + EEEE MMM dd日 + EEEE MMM dd日 + + + + Retrofit 2.0 + Type-safe HTTP client for Android and Java by Square, Inc. + Glide + An image loading and caching library for Android focused on smooth scrolling. + Gson + A Java serialization/deserialization library that can convert Java Objects into JSON and back. + GreenDAO + greenDAO is a light and fast ORM solution for Android that maps objects to SQLite databases. + InkPageIndicator + InkPageIndicator created by @nickbutcher for Plaid https://github.com/nickbutcher/plaid and backported by David Pacioianu for API 14+ (4.0+). + CircularProgressView + Material style circular progress bar for Android. + + + アクセス許可 + 現在地 + Locating in background + Location permissions request success + Location permissions request failed + + 位置情報を取得できませんでした。 + 気象データを取得できませんでした + 位置情報が正しくありませんか? + Check location permissions + Enable Location Information + 位置情報サービスを選択 + 手動でロケーションを追加し、\'$\'を削除 + + View style + 背景色 + 透明度 + 字幕を隠す + 字幕データ + 文字の色 + 文字サイズ + 時間のフォント + 何を入力しても構いませんが、文章の長さに注意してください。天気データを引用する場合は、対応するキーワードを$で参照してください。\n\n例えば、現在の天気=$cw$の場合は、現在の天気=晴れと表示されます。 + + + $cw$ : 現在の天気\n + $ct$ : 現在の気温 (℃/℉)\n + $ctd$ : 現在の気温 (°)\n + $at$ : 体感温度 (℃/℉)\n + $atd$ : 体感温度 (°)\n + $cpb$ : 現在の降水確率 (%)\n + $cp$ : 現在の降水量 (mm/L/m²)\n + $cwd$ : 現在の風\n + $cuv$ : 現在の紫外線\n + $ch$ : 現在の湿度\n + $cps$ : 現在の気圧\n + $cv$ : 現在の視程\n + $cdp$ : 現在の露点温度\n + $l$ : 場所\n + $lat$ : 緯度\n + $lon$ : 経度\n + $ut$ : 更新時刻\n + $d$ : 日付\n + $lc$ : 旧暦\n + $w$ : 曜日\n + $ws$ : 曜日 (短い)\n + $dd$ : 日ごとの説明\n + $hd$ : 時間ごとの説明\n + $enter$ : 改行\n + $0dw$, $1dw$, …, $4dw$ : \n日中の天気, 明日…, 4日目\n + $0nw$, $1nw$, …, $4nw$ : \n夜間の天気, 明日, …, 4日目\n + $0dt$, $1dt$, …, $4dt$ : \n日中の気温, 明日, …, 4日目 (℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \n夜間の天気, 明日, …, 4日目 (℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \n日中の気温, 明日, …, 4日目 (°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \n夜間の天気, 明日, …, 4日目 (°)\n + $0dp$, $1dp$, …, $4dp$ : \n日中の降水量, 明日, …, 4日目 (%)\n + $0np$, $1np$, …, $4np$ : \n夜間の降水量, 明日, …, 4日目 (%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \n日中の風, 明日, …, 4日目\n + $0nwd$, $1nwd$, …, $4nwd$ : \n夜間の風, 明日, …, 4日目\n + $0sr$, $1sr$, …, $4sr$ : \n今日の日の出, 明日, …, 4日目\n + $0ss$, $1ss$, …, $4ss$ : \n今日の日没, 明日, …, 4日目\n + $0mr$, $1mr$, …, $4mr$ : \n今日の月の出, 明日, …, 4日目\n + $0ms$, $1ms$, …, $4ms$ : \n今日の月没, 明日, …, 4日目\n + $0mp$, $1mp$, …, $4mp$ : \n今日の月の満ち欠け, 明日, …, 4日目\n + + 天気 + 時間 + + グラフを押すとデータが切り替わります + データ無し + + この場所は既に追加されています + 場所を追加しました + 場所を削除しました + すべての場所を削除することはできません + + 検索する + まだ場所はありません + 見つかりません + 初期化中 + + 変更は、ホームに戻ったときに反映されます + 更新する + 変更はデータが更新されたときに有効になります + 変更は再起動後に有効になります + 場所を再追加してください + データソースを変更した後は、場所を再追加してください + + バックグラウンドで更新 + 気象データの更新 + バックグラウンドで更新 + + + + + 端末によっては、「バックグラウンドで更新しない」をオフにした後、通知バーにクリアできない通知が表示される場合があります。 + グループ通知をブロックする + 「バックグラウンドで更新しない」をオフにすると、通知バーにバックグラウンドサービスが起動していることを示す通知が表示されます。アプリの情報ページの「バックグラウンド情報」をオフにすることで、この通知をブロックすることができます。 + + バッテリーの最適化を無視する + バックグラウンドサービスを継続して動作させるために、GeometricWeatherのバッテリー最適化は無視してください。 + + ライブ壁紙のプレビューを開始できません + + このデバイスには有効なGeocoderが含まれていません。位置情報提供者はBaidu Locationに変更されました。 + Geocoderは、緯度・経度の情報を、\'XX city, YY province \'のような形式に変換してくれるコンポーネントです。このコンポーネントがない場合、位置情報サービスとしてネイティブAPIを使用している場合は、AccuWeatherでしか天気データを取得することができません。 + + 今日は雨が降るかもしれません。 + 数時間後に雨が降る可能性があります。 + + 居住地として設定 + GeometricWeatherは、現在地を基準にして自動的に居住地を表示・非表示にします。例えば、自分の出身地を居住地に設定することで、旅行中に居住地の天気を確認することができます。帰宅すると、居住地の天気が現在地の天気に切り替わります。 + + Click to get more… + + + 警告 + 管理 + 検索 + 設定 + プレビュー + Geometric Weather について + アプリストア + + + 毎日 + 週間 + 毎日 + 週間 + 時計 + 毎日 (水平) + 時計 + 毎日 (詳細) + 時計 + 毎日 (垂直) + 時計 + 毎日 + 週間 + テキスト + 日中の動き + 時間ごと動き + 複数の都市 + 更新を待っています + + + + 基本 + バックグラウンドで更新しない + 有効\nウィジェットや通知が自動更新できない場合は、このオプションをオフにしてください。 + 無効\nウィジットや通知が自動更新されない場合は、このオプションをオフにしてください。 + ライブ壁紙 + ライブ壁紙を設定 + サービス提供者 + 気象データと位置情報サービスを選択 + 気象情報 + 位置情報サービス + ダークモード + UIスタイル + アイコンパック + 外観 + UIスタイル, カード, 言語… + 表示カード + カード + 重力センサー + リストアニメーション + アイテムアニメーション + 言語 + 単位 + 単位を設定 + 気温単位 + 距離単位 + 降水量単位 + 圧力単位 + 速度単位 + 自動更新 + 悪天候警告 + 降水予報を通知する + Permanent service + 予報の通知 + 今日の予報を通知する + 通知時間 + 明日の予報を通知する + 通知時間 + ウィジット + アイコンモード + シンプルなアイコン + タップで更新 + 通知 + 継続的な通知 + 通知スタイル + 気温を通知バーに表示する + 通知カラー + カスタム通知色 + 文字色 + 背景色 + 本体設定 + 削除可能 + ドラッグで削除できます + 通知から削除できません + 通知アイコンを表示しない + 非表示 + 表示 + ロック画面で表示しない + 非表示 + 表示 + 拡張表示 + 非表示 + 表示 + 居住地 + + \ No newline at end of file diff --git a/app/src/main/res/values-ko/arrays.xml b/app/src/main/res/values-ko/arrays.xml index e075f60f3..b616765dc 100644 --- a/app/src/main/res/values-ko/arrays.xml +++ b/app/src/main/res/values-ko/arrays.xml @@ -152,13 +152,6 @@ L/m² - - - - - K - - km diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 3e6888ab8..5b1c1697c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -187,64 +187,46 @@ 글씨 사이즈 시계 폰트 아무거나 입력 할 수는 있지만, 글씨의 길이에 신경 써 주십시오. 당신이 만약 날씨 데이터를 따오고 싶다면, 해당 키워드를 참조하여 $ 를 사용해 주십시오. \n\n예를 들자면 \"현재 날씨 = $cw$\" 는 \"현재 날씨 = 맑음\" 으로 표시됩니다. - - \n - $cw$ : 현재 날씨\n - $ct$ : 현재 온도 (℃/℉)\n - $ctd$ : 현재 온도 (°)\n - $at$ : 피상 온도 (℃/℉)\n - $atd$ : 피상 온도 (°)\n - $cpb$ : 현재 강수 확률 (%)\n - $cp$ : 현재 강수 (mm/L/m²)\n - $cwd$ : 현재 바람\n - $cuv$ : 현재 자외선\n - $ch$ : 현재 습도\n - $cps$ : 현재 기압\n - $cv$ : 현재 시계\n - $cdp$ : 현재 이슬점\n - \n - $l$ : 위치\n - $lat$ : 위도\n - $lon$ : 경도\n - $ut$ : 갱신 시간\n - $d$ : 날짜\n - $lc$ : 음력\n - $w$ : 주\n - $ws$ : 주 (짧은)\n - $dd$ : 오늘의 서술\n - $hd$ : 시간별 서술\n - $enter$ : 들어가기\n - \n - $0dw$, $1dw$, …, $4dw$ : \n오늘의 주간 날씨, 내일, …, 4일 후\n - \n - $0nw$, $1nw$, …, $4nw$ : \n오늘의 야간 날씨, 내일, …, 4일 후\n - \n - $0dt$, $1dt$, …, $4dt$ : \n오늘의 주간 온도, 내일, …, 4일 후 (℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \n오늘의 야간 온도, 내일, …, 4일 후 (℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \n오늘의 주간 온도, 내일, …, 4일 후 (°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \n오늘의 야간 온도, 내일, …, 4일 후 (°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \n오늘의 주간 강수 확률, 내일, …, 4일 후 (%)\n - \n - $0np$, $1np$, …, $4np$ : \n오늘의 야간 강수 확률, 내일, …, 4일 후 (%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \n오늘의 주간 바람, 내일, …, 4일 후\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \n오늘의 야간 바람, 내일, …, 4일 후\n - \n - $0sr$, $1sr$, …, $4sr$ : \n오늘의 일출, 내일, …, 4일 후\n - \n - $0ss$, $1ss$, …, $4ss$ : \n오늘의 일몰, 내일, …, 4일 후\n - \n - $0mr$, $1mr$, …, $4mr$ : \n오늘의 월출, 내일, …, 4일 후\n - \n - $0ms$, $1ms$, …, $4ms$ : \n오늘의 월몰, 내일, …, 4일 후\n - \n - $0mp$, $1mp$, …, $4mp$ : \n오늘의 달의 위상, 내일, …, 4일 후\n - + + $cw$ : 현재 날씨\n + $ct$ : 현재 온도 (℃/℉)\n + $ctd$ : 현재 온도 (°)\n + $at$ : 피상 온도 (℃/℉)\n + $atd$ : 피상 온도 (°)\n + $cpb$ : 현재 강수 확률 (%)\n + $cp$ : 현재 강수 (mm/L/m²)\n + $cwd$ : 현재 바람\n + $cuv$ : 현재 자외선\n + $ch$ : 현재 습도\n + $cps$ : 현재 기압\n + $cv$ : 현재 시계\n + $cdp$ : 현재 이슬점\n + $l$ : 위치\n + $lat$ : 위도\n + $lon$ : 경도\n + $ut$ : 갱신 시간\n + $d$ : 날짜\n + $lc$ : 음력\n + $w$ : 주\n + $ws$ : 주 (짧은)\n + $dd$ : 오늘의 서술\n + $hd$ : 시간별 서술\n + $enter$ : 들어가기\n + $0dw$, $1dw$, …, $4dw$ : \n오늘의 주간 날씨, 내일, …, 4일 후\n + $0nw$, $1nw$, …, $4nw$ : \n오늘의 야간 날씨, 내일, …, 4일 후\n + $0dt$, $1dt$, …, $4dt$ : \n오늘의 주간 온도, 내일, …, 4일 후 (℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \n오늘의 야간 온도, 내일, …, 4일 후 (℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \n오늘의 주간 온도, 내일, …, 4일 후 (°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \n오늘의 야간 온도, 내일, …, 4일 후 (°)\n + $0dp$, $1dp$, …, $4dp$ : \n오늘의 주간 강수 확률, 내일, …, 4일 후 (%)\n + $0np$, $1np$, …, $4np$ : \n오늘의 야간 강수 확률, 내일, …, 4일 후 (%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \n오늘의 주간 바람, 내일, …, 4일 후\n + $0nwd$, $1nwd$, …, $4nwd$ : \n오늘의 야간 바람, 내일, …, 4일 후\n + $0sr$, $1sr$, …, $4sr$ : \n오늘의 일출, 내일, …, 4일 후\n + $0ss$, $1ss$, …, $4ss$ : \n오늘의 일몰, 내일, …, 4일 후\n + $0mr$, $1mr$, …, $4mr$ : \n오늘의 월출, 내일, …, 4일 후\n + $0ms$, $1ms$, …, $4ms$ : \n오늘의 월몰, 내일, …, 4일 후\n + $0mp$, $1mp$, …, $4mp$ : \n오늘의 달의 위상, 내일, …, 4일 후\n 날씨 시간 diff --git a/app/src/main/res/values-pl/arrays.xml b/app/src/main/res/values-pl/arrays.xml index 0378b1bef..8bb508322 100644 --- a/app/src/main/res/values-pl/arrays.xml +++ b/app/src/main/res/values-pl/arrays.xml @@ -140,7 +140,7 @@ km/h m/s kn - mi/h + mph ft/s @@ -151,13 +151,6 @@ L/m² - - - - - K - - km diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 8c765d6cd..635f2d6c3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -199,64 +199,46 @@ Wielkość czcionki Czcionka zegara Możesz wpisać wszystko, ale zwróć uwagę na długość tekstu. Jeśli chcesz odwołać się do danych pogodowych, proszę użyj $ aby odwołać się do odpowiedniego słowa kluczowego.\n\nNa przykład, \"current weather = $cw$\" wyświetli się jako \"current weather = Clear Day\". - - \n - $cw$ : Obecna pogodar\n - $ct$ : Obecna temperatura (℃/℉)\n - $ctd$ : Obecna temperatura (°)\n - $at$ : Temperatura pozorna (℃/℉)\n - $atd$ : Temperatura pozorna (°)\n - $cpb$ : Obecne prawdopodobieństwo opadów (%)\n - $cp$ : Obecne opady (mm/L/m²)\n - $cwd$ : Obecny wiatr\n - $cuv$ : Obecny indeks UV\n - $ch$ : Obecna wilgotność\n - $cps$ : Obecne ciśnienie\n - $cv$ : Obecna widoczność\n - $cdp$ : Obecny punkt rosy\n - \n - $l$ : Lokalizacja\n - $lat$ : Szerokość geograficzna\n - $lon$ : Długość geograficzna\n - $ut$ : Czas aktualizacji\n - $d$ : Data\n - $lc$ : Kalendarz księżycowy\n - $w$ : Tydzień\n - $ws$ : Tydzień (krótki)\n - $dd$ : Opis dzienny\n - $hd$ : Opis godzinowy\n - $enter$ : Wprowadź\n - \n - $0dw$, $1dw$, …, $4dw$ : \nDzisiejsza pogoda w ciągu dnia, Tmw, …, 4 dni później\n - \n - $0nw$, $1nw$, …, $4nw$ : \nDzisiejsza pogoda w ciągu nocy, Tmw, …, 4 dni później\n - \n - $0dt$, $1dt$, …, $4dt$ : \nDzisiejsza temperatura w ciągu dnia, Tmw, …, 4 dni później\(℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \nDzisiejsza temperatura w ciągu nocy, Tmw, …, 4 dni później\(℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \nDzisiejsza temperatura w ciągu dnia, Tmw, …, 4 dni później\(°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \nDzisiejsza temperatura w ciągu nocy, Tmw, …, 4 dni później\(°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \nDzisiejsze opady w ciągu dnia, Tmw, …, 4 dni później\(%)\n - \n - $0np$, $1np$, …, $4np$ : \nDzisiejsze opady w ciągu nocy, Tmw, …, 4 dni później\(%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \nDzisiajsza prędkość wiatru w ciągu dnia, Tmw, …, 4 dni później\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \nDzisiajsza prędkość wiatru w ciągu nocy, Tmw, …, 4 dni później\n - \n - $0sr$, $1sr$, …, $4sr$ : \nDzisiejszy wschód słońca, Tmw, …, 4 dni później\n - \n - $0ss$, $1ss$, …, $4ss$ : \nDzisiejszy zachód słońca, Tmw, …, 4 dni później\n - \n - $0mr$, $1mr$, …, $4mr$ : \nDzisiejszy wschód księżyca, Tmw, …, 4 dni później\n - \n - $0ms$, $1ms$, …, $4ms$ : \nDzisiejszy zachód księżyca, Tmw, …, 4 dni później\n - \n - $0mp$, $1mp$, …, $4mp$ : \nDzisiejsza faza księżyca, Tmw, …, 4 dni później\n - + + $cw$ : Obecna pogodar\n + $ct$ : Obecna temperatura (℃/℉)\n + $ctd$ : Obecna temperatura (°)\n + $at$ : Temperatura pozorna (℃/℉)\n + $atd$ : Temperatura pozorna (°)\n + $cpb$ : Obecne prawdopodobieństwo opadów (%)\n + $cp$ : Obecne opady (mm/L/m²)\n + $cwd$ : Obecny wiatr\n + $cuv$ : Obecny indeks UV\n + $ch$ : Obecna wilgotność\n + $cps$ : Obecne ciśnienie\n + $cv$ : Obecna widoczność\n + $cdp$ : Obecny punkt rosy\n + $l$ : Lokalizacja\n + $lat$ : Szerokość geograficzna\n + $lon$ : Długość geograficzna\n + $ut$ : Czas aktualizacji\n + $d$ : Data\n + $lc$ : Kalendarz księżycowy\n + $w$ : Tydzień\n + $ws$ : Tydzień (krótki)\n + $dd$ : Opis dzienny\n + $hd$ : Opis godzinowy\n + $enter$ : Wprowadź\n + $0dw$, $1dw$, …, $4dw$ : \nDzisiejsza pogoda w ciągu dnia, Tmw, …, 4 dni później\n + $0nw$, $1nw$, …, $4nw$ : \nDzisiejsza pogoda w ciągu nocy, Tmw, …, 4 dni później\n + $0dt$, $1dt$, …, $4dt$ : \nDzisiejsza temperatura w ciągu dnia, Tmw, …, 4 dni później\(℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \nDzisiejsza temperatura w ciągu nocy, Tmw, …, 4 dni później\(℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \nDzisiejsza temperatura w ciągu dnia, Tmw, …, 4 dni później\(°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \nDzisiejsza temperatura w ciągu nocy, Tmw, …, 4 dni później\(°)\n + $0dp$, $1dp$, …, $4dp$ : \nDzisiejsze opady w ciągu dnia, Tmw, …, 4 dni później\(%)\n + $0np$, $1np$, …, $4np$ : \nDzisiejsze opady w ciągu nocy, Tmw, …, 4 dni później\(%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \nDzisiajsza prędkość wiatru w ciągu dnia, Tmw, …, 4 dni później\n + $0nwd$, $1nwd$, …, $4nwd$ : \nDzisiajsza prędkość wiatru w ciągu nocy, Tmw, …, 4 dni później\n + $0sr$, $1sr$, …, $4sr$ : \nDzisiejszy wschód słońca, Tmw, …, 4 dni później\n + $0ss$, $1ss$, …, $4ss$ : \nDzisiejszy zachód słońca, Tmw, …, 4 dni później\n + $0mr$, $1mr$, …, $4mr$ : \nDzisiejszy wschód księżyca, Tmw, …, 4 dni później\n + $0ms$, $1ms$, …, $4ms$ : \nDzisiejszy zachód księżyca, Tmw, …, 4 dni później\n + $0mp$, $1mp$, …, $4mp$ : \nDzisiejsza faza księżyca, Tmw, …, 4 dni później\n Pogoda Czas diff --git a/app/src/main/res/values-ru/arrays.xml b/app/src/main/res/values-ru/arrays.xml index 66a6c9c8a..7aff90d24 100644 --- a/app/src/main/res/values-ru/arrays.xml +++ b/app/src/main/res/values-ru/arrays.xml @@ -143,13 +143,6 @@ л/м² - - - - - K - - км diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ec07ed393..2947043af 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -168,64 +168,45 @@ Размер текста Шрифт чаcов Вы можете ввести что угодно, но, пожалуйста, обратите внимание на длину текста. Если Вы хотите чтобы отображались погодные данные, пожалуйста используйте $ для ссылки на соответствующее ключевое слово.\n\nНапример, \"погода сейчас = $cw$\" будет показана как \"Погода сейчас = Ясный День\". - - \n - $cw$ : Погода сейчас\n - $ct$ : Текущая температура (℃/℉)\n - $ctd$ : Текущая температура (°)\n - $at$ : Ощущается как (℃/℉)\n - $atd$ : Ощущается как (°)\n - $cpb$ : Вероятность осадков (%)\n - $cp$ : Вероятность осадков (mm/L/m²)\n - $cwd$ : Ветер\n - $cuv$ : УФ-индекс\n - $ch$ : Влажность\n - $cps$ : Давление\n - $cv$ : Видимость\n - $cdp$ : Точка росы\n - \n - $l$ : Местоположение\n - $lat$ : Широта\n - $lon$ : Долгота\n - $ut$ : Время обновления\n - $d$ : Дата\n - $lc$ : Лунный календарь\n - $w$ : Неделя\n - $ws$ : Неделя (Кратко)\n - $dd$ : Дневной подробный\n - $hd$ : Почасовой подробный\n - $enter$ : Enter\n - \n - $0dw$, $1dw$, …, $4dw$ : \nПогода сегодня днём, завтра, …, на 4 дня\n - \n - $0nw$, $1nw$, …, $4nw$ : \nПогода сегодня ночью, завтра, …, на 4 дня\n - \n - $0dt$, $1dt$, …, $4dt$ : \nДневная температура сегодня, завтра, …, на 4 дня (℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \nНочная температура сегодня, завтра, …, на 4 дня (℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \nДневная температура сегодня, завтра, …, на 4 дня (°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \nНочная температура сегодня, завтра, …, на 4 дня (°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \nОсадки днём, завтра, …, на 4 дня (%)\n - \n - $0np$, $1np$, …, $4np$ : \nОсадки ночью, завтра, …, на 4 дня (%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \nВетер днём, завтра, …, на 4 дня\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \nВетер ночью, завтра, …, 4 на 4 дня\n - \n - $0sr$, $1sr$, …, $4sr$ : \nВосход, завтра, …, на 4 дня\n - \n - $0ss$, $1ss$, …, $4ss$ : \nЗакат, завтра, …, на 4 дня\n - \n - $0mr$, $1mr$, …, $4mr$ : \nВосход Луны, …, на 4 дня\n - \n - $0ms$, $1ms$, …, $4ms$ : \nЗакат Луны, завтра, …, на 4 дня\n - \n - $0mp$, $1mp$, …, $4mp$ : \nФаза Луны, завтра, …, на 4 дня\n - + + $cw$ : Погода сейчас\n + $ct$ : Текущая температура (℃/℉)\n + $ctd$ : Текущая температура (°)\n + $at$ : Ощущается как (℃/℉)\n + $atd$ : Ощущается как (°)\n + $cpb$ : Вероятность осадков (%)\n + $cp$ : Вероятность осадков (mm/L/m²)\n + $cwd$ : Ветер\n + $cuv$ : УФ-индекс\n + $ch$ : Влажность\n + $cps$ : Давление\n + $cv$ : Видимость\n + $cdp$ : Точка росы\n + $l$ : Местоположение\n + $lat$ : Широта\n + $lon$ : Долгота\n + $ut$ : Время обновления\n + $d$ : Дата\n + $lc$ : Лунный календарь\n + $w$ : Неделя\n + $ws$ : Неделя (Кратко)\n + $dd$ : Дневной подробный\n + $hd$ : Почасовой подробный\n + $0dw$, $1dw$, …, $4dw$ : \nПогода сегодня днём, завтра, …, на 4 дня\n + $0nw$, $1nw$, …, $4nw$ : \nПогода сегодня ночью, завтра, …, на 4 дня\n + $0dt$, $1dt$, …, $4dt$ : \nДневная температура сегодня, завтра, …, на 4 дня (℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \nНочная температура сегодня, завтра, …, на 4 дня (℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \nДневная температура сегодня, завтра, …, на 4 дня (°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \nНочная температура сегодня, завтра, …, на 4 дня (°)\n + $0dp$, $1dp$, …, $4dp$ : \nОсадки днём, завтра, …, на 4 дня (%)\n + $0np$, $1np$, …, $4np$ : \nОсадки ночью, завтра, …, на 4 дня (%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \nВетер днём, завтра, …, на 4 дня\n + $0nwd$, $1nwd$, …, $4nwd$ : \nВетер ночью, завтра, …, 4 на 4 дня\n + $0sr$, $1sr$, …, $4sr$ : \nВосход, завтра, …, на 4 дня\n + $0ss$, $1ss$, …, $4ss$ : \nЗакат, завтра, …, на 4 дня\n + $0mr$, $1mr$, …, $4mr$ : \nВосход Луны, …, на 4 дня\n + $0ms$, $1ms$, …, $4ms$ : \nЗакат Луны, завтра, …, на 4 дня\n + $0mp$, $1mp$, …, $4mp$ : \nФаза Луны, завтра, …, на 4 дня\n Погода Время diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 2fb51ce2b..2d98d7b72 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -181,64 +181,48 @@ 文字尺寸 时钟字体 可输入任何内容,但请注意内容长度。若需使用天气数据,可以通过使用$来引用相应的关键字来实现。\n\n例如:若输入\"天气为$cw$\",副标题将显示为\"天气为晴\"。 - - \n - $cw$ : 当天天气\n - $ct$ : 当前温度 (℃/℉)\n - $ctd$ : 当前温度 (°)\n - $at$ : 体感温度(℃/℉)\n - $atd$ : 体感温度(°)\n - $cpb$ : 当前降水概率 (%)\n - $cp$ : 当前降水量 (mm/L/m²)\n - $cwd$ : 当前风况\n - $cuv$ : 当前紫外线\n - $ch$ : 当前湿度\n - $cps$ : 当前气压\n - $cv$ : 当前能见度\n - $cdp$ : 当前露点\n - \n - $l$ : 地址\n - $lat$ : 纬度\n - $lon$ : 经度\n - $ut$ : 更新时间\n - $d$ : 日期\n - $lc$ : 农历\n - $w$ : 星期\n - $ws$ : 星期(短)\n - $dd$ : 每日概览\n - $hd$ : 小时概览\n - $enter$ : 换行\n - \n - $0dw$, $1dw$, …, $4dw$ : \n今日白天天气,明日,……,4天后\n - \n - $0nw$, $1nw$, …, $4nw$ : \n今日夜间天气,明日,……,4天后\n - \n - $0dt$, $1dt$, …, $4dt$ : \n今日白天温度,明日,……,4天后(℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \n今日夜间温度,明日,……,4天后(℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \n今日白天温度,明日,……,4天后(°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \n今日夜间温度,明日,……,4天后(°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \n今日白天降水概率,明日,……,4天后(%)\n - \n - $0np$, $1np$, …, $4np$ : \n今日夜间降水概率,明日,……,4天后(%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \n今日白天风况,明日,……,4天后\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \n今日夜间风况,明日,……,4天后\n - \n - $0sr$, $1sr$, …, $4sr$ : \n今日日出时间,明日,……,4天后\n - \n - $0ss$, $1ss$, …, $4ss$ : \n今日日落时间,明日,……,4天后\n - \n - $0mr$, $1mr$, …, $4mr$ : \n今日月出时间,明日,……,4天后\n - \n - $0ms$, $1ms$, …, $4ms$ : \n今日月落时间,明日,……,4天后\n - \n - $0mp$, $1mp$, …, $4mp$ : \n今日月相,明日,……,4天后\n - + + $cw$ : 当天天气\n + $ct$ : 当前温度 (℃/℉)\n + $ctd$ : 当前温度 (°)\n + $at$ : 体感温度(℃/℉)\n + $atd$ : 体感温度(°)\n + $cpb$ : 当前降水概率 (%)\n + $cp$ : 当前降水量 (mm/L/m²)\n + $cwd$ : 当前风况\n + $cuv$ : 当前紫外线\n + $ch$ : 当前湿度\n + $cps$ : 当前气压\n + $cv$ : 当前能见度\n + $cdp$ : 当前露点\n + $al$ : 预警\n + $als$ : 预警 (短格式)\n + $l$ : 地址\n + $lat$ : 纬度\n + $lon$ : 经度\n + $ut$ : 更新时间\n + $d$ : 日期\n + $lc$ : 农历\n + $w$ : 星期\n + $ws$ : 星期(短)\n + $dd$ : 每日概览\n + $hd$ : 小时概览\n + $enter$ : 换行\n + $0dw$, $1dw$, …, $4dw$ : \n今日白天天气,明日,……,4天后\n + $0nw$, $1nw$, …, $4nw$ : \n今日夜间天气,明日,……,4天后\n + $0dt$, $1dt$, …, $4dt$ : \n今日白天温度,明日,……,4天后(℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \n今日夜间温度,明日,……,4天后(℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \n今日白天温度,明日,……,4天后(°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \n今日夜间温度,明日,……,4天后(°)\n + $0dp$, $1dp$, …, $4dp$ : \n今日白天降水概率,明日,……,4天后(%)\n + $0np$, $1np$, …, $4np$ : \n今日夜间降水概率,明日,……,4天后(%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \n今日白天风况,明日,……,4天后\n + $0nwd$, $1nwd$, …, $4nwd$ : \n今日夜间风况,明日,……,4天后\n + $0sr$, $1sr$, …, $4sr$ : \n今日日出时间,明日,……,4天后\n + $0ss$, $1ss$, …, $4ss$ : \n今日日落时间,明日,……,4天后\n + $0mr$, $1mr$, …, $4mr$ : \n今日月出时间,明日,……,4天后\n + $0ms$, $1ms$, …, $4ms$ : \n今日月落时间,明日,……,4天后\n + $0mp$, $1mp$, …, $4mp$ : \n今日月相,明日,……,4天后\n 天气 时间 @@ -329,6 +313,9 @@ 图标风格 卡片显示 卡片顺序 + 每日趋势顺序 + 趋势图横线 + 交换日间夜间温度 重力感应 列表动画 组件动画 @@ -353,6 +340,7 @@ 一周天气图标样式 Minimal图标 点击小部件时进行刷新 + 配置小部件 通知 开启天气通知 通知风格 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index c193083ef..64204f73d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -33,7 +33,7 @@ 發布於 體感 跟隨系統 - 後臺信息 + 後台信息 氣壓 能見度 露點 @@ -43,20 +43,20 @@ 從應用商店獲取更多 從GitHub獲取更多 刷新數據 - 重啓 + 重啟 編輯 昨日 明日 - - 周一 - 周二 - 周三 - 周四 - 周五 - 周六 - 周日 + + 週一 + 週二 + 週三 + 週四 + 週五 + 週六 + 週日 體感溫度 陰面體感 @@ -123,9 +123,9 @@ 下一步 完成 取消 - 開啓 + 開啟 關閉 - 設置 + 設定 幫助 瞭解更多 @@ -160,7 +160,7 @@ 授權 位置信息 - 正在後臺進行定位 + 正在後台進行定位 獲取位置權限成功 獲取位置權限失敗 @@ -168,7 +168,7 @@ 獲取天氣數據失敗 無法正常進行定位? 檢查位置權限 - 開啓位置信息 + 開啟位置信息 選擇位置信息提供商 手動添加城市並刪除“$” @@ -180,110 +180,94 @@ 暗色字體 文字尺寸 時鐘字體 - 可以鍵入任何内容,但請注意内容長度。若需要使用天氣數據,可以通過使用$來引用相應關鍵字來實現。\n\n例如:若鍵入\"天氣為$cw$\",副標題將顯示爲\"天氣為晴\"。 - - \n - $cw$ : 當天天氣\n - $ct$ : 當前溫度 (℃/℉)\n - $ctd$ : 當前溫度 (°)\n - $at$ : 體感溫度(℃/℉)\n - $atd$ : 體感溫度(°)\n - $cpb$ : 當前降水概率 (%)\n - $cp$ : 當前降水量 (mm/L/m²)\n - $cwd$ : 當前風況\n - $cuv$ : 當前紫外綫\n - $ch$ : 當前濕度\n - $cps$ : 當前氣壓\n - $cv$ : 當前能見度\n - $cdp$ : 當前露點\n - \n - $l$ : 地址\n - $lat$ : 緯度\n - $lon$ : 經度\n - $ut$ : 更新時間\n - $d$ : 日期\n - $lc$ : 農曆\n - $w$ : 星期\n - $ws$ : 星期(短)\n - $dd$ : 每日概覽\n - $hd$ : 小時概覽\n - $enter$ : 回車\n - \n - $0dw$, $1dw$, …, $4dw$ : \n今日白天天氣,明日,……,4天后\n - \n - $0nw$, $1nw$, …, $4nw$ : \n今日夜間天氣,明日,……,4天后\n - \n - $0dt$, $1dt$, …, $4dt$ : \n今日白天溫度,明日,……,4天后(℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \n今日夜間溫度,明日,……,4天后(℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \n今日白天溫度,明日,……,4天后(°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \n今日夜間溫度,明日,……,4天后(°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \n今日白天降水概率,明日,……,4天后(%)\n - \n - $0np$, $1np$, …, $4np$ : \n今日夜間降水概率,明日,……,4天后(%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \n今日白天風況,明日,……,4天后\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \n今日夜間風況,明日,……,4天后\n - \n - $0sr$, $1sr$, …, $4sr$ : \n今日日出時間,明日,……,4天后\n - \n - $0ss$, $1ss$, …, $4ss$ : \n今日日落時間,明日,……,4天后\n - \n - $0mr$, $1mr$, …, $4mr$ : \n今日月出時間,明日,……,4天后\n - \n - $0ms$, $1ms$, …, $4ms$ : \n今日月落時間,明日,……,4天后\n - \n - $0mp$, $1mp$, …, $4mp$ : \n今日月相,明日,……,4天后\n - + 可以鍵入任何内容,但請注意内容長度。若需要使用天氣數據,可以通過使用$來引用相應關鍵字來實現。\n\n例如:若鍵入\"天氣為$cw$\",副標題將顯示為\"天氣為晴\"。 + + $cw$ : 當天天氣\n + $ct$ : 當前溫度 (℃/℉)\n + $ctd$ : 當前溫度 (°)\n + $at$ : 體感溫度(℃/℉)\n + $atd$ : 體感溫度(°)\n + $cpb$ : 當前降水概率 (%)\n + $cp$ : 當前降水量 (mm/L/m²)\n + $cwd$ : 當前風況\n + $cuv$ : 當前紫外綫\n + $ch$ : 當前濕度\n + $cps$ : 當前氣壓\n + $cv$ : 當前能見度\n + $cdp$ : 當前露點\n + $al$ : 預警\n + $als$ : 預警 (短格式)\n + $l$ : 地址\n + $lat$ : 緯度\n + $lon$ : 經度\n + $ut$ : 更新時間\n + $d$ : 日期\n + $lc$ : 農曆\n + $w$ : 星期\n + $ws$ : 星期(短)\n + $dd$ : 每日概覽\n + $hd$ : 小時概覽\n + $enter$ : 回車\n + $0dw$, $1dw$, …, $4dw$ : \n今日白天天氣,明日,……,4天後\n + $0nw$, $1nw$, …, $4nw$ : \n今日夜間天氣,明日,……,4天後\n + $0dt$, $1dt$, …, $4dt$ : \n今日白天溫度,明日,……,4天後(℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \n今日夜間溫度,明日,……,4天後(℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \n今日白天溫度,明日,……,4天後(°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \n今日夜間溫度,明日,……,4天後(°)\n + $0dp$, $1dp$, …, $4dp$ : \n今日白天降水概率,明日,……,4天後(%)\n + $0np$, $1np$, …, $4np$ : \n今日夜間降水概率,明日,……,4天後(%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \n今日白天風況,明日,……,4天後\n + $0nwd$, $1nwd$, …, $4nwd$ : \n今日夜間風況,明日,……,4天後\n + $0sr$, $1sr$, …, $4sr$ : \n今日日出時間,明日,……,4天後\n + $0ss$, $1ss$, …, $4ss$ : \n今日日落時間,明日,……,4天後\n + $0mr$, $1mr$, …, $4mr$ : \n今日月出時間,明日,……,4天後\n + $0ms$, $1ms$, …, $4ms$ : \n今日月落時間,明日,……,4天後\n + $0mp$, $1mp$, …, $4mp$ : \n今日月相,明日,……,4天後\n 天氣 時間 - + 點擊趨勢圖可切換數據 暫無數據 地址已存在 收藏成功 刪除成功 - 收藏地質不能爲空 + 收藏地質不能留空 鍵入一個地址… 尚未進行定位… - 搜索結果爲空… + 搜索結果為空… 初始化中… - 返回主頁后刷新通知 + 返回主頁後刷新通知 立即刷新通知 - 下次刷新后生效 - 重啓后生效 + 下次刷新後生效 + 重啟後生效 請重新添加地址 - 更換數據源后需重新添加地址 + 更換數據源後需重新添加地址 - 正在後臺運行以保持更新數據 + 正在後台運行以保持更新數據 正在更新天氣數據 - 已在後臺完成更新 + 已在後台完成更新 - 關閉後臺純净后,部分設備的通知欄中可能會出現一個無法清除的通知 + 關閉後台純净後,部分設備的通知欄中可能會出現一個無法清除的通知 關閉相應通知頻道 - 關閉後臺純净后,會出現一個標示後臺服務正在運行的通知,你可以在app相關頁面中找到通知設置,在其中關閉“後臺信息”這個頻道來隱藏這個通知 + 關閉後台純净後,會出現一個標示後台服務正在運行的通知,你可以在app相關頁面中找到通知設定,在其中關閉“後台信息”這個頻道來隱藏這個通知 忽略電池優化 - 爲了保證後臺服務能夠持續工作,請為集合天氣選擇忽略電池優化 + 為了保證後台服務能夠持續工作,請為集合天氣選擇忽略電池優化 - 無法啓動動態壁紙預覽程序 + 無法啟動動態壁紙預覽程序 - 本設備不包含有效的地址解析服務,已將位置提供商更改爲百度定位 - 地址解析服務,是一種將Android原生定位結果從經緯度格式轉換至XX省XX市XX區格式的服務組件。若缺少這項服務,在使用原生API作爲位置提供商時,只能通過AccuWeather獲取數據。 + 本設備不包含有效的地址解析服務,已將位置提供商更改為百度定位 + 地址解析服務,是一種將Android原生定位結果從經緯度格式轉換至XX省XX市XX區格式的服務組件。若缺少這項服務,在使用原生API作為位置提供商時,只能通過AccuWeather獲取數據。 今日可能出現降水 未來幾小時内可能出現降水 - 設置為常駐城市 - 常駐城市的天氣將會根據您當前的位置來進行顯示和隱藏。\n例如將家鄉設置爲常駐城市後,可以在旅途中查看家鄉天氣,而在歸家后,家鄉的天氣數據將會被當前位置所替代並進行隱藏。 + 設定為常駐城市 + 常駐城市的天氣將會根據您當前的位置來進行顯示和隱藏。\n例如將家鄉設定為常駐城市後,可以在旅途中查看家鄉天氣,而在歸家後,家鄉的天氣數據將會被當前位置所替代並進行隱藏。 點擊可獲取更多… @@ -291,19 +275,19 @@ 預警 地址管理 搜索 - 設置 + 設定 預覽 關於 應用商店 今日 - 一周 - 今日 + 一周 + 一週 + 今日 + 一週 時鐘 + 今日 (水平排列) 時鐘 + 今日 (詳情) 時鐘 + 今日 (垂直排列) - 時鐘 + 今日 + 一周 + 時鐘 + 今日 + 一週 純文字 每日趨勢 小時趨勢 @@ -313,11 +297,11 @@ 基礎 - 後臺純净 - 開啓\n若小部件和天氣通知無法自動更新,請關閉該選項 - 關閉\n若不希望任何服務在後臺常駐,請開啓該選項 + 後台純净 + 開啟\n若小部件和天氣通知無法自動更新,請關閉該選項 + 關閉\n若不希望任何服務在後台常駐,請開啟該選項 動態壁紙 - 將Material天氣動畫設置爲動態壁紙 + 將Material天氣動畫設定為動態壁紙 數據提供商 選擇天氣數據和位置信息的數據提供商 天氣源 @@ -329,12 +313,14 @@ 圖標風格 卡片顯示 卡片順序 + 趨勢圖橫綫 + 交換日間夜間氣溫 重力感應 列表動畫 組件動畫 語言 單位 - 設置天氣數據的單位 + 設定天氣數據的單位 溫度單位 距離單位 降水單位 @@ -343,20 +329,20 @@ 自動刷新頻率 推送預警通知 推送降水預報 - 後臺服務常駐 + 後台服務常駐 預報 定時預報(今日天氣) 設定預報時間(今日天氣) 定時預報(明日天氣) 設定預報時間(明日天氣) 小部件 - 一周天氣圖標樣式 + 一週天氣圖標樣式 Minimal圖標 點擊小部件時進行刷新 通知 - 開啓天氣通知 + 開啟天氣通知 通知風格 - 將溫度作爲通知小圖標 + 將溫度作為通知小圖標 通知顔色 自定義通知顔色 天氣通知字體顔色 @@ -369,10 +355,10 @@ 隱藏通知圖標 顯示通知圖標 隱藏鎖屏通知 - 在鎖屏界面隱藏(需在系統設置中隱藏敏感通知) + 在鎖屏界面隱藏(需在系統設定中隱藏敏感通知) 在鎖屏界面顯示 隱藏大視圖 隱藏 顯示 - + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1b5014b9b..64204f73d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -17,8 +17,8 @@ 時間 白天 夜間 - 風況 氣溫 + 風況 風向 風速 風力 @@ -33,7 +33,7 @@ 發布於 體感 跟隨系統 - 後臺信息 + 後台信息 氣壓 能見度 露點 @@ -43,20 +43,20 @@ 從應用商店獲取更多 從GitHub獲取更多 刷新數據 - 重啓 + 重啟 編輯 昨日 明日 - - 周一 - 周二 - 周三 - 周四 - 周五 - 周六 - 周日 + + 週一 + 週二 + 週三 + 週四 + 週五 + 週六 + 週日 體感溫度 陰面體感 @@ -123,16 +123,16 @@ 下一步 完成 取消 - 開啓 + 開啟 關閉 - 設置 + 設定 幫助 瞭解更多 概覽 介紹 E-mail - 捐贈 (支付寶) + 捐贈 GitHub 譯者 鳴謝 @@ -160,7 +160,7 @@ 授權 位置信息 - 正在後臺進行定位 + 正在後台進行定位 獲取位置權限成功 獲取位置權限失敗 @@ -168,7 +168,7 @@ 獲取天氣數據失敗 無法正常進行定位? 檢查位置權限 - 開啓位置信息 + 開啟位置信息 選擇位置信息提供商 手動添加城市並刪除“$” @@ -180,65 +180,49 @@ 暗色字體 文字尺寸 時鐘字體 - 可以鍵入任何内容,但請注意内容長度。若需要使用天氣數據,可以通過使用$來引用相應關鍵字來實現。\n\n例如:若鍵入\"天氣為$cw$\",副標題將顯示爲\"天氣為晴\"。 - - \n - $cw$ : 當天天氣\n - $ct$ : 當前溫度 (℃/℉)\n - $ctd$ : 當前溫度 (°)\n - $at$ : 體感溫度(℃/℉)\n - $atd$ : 體感溫度(°)\n - $cpb$ : 當前降水概率 (%)\n - $cp$ : 當前降水量 (mm/L/m²)\n - $cwd$ : 當前風況\n - $cuv$ : 當前紫外綫\n - $ch$ : 當前濕度\n - $cps$ : 當前氣壓\n - $cv$ : 當前能見度\n - $cdp$ : 當前露點\n - \n - $l$ : 地址\n - $lat$ : 緯度\n - $lon$ : 經度\n - $ut$ : 更新時間\n - $d$ : 日期\n - $lc$ : 農曆\n - $w$ : 星期\n - $ws$ : 星期(短)\n - $dd$ : 每日概覽\n - $hd$ : 小時概覽\n - $enter$ : 回車\n - \n - $0dw$, $1dw$, …, $4dw$ : \n今日白天天氣,明日,……,4天后\n - \n - $0nw$, $1nw$, …, $4nw$ : \n今日夜間天氣,明日,……,4天后\n - \n - $0dt$, $1dt$, …, $4dt$ : \n今日白天溫度,明日,……,4天后(℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \n今日夜間溫度,明日,……,4天后(℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \n今日白天溫度,明日,……,4天后(°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \n今日夜間溫度,明日,……,4天后(°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \n今日白天降水概率,明日,……,4天后(%)\n - \n - $0np$, $1np$, …, $4np$ : \n今日夜間降水概率,明日,……,4天后(%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \n今日白天風況,明日,……,4天后\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \n今日夜間風況,明日,……,4天后\n - \n - $0sr$, $1sr$, …, $4sr$ : \n今日日出時間,明日,……,4天后\n - \n - $0ss$, $1ss$, …, $4ss$ : \n今日日落時間,明日,……,4天后\n - \n - $0mr$, $1mr$, …, $4mr$ : \n今日月出時間,明日,……,4天后\n - \n - $0ms$, $1ms$, …, $4ms$ : \n今日月落時間,明日,……,4天后\n - \n - $0mp$, $1mp$, …, $4mp$ : \n今日月相,明日,……,4天后\n - + 可以鍵入任何内容,但請注意内容長度。若需要使用天氣數據,可以通過使用$來引用相應關鍵字來實現。\n\n例如:若鍵入\"天氣為$cw$\",副標題將顯示為\"天氣為晴\"。 + + $cw$ : 當天天氣\n + $ct$ : 當前溫度 (℃/℉)\n + $ctd$ : 當前溫度 (°)\n + $at$ : 體感溫度(℃/℉)\n + $atd$ : 體感溫度(°)\n + $cpb$ : 當前降水概率 (%)\n + $cp$ : 當前降水量 (mm/L/m²)\n + $cwd$ : 當前風況\n + $cuv$ : 當前紫外綫\n + $ch$ : 當前濕度\n + $cps$ : 當前氣壓\n + $cv$ : 當前能見度\n + $cdp$ : 當前露點\n + $al$ : 預警\n + $als$ : 預警 (短格式)\n + $l$ : 地址\n + $lat$ : 緯度\n + $lon$ : 經度\n + $ut$ : 更新時間\n + $d$ : 日期\n + $lc$ : 農曆\n + $w$ : 星期\n + $ws$ : 星期(短)\n + $dd$ : 每日概覽\n + $hd$ : 小時概覽\n + $enter$ : 回車\n + $0dw$, $1dw$, …, $4dw$ : \n今日白天天氣,明日,……,4天後\n + $0nw$, $1nw$, …, $4nw$ : \n今日夜間天氣,明日,……,4天後\n + $0dt$, $1dt$, …, $4dt$ : \n今日白天溫度,明日,……,4天後(℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \n今日夜間溫度,明日,……,4天後(℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \n今日白天溫度,明日,……,4天後(°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \n今日夜間溫度,明日,……,4天後(°)\n + $0dp$, $1dp$, …, $4dp$ : \n今日白天降水概率,明日,……,4天後(%)\n + $0np$, $1np$, …, $4np$ : \n今日夜間降水概率,明日,……,4天後(%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \n今日白天風況,明日,……,4天後\n + $0nwd$, $1nwd$, …, $4nwd$ : \n今日夜間風況,明日,……,4天後\n + $0sr$, $1sr$, …, $4sr$ : \n今日日出時間,明日,……,4天後\n + $0ss$, $1ss$, …, $4ss$ : \n今日日落時間,明日,……,4天後\n + $0mr$, $1mr$, …, $4mr$ : \n今日月出時間,明日,……,4天後\n + $0ms$, $1ms$, …, $4ms$ : \n今日月落時間,明日,……,4天後\n + $0mp$, $1mp$, …, $4mp$ : \n今日月相,明日,……,4天後\n 天氣 時間 @@ -249,41 +233,41 @@ 地址已存在 收藏成功 刪除成功 - 收藏地質不能爲空 + 收藏地質不能留空 鍵入一個地址… 尚未進行定位… - 搜索結果爲空… + 搜索結果為空… 初始化中… - 返回主頁后刷新通知 + 返回主頁後刷新通知 立即刷新通知 - 下次刷新后生效 - 重啓后生效 + 下次刷新後生效 + 重啟後生效 請重新添加地址 - 更換數據源后需重新添加地址 + 更換數據源後需重新添加地址 - 正在後臺運行以保持更新數據 + 正在後台運行以保持更新數據 正在更新天氣數據 - 已在後臺完成更新 + 已在後台完成更新 - 關閉後臺純净后,部分設備的通知欄中可能會出現一個無法清除的通知 + 關閉後台純净後,部分設備的通知欄中可能會出現一個無法清除的通知 關閉相應通知頻道 - 關閉後臺純净后,會出現一個標示後臺服務正在運行的通知,你可以在app相關頁面中找到通知設置,在其中關閉“後臺信息”這個頻道來隱藏這個通知 + 關閉後台純净後,會出現一個標示後台服務正在運行的通知,你可以在app相關頁面中找到通知設定,在其中關閉“後台信息”這個頻道來隱藏這個通知 忽略電池優化 - 爲了保證後臺服務能夠持續工作,請為集合天氣選擇忽略電池優化 + 為了保證後台服務能夠持續工作,請為集合天氣選擇忽略電池優化 - 無法啓動動態壁紙預覽程序 + 無法啟動動態壁紙預覽程序 - 本設備不包含有效的地址解析服務,已將位置提供商更改爲百度定位 - 地址解析服務,是一種將Android原生定位結果從經緯度格式轉換至XX省XX市XX區格式的服務組件。若缺少這項服務,在使用原生API作爲位置提供商時,只能通過AccuWeather獲取數據。 + 本設備不包含有效的地址解析服務,已將位置提供商更改為百度定位 + 地址解析服務,是一種將Android原生定位結果從經緯度格式轉換至XX省XX市XX區格式的服務組件。若缺少這項服務,在使用原生API作為位置提供商時,只能通過AccuWeather獲取數據。 今日可能出現降水 未來幾小時内可能出現降水 - 設置為常駐城市 - 常駐城市的天氣將會根據您當前的位置來進行顯示和隱藏。\n例如將家鄉設置爲常駐城市後,可以在旅途中查看家鄉天氣,而在歸家后,家鄉的天氣數據將會被當前位置所替代並進行隱藏。 + 設定為常駐城市 + 常駐城市的天氣將會根據您當前的位置來進行顯示和隱藏。\n例如將家鄉設定為常駐城市後,可以在旅途中查看家鄉天氣,而在歸家後,家鄉的天氣數據將會被當前位置所替代並進行隱藏。 點擊可獲取更多… @@ -291,19 +275,19 @@ 預警 地址管理 搜索 - 設置 + 設定 預覽 關於 應用商店 今日 - 一周 - 今日 + 一周 + 一週 + 今日 + 一週 時鐘 + 今日 (水平排列) 時鐘 + 今日 (詳情) 時鐘 + 今日 (垂直排列) - 時鐘 + 今日 + 一周 + 時鐘 + 今日 + 一週 純文字 每日趨勢 小時趨勢 @@ -313,11 +297,11 @@ 基礎 - 後臺純净 - 開啓\n若小部件和天氣通知無法自動更新,請關閉該選項 - 關閉\n若不希望任何服務在後臺常駐,請開啓該選項 + 後台純净 + 開啟\n若小部件和天氣通知無法自動更新,請關閉該選項 + 關閉\n若不希望任何服務在後台常駐,請開啟該選項 動態壁紙 - 將Material天氣動畫設置爲動態壁紙 + 將Material天氣動畫設定為動態壁紙 數據提供商 選擇天氣數據和位置信息的數據提供商 天氣源 @@ -329,34 +313,36 @@ 圖標風格 卡片顯示 卡片順序 + 趨勢圖橫綫 + 交換日間夜間氣溫 重力感應 列表動畫 組件動畫 - 推送預警通知 - 推送降水預報 語言 單位 - 設置天氣數據的單位 + 設定天氣數據的單位 溫度單位 距離單位 降水單位 壓力單位 速度單位 自動刷新頻率 - 後臺服務常駐 + 推送預警通知 + 推送降水預報 + 後台服務常駐 預報 定時預報(今日天氣) 設定預報時間(今日天氣) 定時預報(明日天氣) 設定預報時間(明日天氣) 小部件 - 一周天氣圖標樣式 + 一週天氣圖標樣式 Minimal圖標 點擊小部件時進行刷新 通知 - 開啓天氣通知 + 開啟天氣通知 通知風格 - 將溫度作爲通知小圖標 + 將溫度作為通知小圖標 通知顔色 自定義通知顔色 天氣通知字體顔色 @@ -369,10 +355,10 @@ 隱藏通知圖標 顯示通知圖標 隱藏鎖屏通知 - 在鎖屏界面隱藏(需在系統設置中隱藏敏感通知) + 在鎖屏界面隱藏(需在系統設定中隱藏敏感通知) 在鎖屏界面顯示 隱藏大視圖 隱藏 顯示 - + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 3ba71b4f3..120f53f41 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -79,6 +79,7 @@ Polski 한국어 Ελληνικά + 日本語 follow_system @@ -104,6 +105,7 @@ polish korean greek + japanese @@ -312,7 +314,7 @@ km/h m/s kn - mi/h + mph ft/s @@ -341,6 +343,16 @@ K + + ° + ° + K + + + °C + °F + K + c f diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 644ba7753..b68f703fe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,7 +26,7 @@ Wind Wind direction Wind speed - Wind gage + Wind gauge Sensible temp Humidity UV index @@ -84,8 +84,8 @@ Moderate breeze Fresh breeze Strong breeze - Near breeze - Gale + Moderate gale + Fresh gale Strong gale Storm Violent storm @@ -204,64 +204,47 @@ You can input anything, but please pay attention to the length of the text. If you want to quote weather data, please use $ to reference the corresponding keyword.\n\nFor example, \"current weather = $cw$\" will be displayed as \"current weather = Clear Day\". - - \n - $cw$ : Current Weather\n - $ct$ : Current Temperature (℃/℉)\n - $ctd$ : Current Temperature (°)\n - $at$ : Apparent Temperature (℃/℉)\n - $atd$ : Apparent Temperature (°)\n - $cpb$ : Current Precipitation Probability (%)\n - $cp$ : Current Precipitation (mm/L/m²)\n - $cwd$ : Current Wind\n - $cuv$ : Current UV\n - $ch$ : Current Humidity\n - $cps$ : Current Pressure\n - $cv$ : Current Visibility\n - $cdp$ : Current DewPoint\n - \n - $l$ : Location\n - $lat$ : Latitude\n - $lon$ : Longitude\n - $ut$ : Update Time\n - $d$ : Date\n - $lc$ : Lunar Calendar\n - $w$ : Week\n - $ws$ : Week (Short)\n - $dd$ : Daily Description\n - $hd$ : Hourly Description\n - $enter$ : Enter\n - \n - $0dw$, $1dw$, …, $4dw$ : \nDaytime Weather of Today, Tmw, …, 4 days later\n - \n - $0nw$, $1nw$, …, $4nw$ : \nNighttime Weather of Today, Tmw, …, 4 days later\n - \n - $0dt$, $1dt$, …, $4dt$ : \nDaytime Temperature of Today, Tmw, …, 4 days later (℃/℉)\n - \n - $0nt$, $1nt$, …, $4nt$ : \nNighttime Temperature of Today, Tmw, …, 4 days later (℃/℉)\n - \n - $0dtd$, $1dtd$, …, $4dtd$ : \nDaytime Temperature of Today, Tmw, …, 4 days later (°)\n - \n - $0ntd$, $1ntd$, …, $4ntd$ : \nNighttime Temperature of Today, Tmw, …, 4 days later (°)\n - \n - $0dp$, $1dp$, …, $4dp$ : \nDaytime Precipitation of Today, Tmw, …, 4 days later (%)\n - \n - $0np$, $1np$, …, $4np$ : \nNighttime Precipitation of Today, Tmw, …, 4 days later (%)\n - \n - $0dwd$, $1dwd$, …, $4dwd$ : \nDaytime Wind of Today, Tmw, …, 4 days later\n - \n - $0nwd$, $1nwd$, …, $4nwd$ : \nNighttime Wind of Today, Tmw, …, 4 days later\n - \n - $0sr$, $1sr$, …, $4sr$ : \nSunrise of Today, Tmw, …, 4 days later\n - \n - $0ss$, $1ss$, …, $4ss$ : \nSunset of Today, Tmw, …, 4 days later\n - \n - $0mr$, $1mr$, …, $4mr$ : \nMoonrise of Today, Tmw, …, 4 days later\n - \n - $0ms$, $1ms$, …, $4ms$ : \nMoonset of Today, Tmw, …, 4 days later\n - \n - $0mp$, $1mp$, …, $4mp$ : \nMoon Phase of Today, Tmw, …, 4 days later\n - + $cw$ : Current Weather\n + $ct$ : Current Temperature (℃/℉)\n + $ctd$ : Current Temperature (°)\n + $at$ : Apparent Temperature (℃/℉)\n + $atd$ : Apparent Temperature (°)\n + $cpb$ : Current Precipitation Probability (%)\n + $cp$ : Current Precipitation (mm/L/m²)\n + $cwd$ : Current Wind\n + $cuv$ : Current UV\n + $ch$ : Current Humidity\n + $cps$ : Current Pressure\n + $cv$ : Current Visibility\n + $cdp$ : Current DewPoint\n + $al$ : Alerts\n + $als$ : Alerts (Short)\n + $l$ : Location\n + $lat$ : Latitude\n + $lon$ : Longitude\n + $ut$ : Update Time\n + $d$ : Date\n + $lc$ : Lunar Calendar\n + $w$ : Week\n + $ws$ : Week (Short)\n + $dd$ : Daily Description\n + $hd$ : Hourly Description\n + $enter$ : Enter\n + $0dw$, $1dw$, …, $4dw$ : \nDaytime Weather of Today, Tmw, …, 4 days later\n + $0nw$, $1nw$, …, $4nw$ : \nNighttime Weather of Today, Tmw, …, 4 days later\n + $0dt$, $1dt$, …, $4dt$ : \nDaytime Temperature of Today, Tmw, …, 4 days later (℃/℉)\n + $0nt$, $1nt$, …, $4nt$ : \nNighttime Temperature of Today, Tmw, …, 4 days later (℃/℉)\n + $0dtd$, $1dtd$, …, $4dtd$ : \nDaytime Temperature of Today, Tmw, …, 4 days later (°)\n + $0ntd$, $1ntd$, …, $4ntd$ : \nNighttime Temperature of Today, Tmw, …, 4 days later (°)\n + $0dp$, $1dp$, …, $4dp$ : \nDaytime Precipitation of Today, Tmw, …, 4 days later (%)\n + $0np$, $1np$, …, $4np$ : \nNighttime Precipitation of Today, Tmw, …, 4 days later (%)\n + $0dwd$, $1dwd$, …, $4dwd$ : \nDaytime Wind of Today, Tmw, …, 4 days later\n + $0nwd$, $1nwd$, …, $4nwd$ : \nNighttime Wind of Today, Tmw, …, 4 days later\n + $0sr$, $1sr$, …, $4sr$ : \nSunrise of Today, Tmw, …, 4 days later\n + $0ss$, $1ss$, …, $4ss$ : \nSunset of Today, Tmw, …, 4 days later\n + $0mr$, $1mr$, …, $4mr$ : \nMoonrise of Today, Tmw, …, 4 days later\n + $0ms$, $1ms$, …, $4ms$ : \nMoonset of Today, Tmw, …, 4 days later\n + $0mp$, $1mp$, …, $4mp$ : \nMoon Phase of Today, Tmw, …, 4 days later\n Weather Time @@ -312,6 +295,7 @@ GeometricWeather will automatically show and hide resident cities based on your current location.\nFor example, you can set your hometown as a resident city. You can check the weather in your hometown while you are traveling. When you get home, the weather in your hometown will be hidden and replaced by the weather for your current location. Click to get more… + Click again to exit Alert @@ -354,6 +338,9 @@ Appearance Interface style, card order, language… Displayed cards + Display daily trend + Horizontal lines in trend + Exchange day night temperature Card order Gravity sensor List animation @@ -379,6 +366,7 @@ Weekly icons mode Minimalistic icons Refresh widget when clicked + Widget config Notification Send Notification Notification style @@ -434,6 +422,9 @@ icon_provider appearance card_display_2 + daily_trend_display + trend_horizontal_line_switch + exchange_day_night_temp_switch gravity_sensor_switch list_animation_switch item_animation_switch @@ -454,6 +445,18 @@ week_icon_mode widget_minimal_icon click_widget_to_refresh + widget_config + widget_day + widget_week + widget_day_week + widget_clock_day_horizontal + widget_clock_day_details + widget_clock_day_vertical + widget_clock_day_week + widget_text + widget_trend_daily + widget_trend_hourly + widget_multi_city notification_switch notification_style notification_minimal_icon diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ceaa6934a..7f90c50a7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -22,13 +22,24 @@ + + + -