From 188470a043740056436cf58754aa5de7f79dd27c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 27 Oct 2019 21:00:23 +0100 Subject: [PATCH 01/13] [UI/Settings] Add option to change app language. --- .../pl/szczodrzynski/edziennik/Extensions.kt | 50 +++ .../szczodrzynski/edziennik/MainActivity.kt | 4 + .../modules/settings/SettingsNewFragment.java | 414 +++++++----------- .../edziennik/utils/models/AppConfig.java | 5 + app/src/main/res/values-en/strings.xml | 10 + app/src/main/res/values/strings.xml | 7 + 6 files changed, 235 insertions(+), 255 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index 76719287..53803650 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.teachers.Teacher import pl.szczodrzynski.navlib.R import pl.szczodrzynski.navlib.crc16 import pl.szczodrzynski.navlib.getColorFromRes +import java.util.* fun List.byId(id: Long) = firstOrNull { it.id == id } fun List.byNameFirstLast(nameFirstLast: String) = firstOrNull { it.name + " " + it.surname == nameFirstLast } @@ -87,3 +88,52 @@ fun Activity.isStoragePermissionGranted(): Boolean { true } } + +fun Activity.setLanguage(language: String) { + val locale = Locale(language.toLowerCase(Locale.ROOT)) + val configuration = resources.configuration + Locale.setDefault(locale) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + configuration.setLocale(locale) + } + configuration.locale = locale + resources.updateConfiguration(configuration, resources.displayMetrics) + baseContext.resources.updateConfiguration(configuration, baseContext.resources.displayMetrics) +} + +/* + Code copied from android-28/java.util.Locale.initDefault() + */ +fun initDefaultLocale() { + run { + // user.locale gets priority + /*val languageTag: String? = System.getProperty("user.locale", "") + if (languageTag.isNotNullNorEmpty()) { + return@run Locale(languageTag) + }*/ + + // user.locale is empty + val language: String? = System.getProperty("user.language", "pl") + val region: String? = System.getProperty("user.region") + val country: String? + val variant: String? + // for compatibility, check for old user.region property + if (region != null) { + // region can be of form country, country_variant, or _variant + val i = region.indexOf('_') + if (i >= 0) { + country = region.substring(0, i) + variant = region.substring(i + 1) + } else { + country = region + variant = "" + } + } else { + country = System.getProperty("user.country", "") + variant = System.getProperty("user.variant", "") + } + return@run Locale(language) + }.let { + Locale.setDefault(it) + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index e617b152..1cc5ca19 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -236,6 +236,10 @@ class MainActivity : AppCompatActivity() { setTheme(Themes.appTheme) + app.appConfig.language?.let { + setLanguage(it) + } + setContentView(b.root) navLoading = true diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java index 932e89eb..76fb23c1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java @@ -38,28 +38,27 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; import pl.szczodrzynski.edziennik.App; import pl.szczodrzynski.edziennik.BuildConfig; +import pl.szczodrzynski.edziennik.MainActivity; import pl.szczodrzynski.edziennik.Notifier; import pl.szczodrzynski.edziennik.R; -import pl.szczodrzynski.edziennik.MainActivity; import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore; -import pl.szczodrzynski.edziennik.ui.modules.webpush.WebPushConfigActivity; -import pl.szczodrzynski.edziennik.ui.dialogs.changelog.ChangelogDialog; -import pl.szczodrzynski.edziennik.utils.models.Endpoint; -import pl.szczodrzynski.edziennik.utils.models.Time; import pl.szczodrzynski.edziennik.network.NetworkUtils; import pl.szczodrzynski.edziennik.network.ServerRequest; import pl.szczodrzynski.edziennik.receivers.BootReceiver; import pl.szczodrzynski.edziennik.sync.SyncJob; +import pl.szczodrzynski.edziennik.ui.dialogs.changelog.ChangelogDialog; import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragment; +import pl.szczodrzynski.edziennik.ui.modules.webpush.WebPushConfigActivity; import pl.szczodrzynski.edziennik.utils.Themes; import pl.szczodrzynski.edziennik.utils.Utils; +import pl.szczodrzynski.edziennik.utils.models.Time; import static android.app.Activity.RESULT_OK; import static pl.szczodrzynski.edziennik.App.APP_URL; +import static pl.szczodrzynski.edziennik.ExtensionsKt.initDefaultLocale; import static pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile.REGISTRATION_DISABLED; import static pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile.REGISTRATION_ENABLED; import static pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile.YEAR_1_AVG_2_AVG; @@ -81,8 +80,7 @@ public class SettingsNewFragment extends MaterialAboutFragment { private static final int CARD_THEME = 1; private static final int CARD_SYNC = 2; private static final int CARD_REGISTER = 3; - private static final int CARD_SYNC_CUSTOMIZE = 4; - private static final int CARD_ABOUT = 5; + private static final int CARD_ABOUT = 4; private int iconColor = Color.WHITE; private int primaryTextOnPrimaryBg = -1; private int secondaryTextOnPrimaryBg = -1; @@ -1081,136 +1079,6 @@ public class SettingsNewFragment extends MaterialAboutFragment { return items; } - /* _____ ______ _ _ _ - / ____| | ____| | | (_) | | - | (___ _ _ _ __ ___ | |__ _ __ __| |_ __ ___ _ _ __ | |_ ___ - \___ \| | | | '_ \ / __| | __| | '_ \ / _` | '_ \ / _ \| | '_ \| __/ __| - ____) | |_| | | | | (__ | |____| | | | (_| | |_) | (_) | | | | | |_\__ \ - |_____/ \__, |_| |_|\___| |______|_| |_|\__,_| .__/ \___/|_|_| |_|\__|___/ - __/ | | | - |___/ |*/ - private String getEndpointTitle(String name) { - int stringRes = -1; - switch (name) { - case "Classrooms": - stringRes = R.string.settings_sync_customize_endpoint_classrooms; - break; - case "Timetables": - case "Timetable": - stringRes = R.string.settings_sync_customize_endpoint_timetable; - break; - case "Substitutions": - stringRes = R.string.settings_sync_customize_endpoint_substitutions; - break; - case "Grades": - stringRes = R.string.settings_sync_customize_endpoint_grades; - break; - case "PointGrades": - stringRes = R.string.settings_sync_customize_endpoint_point_grades; - break; - case "Events": - stringRes = R.string.settings_sync_customize_endpoint_events; - break; - case "Homework": - stringRes = R.string.settings_sync_customize_endpoint_homework; - break; - case "LuckyNumber": - case "LuckyNumbers": - stringRes = R.string.settings_sync_customize_endpoint_lucky_numbers; - break; - case "Notices": - stringRes = R.string.settings_sync_customize_endpoint_notices; - break; - case "Attendance": - stringRes = R.string.settings_sync_customize_endpoint_attendance; - break; - case "Announcements": - stringRes = R.string.settings_sync_customize_endpoint_announcements; - break; - case "PtMeetings": - stringRes = R.string.settings_sync_customize_endpoint_pt_meetings; - break; - case "TeacherFreeDays": - stringRes = R.string.settings_sync_customize_endpoint_teacher_free_days; - break; - case "SchoolFreeDays": - stringRes = R.string.settings_sync_customize_endpoint_school_free_days; - break; - case "ClassFreeDays": - stringRes = R.string.settings_sync_customize_endpoint_class_free_days; - break; - case "MessagesInbox": - stringRes = R.string.settings_sync_customize_endpoint_messages_inbox; - break; - case "MessagesOutbox": - stringRes = R.string.settings_sync_customize_endpoint_messages_outbox; - break; - } - if (stringRes == -1) - return name; - else - return getString(stringRes); - } - private MaterialAboutSwitchItem getEndpointSwitch(String name, Endpoint endpoint) { - return new MaterialAboutSwitchItem( - getEndpointTitle(name), - endpoint.onlyFullSync ? getString(R.string.settings_sync_customize_full_sync_only) : null, - null - ) - .setChecked(endpoint.enabled) - .setOnChangeAction((isChecked, tag) -> { - endpoint.enabled = isChecked; - boolean changed = isChecked ^ endpoint.defaultActive; - if (!changed) { - if (app.profile.getChangedEndpoints() != null) { - app.profile.getChangedEndpoints().remove(name); - } - } - else { - if (app.profile.getChangedEndpoints() == null) - app.profile.setChangedEndpoints(new ArrayList<>()); - app.profile.getChangedEndpoints().add(name); - } - app.profileSaveAsync(); - return true; - }); - } - private Map configurableEndpoints = null; - private ArrayList getSyncCustomizeCard(boolean expandedOnly) { - ArrayList items = new ArrayList<>(); - if (!expandedOnly) { - items.add( - new MaterialAboutActionItem( - null, - getString(R.string.settings_sync_customize_help_subtext), - null - ) - ); - - if (app.profile.getChangedEndpoints() != null) { - for (String changedEndpoint : app.profile.getChangedEndpoints()) { - Endpoint endpoint = configurableEndpoints.get(changedEndpoint); - if (endpoint == null) - continue; - items.add(getEndpointSwitch(changedEndpoint, endpoint)); - } - } - - items.add(getMoreItem(() -> addCardItems(CARD_SYNC_CUSTOMIZE, getSyncCustomizeCard(true)))); - } - else { - for (String endpointName: configurableEndpoints.keySet()) { - if (app.profile.getChangedEndpoints() != null && app.profile.getChangedEndpoints().contains(endpointName)) - continue; - Endpoint endpoint = configurableEndpoints.get(endpointName); - if (endpoint == null) - continue; - items.add(getEndpointSwitch(endpointName, endpoint)); - } - } - return items; - } - /* _ _ /\ | | | | / \ | |__ ___ _ _| |_ @@ -1223,117 +1091,152 @@ public class SettingsNewFragment extends MaterialAboutFragment { secondaryTextOnPrimaryBg = 0xd0ffffff;//activity.getResources().getColor(R.color.secondaryTextLight); ArrayList items = new ArrayList<>(); - items.add(new MaterialAboutTitleItem.Builder() - .text(R.string.app_name) - .desc(R.string.settings_about_title_subtext) - .textColor(primaryTextOnPrimaryBg) - .descColor(secondaryTextOnPrimaryBg) - .icon(R.mipmap.ic_splash) - .build()); + if (!expandedOnly) { + items.add(new MaterialAboutTitleItem.Builder() + .text(R.string.app_name) + .desc(R.string.settings_about_title_subtext) + .textColor(primaryTextOnPrimaryBg) + .descColor(secondaryTextOnPrimaryBg) + .icon(R.mipmap.ic_splash) + .build()); - pref_about_version = new MaterialAboutActionItem.Builder() - .text(R.string.settings_about_version_text) - .textColor(primaryTextOnPrimaryBg) - .subTextColor(secondaryTextOnPrimaryBg) - .subText(BuildConfig.VERSION_NAME+", "+BuildConfig.BUILD_TYPE) - .icon(new IconicsDrawable(activity) - .icon(CommunityMaterial.Icon2.cmd_information) - .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) - .size(IconicsSize.dp(iconSizeDp))) - .build(); - final int[] clickCounter = {0}; - pref_about_version.setOnClickAction(() -> { - if (6 - clickCounter[0] != 0) { - Toast.makeText(activity, ("\ud83d\ude02"), Toast.LENGTH_SHORT).show(); - } - refreshMaterialAboutList(); - clickCounter[0] = clickCounter[0] + 1; - if (clickCounter[0] > 6) - { - final MediaPlayer mp = MediaPlayer.create(activity, R.raw.ogarnij_sie); - mp.start(); - clickCounter[0] = 0; - } - }); - items.add(pref_about_version); + pref_about_version = new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_version_text) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .subText(BuildConfig.VERSION_NAME + ", " + BuildConfig.BUILD_TYPE) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon2.cmd_information) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .build(); + final int[] clickCounter = {0}; + pref_about_version.setOnClickAction(() -> { + if (6 - clickCounter[0] != 0) { + Toast.makeText(activity, ("\ud83d\ude02"), Toast.LENGTH_SHORT).show(); + } + refreshMaterialAboutList(); + clickCounter[0] = clickCounter[0] + 1; + if (clickCounter[0] > 6) { + final MediaPlayer mp = MediaPlayer.create(activity, R.raw.ogarnij_sie); + mp.start(); + clickCounter[0] = 0; + } + }); + items.add(pref_about_version); - items.add(new MaterialAboutActionItem.Builder() - .text(R.string.settings_about_privacy_policy_text) - .textColor(primaryTextOnPrimaryBg) - .subTextColor(secondaryTextOnPrimaryBg) - .icon(new IconicsDrawable(activity) - .icon(CommunityMaterial.Icon2.cmd_shield_half_full) - .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) - .size(IconicsSize.dp(iconSizeDp))) - .setOnClickAction(ConvenienceBuilder.createWebsiteOnClickAction(activity, Uri.parse("https://szkolny.eu/privacy-policy"))) - .build()); + items.add(new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_privacy_policy_text) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon2.cmd_shield_half_full) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .setOnClickAction(ConvenienceBuilder.createWebsiteOnClickAction(activity, Uri.parse("https://szkolny.eu/privacy-policy"))) + .build()); - items.add(new MaterialAboutActionItem.Builder() - .text(R.string.settings_about_discord_text) - .textColor(primaryTextOnPrimaryBg) - .subTextColor(secondaryTextOnPrimaryBg) - .subText(R.string.settings_about_discord_subtext) - .icon(new IconicsDrawable(activity) - .icon(CommunityMaterial.Icon.cmd_discord) - .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) - .size(IconicsSize.dp(iconSizeDp))) - .setOnClickAction(ConvenienceBuilder.createWebsiteOnClickAction(activity, Uri.parse("https://discord.gg/n9e8pWr"))) - .build()); + items.add(new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_discord_text) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .subText(R.string.settings_about_discord_subtext) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon.cmd_discord) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .setOnClickAction(ConvenienceBuilder.createWebsiteOnClickAction(activity, Uri.parse("https://discord.gg/n9e8pWr"))) + .build()); - items.add(new MaterialAboutActionItem.Builder() - .text(R.string.settings_about_update_text) - .subText(R.string.settings_about_update_subtext) - .textColor(primaryTextOnPrimaryBg) - .subTextColor(secondaryTextOnPrimaryBg) - .icon(new IconicsDrawable(activity) - .icon(CommunityMaterial.Icon2.cmd_update) - .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) - .size(IconicsSize.dp(iconSizeDp))) - .setOnClickAction(() -> { - //open browser or intent here - NetworkUtils net = new NetworkUtils(app); - if (!net.isOnline()) - { + items.add(new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_language_text) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .subText(R.string.settings_about_language_subtext) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon2.cmd_translate) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .setOnClickAction(() -> { new MaterialDialog.Builder(activity) - .title(R.string.you_are_offline_title) - .content(R.string.you_are_offline_text) - .positiveText(R.string.ok) + .title(getString(R.string.settings_about_language_dialog_title)) + .content(getString(R.string.settings_about_language_dialog_text)) + .items(getString(R.string.language_system), getString(R.string.language_polish), getString(R.string.language_english)) + .itemsCallbackSingleChoice(app.appConfig.language == null ? 0 : app.appConfig.language.equals("pl") ? 1 : 2, (dialog, itemView, which, text) -> { + switch (which) { + case 0: + app.appConfig.language = null; + initDefaultLocale(); + break; + case 1: + app.appConfig.language = "pl"; + break; + case 2: + app.appConfig.language = "en"; + break; + } + app.saveConfig("language"); + activity.recreate(MainActivity.DRAWER_ITEM_SETTINGS); + return true; + }) .show(); - } - else - { - BootReceiver br = new BootReceiver(); - Intent i = new Intent(); - i.putExtra("UserChecked", true); - br.onReceive(getContext(), i); - } - }) - .build()); + }) + .build()); - items.add(new MaterialAboutActionItem.Builder() - .text(R.string.settings_about_changelog_text) - .textColor(primaryTextOnPrimaryBg) - .subTextColor(secondaryTextOnPrimaryBg) - .icon(new IconicsDrawable(activity) - .icon(CommunityMaterial.Icon2.cmd_radar) - .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) - .size(IconicsSize.dp(iconSizeDp))) - .setOnClickAction(() -> new ChangelogDialog().show(getActivity().getSupportFragmentManager(), "whats_new")) - .build()); + items.add(getMoreItem(() -> addCardItems(CARD_ABOUT, getAboutCard(true)))); + } + else { + items.add(new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_update_text) + .subText(R.string.settings_about_update_subtext) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon2.cmd_update) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .setOnClickAction(() -> { + //open browser or intent here + NetworkUtils net = new NetworkUtils(app); + if (!net.isOnline()) { + new MaterialDialog.Builder(activity) + .title(R.string.you_are_offline_title) + .content(R.string.you_are_offline_text) + .positiveText(R.string.ok) + .show(); + } else { + BootReceiver br = new BootReceiver(); + Intent i = new Intent(); + i.putExtra("UserChecked", true); + br.onReceive(getContext(), i); + } + }) + .build()); - items.add(new MaterialAboutActionItem.Builder() - .text(R.string.settings_about_licenses_text) - .textColor(primaryTextOnPrimaryBg) - .subTextColor(secondaryTextOnPrimaryBg) - .icon(new IconicsDrawable(activity) - .icon(CommunityMaterial.Icon.cmd_code_braces) - .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) - .size(IconicsSize.dp(iconSizeDp))) - .setOnClickAction(() -> { - Intent intent = new Intent(activity, SettingsLicenseActivity.class); - startActivity(intent); - }) - .build()); + items.add(new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_changelog_text) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon2.cmd_radar) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .setOnClickAction(() -> new ChangelogDialog().show(getActivity().getSupportFragmentManager(), "whats_new")) + .build()); + + items.add(new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_licenses_text) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon.cmd_code_braces) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .setOnClickAction(() -> { + Intent intent = new Intent(activity, SettingsLicenseActivity.class); + startActivity(intent); + }) + .build()); /*items.add(new MaterialAboutActionItem.Builder() .text(R.string.settings_about_intro_text) @@ -1357,20 +1260,21 @@ public class SettingsNewFragment extends MaterialAboutFragment { }) .build());*/ - if (App.devMode) { - items.add(new MaterialAboutActionItem.Builder() - .text(R.string.settings_about_crash_text) - .subText(R.string.settings_about_crash_subtext) - .textColor(primaryTextOnPrimaryBg) - .subTextColor(secondaryTextOnPrimaryBg) - .icon(new IconicsDrawable(activity) - .icon(CommunityMaterial.Icon.cmd_bug) - .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) - .size(IconicsSize.dp(iconSizeDp))) - .setOnClickAction(() -> { - throw new RuntimeException("MANUAL CRASH"); - }) - .build()); + if (App.devMode) { + items.add(new MaterialAboutActionItem.Builder() + .text(R.string.settings_about_crash_text) + .subText(R.string.settings_about_crash_subtext) + .textColor(primaryTextOnPrimaryBg) + .subTextColor(secondaryTextOnPrimaryBg) + .icon(new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon.cmd_bug) + .color(IconicsColor.colorInt(primaryTextOnPrimaryBg)) + .size(IconicsSize.dp(iconSizeDp))) + .setOnClickAction(() -> { + throw new RuntimeException("MANUAL CRASH"); + }) + .build()); + } } return items; } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/AppConfig.java b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/AppConfig.java index 2aefccf0..b2d104e2 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/AppConfig.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/AppConfig.java @@ -2,6 +2,8 @@ package pl.szczodrzynski.edziennik.utils.models; import android.util.Pair; +import androidx.annotation.Nullable; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -110,4 +112,7 @@ public class AppConfig { public long appRateSnackbarTime = 0; public int mobidziennikOldMessages = -1; + + @Nullable + public String language = null; } diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index a200e659..5e3b12c3 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -856,4 +856,14 @@ Getting school free days Show teacher absences in Agenda Mark everything as read + App language + "English " + Change app language + Notice. This feature may not work on some devices or in some parts of the app. + Discord server + Join our Discord community! + Use system language + (child) + (parent) + Syncing... diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4179f64c..d76e8828 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -912,4 +912,11 @@ Nieobecni nauczyciele Pobieranie komentarzy ocen Pokazuj nieobecności nauczycieli w Terminarzu + Język aplikacji + Polski + Zmień język aplikacji + Uwaga. Ta opcja może nie działać na niektórych urządzeniach oraz w niektórych fragmentach aplikacji. + Według systemu + Polski + English From a15f59fbd1050f120e0320654cf58c675d666cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 31 Oct 2019 15:40:59 +0100 Subject: [PATCH 02/13] [API/Vulcan] Add edu.lublin.eu register support. --- .../java/pl/szczodrzynski/edziennik/data/api/Vulcan.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Vulcan.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Vulcan.java index 090c9393..a8663e19 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Vulcan.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Vulcan.java @@ -858,6 +858,12 @@ public class Vulcan implements EdziennikInterface { case "KA2": apiUrl = "https://uonetplus-komunikacja-test.mcuw.katowice.eu/"+symbol+"/"; break; + case "LU1": + apiUrl = "https://uonetplus-komunikacja.edu.lublin.eu/"+symbol+"/"; + break; + case "LU2": + apiUrl = "https://test-uonetplus-komunikacja.edu.lublin.eu/"+symbol+"/"; + break; case "P03": apiUrl = "https://efeb-komunikacja-pro-efebmobile.pro.vulcan.pl/"+symbol+"/"; break; From 88ad8523a09dd186303f09a4cfca3b63e106b925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 31 Oct 2019 17:19:25 +0100 Subject: [PATCH 03/13] [UI] Disable bottom menu gain attention ripple. --- .../szczodrzynski/edziennik/MainActivity.kt | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index 1cc5ca19..81b38a70 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -14,66 +14,65 @@ import android.view.Gravity import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.Observer -import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial -import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont -import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem -import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem -import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.* -import pl.szczodrzynski.edziennik.utils.Themes -import pl.szczodrzynski.navlib.SystemBarsUtil.Companion.COLOR_HALF_TRANSPARENT -import pl.szczodrzynski.navlib.bottomsheet.NavBottomSheet -import pl.szczodrzynski.navlib.drawer.NavDrawer -import pl.szczodrzynski.navlib.drawer.items.DrawerPrimaryItem -import pl.szczodrzynski.navlib.drawer.items.withAppTitle import androidx.appcompat.widget.PopupMenu import androidx.core.graphics.ColorUtils +import androidx.lifecycle.Observer import androidx.navigation.NavOptions import com.danimahardhika.cafebar.CafeBar import com.mikepenz.iconics.IconicsColor import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.IconicsSize +import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial +import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont import com.mikepenz.materialdrawer.model.DividerDrawerItem import com.mikepenz.materialdrawer.model.ProfileDrawerItem +import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem +import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem import com.mikepenz.materialdrawer.model.interfaces.IProfile -import me.zhanghai.android.materialprogressbar.internal.ThemeUtils import pl.droidsonroids.gif.GifDrawable import pl.szczodrzynski.edziennik.App.APP_URL import pl.szczodrzynski.edziennik.data.api.AppError import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface.* import pl.szczodrzynski.edziennik.data.api.interfaces.SyncCallback -import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore +import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.* import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull -import pl.szczodrzynski.edziennik.ui.dialogs.changelog.ChangelogDialog -import pl.szczodrzynski.edziennik.ui.modules.homework.HomeworkFragment -import pl.szczodrzynski.edziennik.ui.modules.login.LoginActivity -import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesDetailsFragment -import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesFragment -import pl.szczodrzynski.edziennik.utils.models.NavTarget +import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding import pl.szczodrzynski.edziennik.network.ServerRequest import pl.szczodrzynski.edziennik.sync.SyncJob +import pl.szczodrzynski.edziennik.ui.dialogs.changelog.ChangelogDialog import pl.szczodrzynski.edziennik.ui.modules.agenda.AgendaFragment import pl.szczodrzynski.edziennik.ui.modules.announcements.AnnouncementsFragment import pl.szczodrzynski.edziennik.ui.modules.attendance.AttendanceFragment import pl.szczodrzynski.edziennik.ui.modules.base.DebugFragment +import pl.szczodrzynski.edziennik.ui.modules.behaviour.BehaviourFragment import pl.szczodrzynski.edziennik.ui.modules.feedback.FeedbackFragment import pl.szczodrzynski.edziennik.ui.modules.feedback.HelpFragment -import pl.szczodrzynski.edziennik.ui.modules.grades.editor.GradesEditorFragment import pl.szczodrzynski.edziennik.ui.modules.grades.GradesFragment +import pl.szczodrzynski.edziennik.ui.modules.grades.editor.GradesEditorFragment import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragment -import pl.szczodrzynski.edziennik.ui.modules.behaviour.BehaviourFragment +import pl.szczodrzynski.edziennik.ui.modules.homework.HomeworkFragment +import pl.szczodrzynski.edziennik.ui.modules.login.LoginActivity +import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesDetailsFragment +import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesFragment import pl.szczodrzynski.edziennik.ui.modules.notifications.NotificationsFragment import pl.szczodrzynski.edziennik.ui.modules.settings.ProfileManagerFragment import pl.szczodrzynski.edziennik.ui.modules.settings.SettingsNewFragment import pl.szczodrzynski.edziennik.ui.modules.timetable.TimetableFragment import pl.szczodrzynski.edziennik.utils.SwipeRefreshLayoutNoTouch +import pl.szczodrzynski.edziennik.utils.Themes import pl.szczodrzynski.edziennik.utils.Utils import pl.szczodrzynski.edziennik.utils.Utils.dpToPx +import pl.szczodrzynski.edziennik.utils.models.NavTarget import pl.szczodrzynski.navlib.* +import pl.szczodrzynski.navlib.SystemBarsUtil.Companion.COLOR_HALF_TRANSPARENT +import pl.szczodrzynski.navlib.bottomsheet.NavBottomSheet import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem +import pl.szczodrzynski.navlib.drawer.NavDrawer +import pl.szczodrzynski.navlib.drawer.items.DrawerPrimaryItem +import pl.szczodrzynski.navlib.drawer.items.withAppTitle import java.io.File import java.io.IOException import java.util.* @@ -874,9 +873,9 @@ class MainActivity : AppCompatActivity() { * that something has changed in the bottom sheet. */ fun gainAttention() { - b.navView.postDelayed({ + /*b.navView.postDelayed({ navView.gainAttentionOnBottomBar() - }, 2000) + }, 2000)*/ } fun gainAttentionFAB() { From 9c5653b52e09934987881b19b715e8b19f72074d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 31 Oct 2019 17:20:07 +0100 Subject: [PATCH 04/13] [Gradle] Fix AgendaCalendarView dependencies. --- agendacalendarview/build.gradle | 2 +- app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/agendacalendarview/build.gradle b/agendacalendarview/build.gradle index 28cbb26d..824ce517 100644 --- a/agendacalendarview/build.gradle +++ b/agendacalendarview/build.gradle @@ -49,6 +49,6 @@ dependencies { // other libraries //implementation 'se.emilsjolander:stickylistheaders:2.7.0' - implementation 'com.github.edisonw:StickyListHeaders:master-SNAPSHOT' + implementation 'com.github.edisonw:StickyListHeaders:master-SNAPSHOT@aar' implementation 'io.reactivex:rxjava:1.1.1' } diff --git a/app/build.gradle b/app/build.gradle index 3abf1031..012144f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,7 +142,7 @@ dependencies { implementation "org.jsoup:jsoup:1.10.1" implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.15" //implementation "se.emilsjolander:stickylistheaders:2.7.0" - implementation 'com.github.edisonw:StickyListHeaders:master-SNAPSHOT' + implementation 'com.github.edisonw:StickyListHeaders:master-SNAPSHOT@aar' implementation "uk.co.samuelwall:material-tap-target-prompt:2.14.0" implementation project(":agendacalendarview") From fa99b7fd112c52751ce3ce4393b6197c8cdd798a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 31 Oct 2019 17:57:41 +0100 Subject: [PATCH 05/13] [3.2] Update build.gradle and changelog --- app/src/main/assets/pl-changelog.html | 10 ++++++++++ build.gradle | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index eab231b6..116ae5f3 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -31,6 +31,16 @@ +

Wersja 3.2, 2019-10-31

+
    +
  • Możliwość zmiany języka aplikacji.
  • +
  • Vulcan: obsługa dziennika edu.lublin.eu.
  • +
  • Opcja oznaczenia wszystkich powiadomień jako nieprzeczytane (na stronie głównej).
  • +
  • Librus: pokazywanie sali podczas zastępstwa.
  • + +
  • Możliwość wysyłania wiadomości jest przewidywana na połowę listopada.
  • +
+

Wersja 3.1.1, 2019-10-09

  • Librus: poprawiona synchronizacja kategorii i kolorów ocen.
  • diff --git a/build.gradle b/build.gradle index 0ab85d27..bb45bf56 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.3.50' release = [ - versionName: "3.1.1", - versionCode: 3010199 + versionName: "3.2", + versionCode: 3020099 ] setup = [ From cf69273de12b1e79c2714dea8c33ed29c3dce9cb Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sat, 14 Dec 2019 14:17:16 +0100 Subject: [PATCH 06/13] [APIv1/Mobidziennik] Add API key. --- .../java/pl/szczodrzynski/edziennik/data/api/Mobidziennik.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Mobidziennik.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Mobidziennik.java index 4a3d191f..355b4bbd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Mobidziennik.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Mobidziennik.java @@ -105,6 +105,7 @@ public class Mobidziennik implements EdziennikInterface { } private static final String TAG = "api.Mobidziennik"; + private static final String API_KEY = "szkolny_eu_72c7dbc8b97f1e5dd2d118cacf51c2b8543d15c0f65b7a59979adb0a1296b235d7febb826dd2a28688def6efe0811b924b04d7f3c7b7d005354e06dc56815d57"; private App app; private Context activityContext = null; @@ -421,6 +422,7 @@ public class Mobidziennik implements EdziennikInterface { .addParameter("login", loginUsername) .addParameter("haslo", loginPassword) .addParameter("token", app.appConfig.fcmTokens.get(LOGIN_TYPE_MOBIDZIENNIK).first) + .addParameter("ta_api", API_KEY) .post() .callback(new TextCallbackHandler() { @Override From 6a2c863fcceb39c153729859de502202c4e2187b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 15 Dec 2019 19:05:22 +0100 Subject: [PATCH 07/13] [3.2.1] Update build.gradle and changelog --- app/src/main/assets/pl-changelog.html | 7 +++++-- build.gradle | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index 116ae5f3..5eb53d52 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -31,14 +31,17 @@ +

    Wersja 3.2.1, 2019-12-10

    +
      +
    • Poprawa synchronizacji w Mobidzienniku.
    • +
    +

    Wersja 3.2, 2019-10-31

    • Możliwość zmiany języka aplikacji.
    • Vulcan: obsługa dziennika edu.lublin.eu.
    • Opcja oznaczenia wszystkich powiadomień jako nieprzeczytane (na stronie głównej).
    • Librus: pokazywanie sali podczas zastępstwa.
    • - -
    • Możliwość wysyłania wiadomości jest przewidywana na połowę listopada.

    Wersja 3.1.1, 2019-10-09

    diff --git a/build.gradle b/build.gradle index bb45bf56..d76a2fa9 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.3.50' release = [ - versionName: "3.2", - versionCode: 3020099 + versionName: "3.2.1", + versionCode: 3020199 ] setup = [ From 86669a491a4c45a6edc97e5c2efebfd72569fc99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 9 Jan 2020 21:14:08 +0100 Subject: [PATCH 08/13] Update .gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 047ad745..25786692 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ captures/ .idea/modules.xml # Comment next line if keeping position of elements in Navigation Editor is relevant for you .idea/navEditor.xml +.idea/copyright/profiles_settings.xml # Keystore files # Uncomment the following lines if you do not want to check your keystore files in. @@ -80,3 +81,9 @@ lint/generated/ lint/outputs/ lint/tmp/ # lint/reports/ + +app/schemas/ + +signatures/ + +app/.cxx \ No newline at end of file From 27f9b8a04e0fe5f1621f08e0cbb383adc84a10cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Fri, 10 Jan 2020 09:30:02 +0100 Subject: [PATCH 09/13] Update gradle. Add Chucker. --- app/build.gradle | 3 +++ app/src/main/java/pl/szczodrzynski/edziennik/App.java | 9 +++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 012144f0..24e0fd88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -152,6 +152,9 @@ dependencies { implementation project(":nachos") //implementation project(":Navigation") implementation project(":szkolny-font") + + debugImplementation "com.github.ChuckerTeam.Chucker:library:3.0.1" + releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1" } repositories { mavenCentral() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.java b/app/src/main/java/pl/szczodrzynski/edziennik/App.java index afb44fda..bb9952a0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.java @@ -20,6 +20,9 @@ import android.util.Base64; import android.util.Log; import android.util.Pair; +import com.chuckerteam.chucker.api.ChuckerCollector; +import com.chuckerteam.chucker.api.ChuckerInterceptor; +import com.chuckerteam.chucker.api.RetentionManager; import com.evernote.android.job.JobManager; import com.google.android.gms.security.ProviderInstaller; import com.google.firebase.FirebaseApp; @@ -254,6 +257,12 @@ public class App extends androidx.multidex.MultiDexApplication { } } + if (App.devMode || BuildConfig.DEBUG) { + ChuckerCollector chuckerCollector = new ChuckerCollector(this, true, RetentionManager.Period.ONE_HOUR); + ChuckerInterceptor chuckerInterceptor = new ChuckerInterceptor(this, chuckerCollector); + httpBuilder.addInterceptor(chuckerInterceptor); + } + http = httpBuilder.build(); httpLazy = http.newBuilder().followRedirects(false).followSslRedirects(false).build(); diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7ddd4838..be8ba4d1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-rc-1-all.zip \ No newline at end of file From 3c8afb0609b2fb78f38f2be3533a5e0807d18d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 24 Feb 2020 16:55:24 +0100 Subject: [PATCH 10/13] [3.2.2] Update build.gradle and changelog. Update Librus Client ID and user agent. --- app/src/main/assets/pl-changelog.html | 9 ++++++++- .../java/pl/szczodrzynski/edziennik/data/api/Librus.java | 4 ++-- build.gradle | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index 5eb53d52..4cc7465d 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -31,6 +31,13 @@ +

    Wersja 3.2.2, 2020-02-24

    +
      +
    • Naprawiłem synchronizację oraz logowanie w Librusie.
    • +
    • Dostępna jest wersja testowa aplikacji 4.0-beta. Można ją pobrać w Google Play, dołączając do programu wersji beta (na dole strony).
    • +
    • Nowa wersja testowa zawiera m.in. takie funkcje jak wysyłanie wiadomości, nowy plan lekcji czy przebudowany moduł synchronizacji i interfejs.
    • +
    +

    Wersja 3.2.1, 2019-12-10

    • Poprawa synchronizacji w Mobidzienniku.
    • @@ -109,4 +116,4 @@
    --> - \ No newline at end of file + diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java index 5c7356e2..464d3cda 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java @@ -139,7 +139,7 @@ public class Librus implements EdziennikInterface { } private static final String TAG = "api.Librus"; - private static final String CLIENT_ID = "wmSyUMo8llDAs4y9tJVYY92oyZ6h4lAt7KCuy0Gv"; + private static final String CLIENT_ID = "6XPsKf10LPz1nxgHQLcvZ1KM48DYzlBAhxipaXY8"; private static final String REDIRECT_URL = "http://localhost/bar"; private static final String AUTHORIZE_URL = "https://portal.librus.pl/oauth2/authorize?client_id="+CLIENT_ID+"&redirect_uri="+REDIRECT_URL+"&response_type=code"; private static final String LOGIN_URL = "https://portal.librus.pl/rodzina/login/action"; @@ -149,7 +149,7 @@ public class Librus implements EdziennikInterface { private static final String API_URL = "https://api.librus.pl/2.0/"; private static final String SYNERGIA_URL = "https://wiadomosci.librus.pl/module/"; private static final String SYNERGIA_SANDBOX_URL = "https://sandbox.librus.pl/index.php?action="; - private static final String userAgent = "Dalvik/2.1.0 Android LibrusMobileApp"; + private static final String userAgent = System.getProperty("http.agent")+"LibrusMobileApp"; private static final String synergiaUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/62.0"; private App app; diff --git a/build.gradle b/build.gradle index d76a2fa9..090e9347 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.3.50' release = [ - versionName: "3.2.1", - versionCode: 3020199 + versionName: "3.2.2", + versionCode: 3020299 ] setup = [ From 97e0f36f09e81b11ba974ef8eaf83523e35e15ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 19 Apr 2020 21:37:39 +0200 Subject: [PATCH 11/13] [UI] Fix semester grades overlapping when scrolling. --- .gitignore | 3 ++- .../ui/modules/grades/viewholder/SubjectViewHolder.kt | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 25786692..1864dd01 100644 --- a/.gitignore +++ b/.gitignore @@ -86,4 +86,5 @@ app/schemas/ signatures/ -app/.cxx \ No newline at end of file +app/.cxx +/i18n/ diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/SubjectViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/SubjectViewHolder.kt index 0dce6297..58015a0a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/SubjectViewHolder.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/SubjectViewHolder.kt @@ -112,6 +112,9 @@ class SubjectViewHolder( )) } + // remove previously added grades from year preview + if (b.yearContainer.childCount > 1) + b.yearContainer.removeViews(1, b.yearContainer.childCount - 1) // add the yearly grades to summary container (expanded) item.proposedGrade?.let { b.yearContainer.addView(GradeView( From 26f8c035703ea07ecb38be4a96032ff0ed9b9a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 19 Apr 2020 22:01:29 +0200 Subject: [PATCH 12/13] [UI] Show class name and school year in subname. Fix setting language. --- .../java/pl/szczodrzynski/edziennik/App.kt | 4 ++ .../pl/szczodrzynski/edziennik/Extensions.kt | 3 +- .../edziennik/data/api/models/Data.kt | 7 +++ .../modules/settings/SettingsNewFragment.java | 45 ++++++++++++------- app/src/main/res/values-en/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 47 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt index 71c06c25..7194aa04 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt @@ -167,6 +167,10 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { db.profileDao().firstId?.let { profileLoadById(it) } } + config.ui.language?.let { + setLanguage(it) + } + devMode = BuildConfig.DEBUG Signing.getCert(this) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index 0383be1e..e95854e7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -454,7 +454,7 @@ operator fun MatchResult.get(group: Int): String { return groupValues[group] } -fun Activity.setLanguage(language: String) { +fun Context.setLanguage(language: String) { val locale = Locale(language.toLowerCase(Locale.ROOT)) val configuration = resources.configuration Locale.setDefault(locale) @@ -463,7 +463,6 @@ fun Activity.setLanguage(language: String) { } configuration.locale = locale resources.updateConfiguration(configuration, resources.displayMetrics) - baseContext.resources.updateConfiguration(configuration, baseContext.resources.displayMetrics) } /* diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt index 5e998425..2f0c88af 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt @@ -197,6 +197,13 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt profile.userCode = generateUserCode() + // update profile subname with class name, school year and account type + profile.subname = joinNotNullStrings( + " - ", + profile.studentClassName, + "${profile.studentSchoolYearStart}/${profile.studentSchoolYearStart + 1}" + ) + " " + app.getString(if (profile.isParent) R.string.login_summary_account_parent else R.string.login_summary_account_child) + db.profileDao().add(profile) db.loginStoreDao().add(loginStore) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java index cc72c46c..3e3eac0e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java @@ -55,6 +55,7 @@ import pl.szczodrzynski.edziennik.ui.dialogs.changelog.ChangelogDialog; import pl.szczodrzynski.edziennik.ui.dialogs.settings.GradesConfigDialog; import pl.szczodrzynski.edziennik.ui.dialogs.settings.ProfileRemoveDialog; import pl.szczodrzynski.edziennik.ui.dialogs.sync.NotificationFilterDialog; +import pl.szczodrzynski.edziennik.ui.modules.login.LoginActivity; import pl.szczodrzynski.edziennik.utils.Themes; import pl.szczodrzynski.edziennik.utils.Utils; import pl.szczodrzynski.edziennik.utils.models.Date; @@ -161,7 +162,7 @@ public class SettingsNewFragment extends MaterialAboutFragment { profileCardTitleItem = new MaterialAboutProfileItem( app.getProfile().getName(), - getString(R.string.settings_profile_subtitle_format, app.getProfile().getSubname()), + app.getProfile().getSubname(), getProfileDrawable() ); profileCardTitleItem.setOnClickAction(() -> { @@ -218,6 +219,20 @@ public class SettingsNewFragment extends MaterialAboutFragment { }) );*/ + items.add( + new MaterialAboutActionItem( + getString(R.string.settings_add_student_text), + getString(R.string.settings_add_student_subtext), + new IconicsDrawable(activity) + .icon(CommunityMaterial.Icon.cmd_account_plus_outline) + .size(IconicsSize.dp(iconSizeDp)) + .color(IconicsColor.colorInt(iconColor)) + ) + .setOnClickAction(() -> { + startActivity(new Intent(activity, LoginActivity.class)); + }) + ); + items.add( new MaterialAboutActionItem( getString(R.string.settings_profile_notifications_text), @@ -232,6 +247,20 @@ public class SettingsNewFragment extends MaterialAboutFragment { }) ); + items.add( + new MaterialAboutActionItem( + getString(R.string.settings_profile_remove_text), + getString(R.string.settings_profile_remove_subtext), + new IconicsDrawable(activity) + .icon(SzkolnyFont.Icon.szf_delete_empty_outline) + .size(IconicsSize.dp(iconSizeDp)) + .color(IconicsColor.colorInt(iconColor)) + ) + .setOnClickAction(() -> { + new ProfileRemoveDialog(activity, app.getProfile().getId(), app.getProfile().getName()); + }) + ); + items.add(getMoreItem(() -> addCardItems(CARD_PROFILE, getProfileCard(true)))); } else { @@ -253,20 +282,6 @@ public class SettingsNewFragment extends MaterialAboutFragment { })) ); - items.add( - new MaterialAboutActionItem( - getString(R.string.settings_profile_remove_text), - getString(R.string.settings_profile_remove_subtext), - new IconicsDrawable(activity) - .icon(SzkolnyFont.Icon.szf_delete_empty_outline) - .size(IconicsSize.dp(iconSizeDp)) - .color(IconicsColor.colorInt(iconColor)) - ) - .setOnClickAction(() -> { - new ProfileRemoveDialog(activity, app.getProfile().getId(), app.getProfile().getName()); - }) - ); - } return items; } diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 3a16ddf2..50d657db 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1230,4 +1230,7 @@ yesterday You\'re offline. Try enabling Wi-Fi or mobile data. Internet connection + In order to download the file, you have to grant file storage permission for the application.\n\nClick OK to grant the permission. + You denied the required permissions for the application.\n\nIn order to grant the permission, open the Permissions screen for Szkolny.eu in phone settings.\n\nClick OK to open app settings now. + Required permissions diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6aa583a9..df773c90 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1286,4 +1286,6 @@ wczoraj Jesteś offline. Spróbuj włączyć Wi-Fi lub dane komórkowe. Połączenie sieciowe + Dodaj nowego ucznia + Zaloguj konto ucznia/rodzica w aplikacji From dc9e6081c58d6db2141b909a8bf14da9007c0c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 19 Apr 2020 22:06:19 +0200 Subject: [PATCH 13/13] [4.0] Update build.gradle, signing and changelog. --- app/src/main/assets/pl-changelog.html | 14 +++++--------- app/src/main/cpp/szkolny-signing.cpp | 2 +- .../data/api/szkolny/interceptor/Signing.kt | 2 +- build.gradle | 4 ++-- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index a7dbbd6c..3fa725f2 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -1,15 +1,10 @@ -

    Wersja 4.0-rc.5, 2020-04-05

    -
      -
    • Możliwość pobierania załączników do zadań domowych (Librus, MobiDziennik, iDziennik).
    • -
    • Widok pełnej treści zadań domowych (iDziennik, EduDziennik).
    • -
    • Wyszukiwarka wiadomości, pozwalająca na łatwe znalezienie potrzebnej konwersacji.
    • -
    • Możliwość usuwania odebranych wiadomości w aplikacji.
    • -
    - +


Dzięki za korzystanie ze Szkolnego!
diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp index 20dd9492..6463e8af 100644 --- a/app/src/main/cpp/szkolny-signing.cpp +++ b/app/src/main/cpp/szkolny-signing.cpp @@ -9,7 +9,7 @@ /*secret password - removed for source code publication*/ static toys AES_IV[16] = { - 0x7b, 0x51, 0x86, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + 0x38, 0xd4, 0x73, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt index 47f633f6..65a3be61 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt @@ -46,6 +46,6 @@ object Signing { /*fun provideKey(param1: String, param2: Long): ByteArray {*/ fun pleaseStopRightNow(param1: String, param2: Long): ByteArray { - return "$param1.MTIzNDU2Nzg5MD43hCWBBS===.$param2".sha256() + return "$param1.MTIzNDU2Nzg5MDP/4SAI6B===.$param2".sha256() } } diff --git a/build.gradle b/build.gradle index 705a0c97..6143c28c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.3.61' release = [ - versionName: "4.0-rc.5", - versionCode: 4000059 + versionName: "4.0", + versionCode: 4000099 ] setup = [