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 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..24e0fd88 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") @@ -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/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index eab231b6..4cc7465d 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -31,6 +31,26 @@ +

Wersja 3.2.2, 2020-02-24

+ + +

Wersja 3.2.1, 2019-12-10

+ + +

Wersja 3.2, 2019-10-31

+ +

Wersja 3.1.1, 2019-10-09

--> - \ No newline at end of file + 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/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..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.* @@ -236,6 +235,10 @@ class MainActivity : AppCompatActivity() { setTheme(Themes.appTheme) + app.appConfig.language?.let { + setLanguage(it) + } + setContentView(b.root) navLoading = true @@ -870,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() { 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/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 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; 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 diff --git a/build.gradle b/build.gradle index 0ab85d27..090e9347 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.2", + versionCode: 3020299 ] setup = [ 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