From ad5afac1747d1fc4e3fabc74a154c2c8672a5e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 14 Dec 2019 17:21:29 +0100 Subject: [PATCH] [Login/Librus] Implement Librus JST login form. --- .../api/v2/edziennik/librus/DataLibrus.kt | 14 +- .../librus/firstlogin/LibrusFirstLogin.kt | 30 ++++ .../edziennik/data/db/AppDb.java | 11 +- .../data/db/modules/login/LoginStore.java | 3 +- .../modules/login/LoginChooserFragment.java | 1 + .../modules/login/LoginLibrusJstFragment.java | 121 +++++++++++++ .../modules/login/LoginProgressFragment.java | 2 + .../main/res/drawable/login_logo_oswiata.png | Bin 0 -> 28499 bytes .../res/layout/fragment_login_chooser.xml | 48 +++++ .../res/layout/fragment_login_librus_jst.xml | 170 ++++++++++++++++++ app/src/main/res/navigation/nav_login.xml | 12 ++ app/src/main/res/values-en/strings.xml | 2 +- app/src/main/res/values/strings.xml | 6 + 13 files changed, 408 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.java create mode 100644 app/src/main/res/drawable/login_logo_oswiata.png create mode 100644 app/src/main/res/layout/fragment_login_librus_jst.xml diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/DataLibrus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/DataLibrus.kt index 5c2ffce1..8bae6419 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/DataLibrus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/DataLibrus.kt @@ -148,16 +148,16 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app */ private var mApiCode: String? = null var apiCode: String? - get() { mApiCode = mApiCode ?: profile?.getStudentData("accountCode", null); return mApiCode } - set(value) { profile?.putStudentData("accountCode", value) ?: return; mApiCode = value } + get() { mApiCode = mApiCode ?: loginStore.getLoginData("accountCode", null); return mApiCode } + set(value) { loginStore.putLoginData("accountCode", value) ?: return; mApiCode = value } /** * A JST login PIN. * Used only during first login in JST mode. */ private var mApiPin: String? = null var apiPin: String? - get() { mApiPin = mApiPin ?: profile?.getStudentData("accountPin", null); return mApiPin } - set(value) { profile?.putStudentData("accountPin", value) ?: return; mApiPin = value } + get() { mApiPin = mApiPin ?: loginStore.getLoginData("accountPin", null); return mApiPin } + set(value) { loginStore.putLoginData("accountPin", value) ?: return; mApiPin = value } /** * A Synergia API access token. @@ -168,7 +168,7 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app private var mApiAccessToken: String? = null var apiAccessToken: String? get() { mApiAccessToken = mApiAccessToken ?: profile?.getStudentData("accountToken", null); return mApiAccessToken } - set(value) { profile?.putStudentData("accountToken", value) ?: return; mApiAccessToken = value } + set(value) { mApiAccessToken = value; profile?.putStudentData("accountToken", value) ?: return; } /** * A Synergia API refresh token. * Used when refreshing the [apiAccessToken] in JST, Synergia modes. @@ -176,7 +176,7 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app private var mApiRefreshToken: String? = null var apiRefreshToken: String? get() { mApiRefreshToken = mApiRefreshToken ?: profile?.getStudentData("accountRefreshToken", null); return mApiRefreshToken } - set(value) { profile?.putStudentData("accountRefreshToken", value) ?: return; mApiRefreshToken = value } + set(value) { mApiRefreshToken = value; profile?.putStudentData("accountRefreshToken", value) ?: return; } /** * The expiry time for [apiAccessToken], as a UNIX timestamp. * Used when refreshing the [apiAccessToken] in JST, Synergia modes. @@ -185,7 +185,7 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app private var mApiTokenExpiryTime: Long? = null var apiTokenExpiryTime: Long get() { mApiTokenExpiryTime = mApiTokenExpiryTime ?: profile?.getStudentData("accountTokenTime", 0L); return mApiTokenExpiryTime ?: 0L } - set(value) { profile?.putStudentData("accountTokenTime", value) ?: return; mApiTokenExpiryTime = value } + set(value) { mApiTokenExpiryTime = value; profile?.putStudentData("accountTokenTime", value) ?: return; } /* _____ _ / ____| (_) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/firstlogin/LibrusFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/firstlogin/LibrusFirstLogin.kt index 0b0d2f20..e2ac2275 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/firstlogin/LibrusFirstLogin.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/edziennik/librus/firstlogin/LibrusFirstLogin.kt @@ -85,6 +85,36 @@ class LibrusFirstLogin(val data: DataLibrus, val onSuccess: () -> Unit) { LibrusLoginApi(data) { api.apiGet(TAG, "Me") { json -> + val profile = Profile() + + val me = json.getJsonObject("Me") + val account = me?.getJsonObject("Account") + val user = me?.getJsonObject("User") + + profile.putStudentData("isPremium", account?.getBoolean("IsPremium") == true || account?.getBoolean("IsPremiumDemo") == true) + + val isParent = account?.getInt("GroupId") == 5 + profile.accountNameLong = + if (isParent) + buildFullName(account?.getString("FirstName"), account?.getString("LastName")) + else null + + profile.studentNameLong = + buildFullName(user?.getString("FirstName"), user?.getString("LastName")) + + profile.studentNameShort = profile.studentNameLong?.getShortName() + profile.name = profile.studentNameLong + profile.subname = account.getString("Login") + profile.empty = true + profile.putStudentData("accountId", account.getInt("Id") ?: 0) + profile.putStudentData("accountLogin", profile.subname) + profile.putStudentData("accountToken", data.apiAccessToken) + profile.putStudentData("accountRefreshToken", data.apiRefreshToken) + profile.putStudentData("accountTokenTime", data.apiTokenExpiryTime) + profileList.add(profile) + + EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore)) + onSuccess() } } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java index 15352942..7144ccb3 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java @@ -108,7 +108,7 @@ import pl.szczodrzynski.edziennik.utils.models.Date; AttendanceType.class, pl.szczodrzynski.edziennik.data.db.modules.timetable.Lesson.class, ConfigEntry.class, - Metadata.class}, version = 68) + Metadata.class}, version = 69) @TypeConverters({ ConverterTime.class, ConverterDate.class, @@ -823,6 +823,12 @@ public abstract class AppDb extends RoomDatabase { database.execSQL("DELETE FROM metadata WHERE thingType=7"); } }; + private static final Migration MIGRATION_68_69 = new Migration(68, 69) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE loginStores ADD COLUMN loginStoreMode INTEGER NOT NULL DEFAULT 0"); + } + }; public static AppDb getDatabase(final Context context) { @@ -888,7 +894,8 @@ public abstract class AppDb extends RoomDatabase { MIGRATION_64_65, MIGRATION_65_66, MIGRATION_66_67, - MIGRATION_67_68 + MIGRATION_67_68, + MIGRATION_68_69 ) .allowMainThreadQueries() //.fallbackToDestructiveMigration() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/login/LoginStore.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/login/LoginStore.java index 567f84db..e3d25623 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/login/LoginStore.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/login/LoginStore.java @@ -5,7 +5,6 @@ import android.os.Bundle; import androidx.annotation.Nullable; import androidx.room.ColumnInfo; import androidx.room.Entity; -import androidx.room.Ignore; import com.google.gson.JsonElement; import com.google.gson.JsonNull; @@ -28,7 +27,7 @@ public class LoginStore { @ColumnInfo(name = "loginStoreData") public JsonObject data; - @Ignore + @ColumnInfo(name = "loginStoreMode") public int mode = 0; public static final int LOGIN_MODE_LIBRUS_EMAIL = 0; public static final int LOGIN_MODE_LIBRUS_SYNERGIA = 1; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.java index f46fa253..a3088685 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.java @@ -51,6 +51,7 @@ public class LoginChooserFragment extends Fragment { b.loginMobidziennikLogo.setOnClickListener((v) -> nav.navigate(R.id.loginMobidziennikFragment, null, LoginActivity.navOptions)); b.loginLibrusLogo.setOnClickListener((v) -> nav.navigate(R.id.loginLibrusFragment, null, LoginActivity.navOptions)); + b.loginLibrusJstLogo.setOnClickListener((v) -> nav.navigate(R.id.loginLibrusJstFragment, null, LoginActivity.navOptions)); b.loginVulcanLogo.setOnClickListener((v) -> nav.navigate(R.id.loginVulcanFragment, null, LoginActivity.navOptions)); b.loginIuczniowieLogo.setOnClickListener((v) -> nav.navigate(R.id.loginIuczniowieFragment, null, LoginActivity.navOptions)); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.java new file mode 100644 index 00000000..03cb6807 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-12-13. + */ + +package pl.szczodrzynski.edziennik.ui.modules.login; + +import android.os.Bundle; +import android.text.Editable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; +import androidx.fragment.app.Fragment; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; + +import pl.szczodrzynski.edziennik.App; +import pl.szczodrzynski.edziennik.R; +import pl.szczodrzynski.edziennik.api.v2.models.ApiError; +import pl.szczodrzynski.edziennik.databinding.FragmentLoginLibrusJstBinding; +import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar; + +import static pl.szczodrzynski.edziennik.api.v2.ErrorsKt.ERROR_LOGIN_LIBRUS_API_INVALID_LOGIN; +import static pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore.LOGIN_MODE_LIBRUS_JST; +import static pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore.LOGIN_TYPE_LIBRUS; + +public class LoginLibrusJstFragment extends Fragment { + + private App app; + private NavController nav; + private FragmentLoginLibrusJstBinding b; + private static final String TAG = "LoginLibrus"; + private ErrorSnackbar errorSnackbar; + + public LoginLibrusJstFragment() { } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Inflate the layout for this fragment + if (getActivity() != null) { + app = (App) getActivity().getApplicationContext(); + nav = Navigation.findNavController(getActivity(), R.id.nav_host_fragment); + errorSnackbar = ((LoginActivity) getActivity()).errorSnackbar; + } + else { + return null; + } + b = DataBindingUtil.inflate(inflater, R.layout.fragment_login_librus_jst, container, false); + return b.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + assert getContext() != null; + assert getActivity() != null; + + view.postDelayed(() -> { + ApiError error = LoginActivity.error; + if (error != null) { + switch (error.getErrorCode()) { + case ERROR_LOGIN_LIBRUS_API_INVALID_LOGIN: + b.loginCodeLayout.setError(getString(R.string.login_error_incorrect_code_or_pin)); + break; + } + errorSnackbar.addError(error).show(); + LoginActivity.error = null; + } + }, 100); + + b.helpButton.setOnClickListener((v) -> nav.navigate(R.id.loginLibrusHelpFragment, null, LoginActivity.navOptions)); + b.backButton.setOnClickListener((v) -> nav.navigateUp()); + + b.loginButton.setOnClickListener((v) -> { + boolean errors = false; + + b.loginCodeLayout.setError(null); + b.loginPinLayout.setError(null); + + Editable codeEditable = b.loginCode.getText(); + Editable pinEditable = b.loginPin.getText(); + if (codeEditable == null || codeEditable.length() == 0) { + b.loginCodeLayout.setError(getString(R.string.login_error_no_code)); + errors = true; + } + if (pinEditable == null || pinEditable.length() == 0) { + b.loginPinLayout.setError(getString(R.string.login_error_no_pin)); + errors = true; + } + + if (errors) + return; + errors = false; + + String code = codeEditable.toString().toUpperCase(); + String pin = pinEditable.toString(); + b.loginCode.setText(code); + if (!code.matches("[A-Z0-9_]+")) { + b.loginCodeLayout.setError(getString(R.string.login_error_incorrect_code)); + errors = true; + } + if (!pin.matches("[a-z0-9_]+")) { + b.loginPinLayout.setError(getString(R.string.login_error_incorrect_pin)); + errors = true; + } + + if (errors) + return; + errors = false; + + Bundle args = new Bundle(); + args.putInt("loginType", LOGIN_TYPE_LIBRUS); + args.putInt("loginMode", LOGIN_MODE_LIBRUS_JST); + args.putString("accountCode", code); + args.putString("accountPin", pin); + nav.navigate(R.id.loginProgressFragment, args, LoginActivity.navOptions); + }); + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginProgressFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginProgressFragment.java index 625bb0bf..3cc1b2c8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginProgressFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginProgressFragment.java @@ -85,8 +85,10 @@ public class LoginProgressFragment extends Fragment { } int loginType = args.getInt("loginType", -1); + int loginMode = args.getInt("loginMode", 0); LoginStore loginStore = new LoginStore(-1, loginType, new JsonObject()); + loginStore.mode = loginMode; loginStore.copyFrom(args); if (App.devMode && LoginChooserFragment.fakeLogin) { diff --git a/app/src/main/res/drawable/login_logo_oswiata.png b/app/src/main/res/drawable/login_logo_oswiata.png new file mode 100644 index 0000000000000000000000000000000000000000..7cbf5f10b16f90c0c157cea998c1326b924c01ad GIT binary patch literal 28499 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 vN>oLjr%0I0q-S*%`MoDJeGC3S-P!M% literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_login_chooser.xml b/app/src/main/res/layout/fragment_login_chooser.xml index 9b7937fa..010237c3 100644 --- a/app/src/main/res/layout/fragment_login_chooser.xml +++ b/app/src/main/res/layout/fragment_login_chooser.xml @@ -152,6 +152,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_login.xml b/app/src/main/res/navigation/nav_login.xml index 902daba7..c3dd6a38 100644 --- a/app/src/main/res/navigation/nav_login.xml +++ b/app/src/main/res/navigation/nav_login.xml @@ -15,6 +15,9 @@ + @@ -46,6 +49,15 @@ android:id="@+id/action_loginLibrusFragment_to_loginProgressFragment" app:destination="@id/loginProgressFragment" /> + + + In order to use the app you need a Librus account. You can create it on portal.librus.pl. Use the data you normally enter in the fields marked on the image. Help - Librus Log in using your Librus account data (created before on your e-mail address). You can\'t login using the data provided by your school. In case of any problems, use the button below the form. - Log in - Librus + Log in - Librus JST A migration error has occurred. It\'s already reported, which means I\'ll try to fix it.\n\nYou can continue using the app. In case of any problems try to remove the profile and create it again. The app got a huge update. If you encounter any problems, feel free to contact me using the Feedback option in the menu. Szkolny.eu has been updated diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfe8e6e5..a16c4fac 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -373,6 +373,7 @@ Pomoc - Librus Zaloguj się danymi swojego konta Librus (założonego wcześniej na swój adres e-mail). Nie należy logować się danymi otrzymanymi ze swojej szkoły. W razie problemów skorzystaj z przycisku pod formularzem. Zaloguj się - Librus + Zaloguj się - Librus JST Wystąpił błąd w migracji danych. Został on już zgłoszony, co oznacza, że postaram się go naprawić.\n\nMożesz zacząć korzystać z aplikacji, jednak w przypadku jakichś błędów spróbuj usunąć profil i zalogować się ponownie. Aplikacja otrzymała dużą aktualizację. Jeżeli będą występować jakieś problemy w działaniu, możesz się ze mną skontaktować używając pozycji Pomoc i opinie w menu. Szkolny.eu został zaktualizowany @@ -1061,4 +1062,9 @@ Pobieranie ocen z zachowania... Synchronizowanie udostępnionych wydarzeń... Otwieraj menu przyciskiem wstecz + Zaloguj się tokenem i kodem PIN, który można wygenerować po zalogowanu się do Synergii w zakładce Aplikacje mobilne. + Nieprawidłowy token lub PIN + Nieprawidłowy kod lub PIN + Nieprawidłowy kod + Podaj kod