diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2d1ad42c..dd139fc5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,10 +15,14 @@
android:theme="@style/SplashTheme"
android:usesCleartextTraffic="true"
tools:ignore="UnusedAttribute">
+
@@ -29,7 +33,7 @@
@@ -39,7 +43,7 @@
android:label="@string/app_name"
android:theme="@style/AppTheme" />
@@ -101,22 +105,18 @@
android:excludeFromRecents="true"
android:noHistory="true"
android:theme="@style/AppTheme.NoDisplay" />
-
-
-
-
@@ -169,7 +169,6 @@
android:name="android.appwidget.provider"
android:resource="@xml/widget_notifications_info" />
-
@@ -188,7 +187,6 @@
-
@@ -196,14 +194,7 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -222,14 +230,6 @@
-
-
-
-
-
-
@@ -244,4 +244,4 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.java
index d5aca94b..8f606cac 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.java
@@ -30,6 +30,7 @@ import androidx.fragment.app.Fragment;
import androidx.work.WorkManager;
import com.afollestad.materialdialogs.MaterialDialog;
+import com.chuckerteam.chucker.api.Chucker;
import com.mikepenz.iconics.IconicsColor;
import com.mikepenz.iconics.IconicsDrawable;
import com.mikepenz.iconics.IconicsSize;
@@ -50,6 +51,7 @@ import pl.szczodrzynski.edziennik.databinding.CardLuckyNumberBinding;
import pl.szczodrzynski.edziennik.databinding.CardUpdateBinding;
import pl.szczodrzynski.edziennik.databinding.FragmentHomeBinding;
import pl.szczodrzynski.edziennik.receivers.BootReceiver;
+import pl.szczodrzynski.edziennik.ui.modules.login.LoginLibrusCaptchaActivity;
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeActivity;
import pl.szczodrzynski.edziennik.utils.Colors;
import pl.szczodrzynski.edziennik.utils.Themes;
@@ -104,6 +106,14 @@ public class HomeFragment extends Fragment {
b.pruneWorkButton.setOnClickListener((v -> WorkManager.getInstance(app).pruneWork()));
+ b.runChucker.setOnClickListener((v -> {
+ startActivity(Chucker.getLaunchIntent(activity, Chucker.SCREEN_HTTP));
+ }));
+
+ b.librusCaptchaButton.setOnClickListener((v -> {
+ startActivity(new Intent(activity, LoginLibrusCaptchaActivity.class));
+ }));
+
//((TextView)v.findViewById(R.id.nextSync)).setText(getString(R.string.next_sync_format,Time.fromMillis(app.appJobs.syncJobTime).getStringHMS()));
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusCaptchaActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusCaptchaActivity.kt
new file mode 100644
index 00000000..3db5ca45
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusCaptchaActivity.kt
@@ -0,0 +1,116 @@
+package pl.szczodrzynski.edziennik.ui.modules.login
+
+import android.annotation.SuppressLint
+import android.graphics.Color
+import android.os.Build
+import android.os.Bundle
+import android.util.Base64
+import android.webkit.JavascriptInterface
+import android.webkit.WebView
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import com.afollestad.materialdialogs.MaterialDialog
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import pl.szczodrzynski.edziennik.R
+import pl.szczodrzynski.edziennik.api.v2.LIBRUS_USER_AGENT
+import pl.szczodrzynski.edziennik.utils.Themes
+import pl.szczodrzynski.edziennik.utils.Utils.hexFromColorInt
+import java.nio.charset.Charset
+
+class LoginLibrusCaptchaActivity : AppCompatActivity() {
+ companion object {
+ private const val TAG = "LoginLibrusCaptchaActivity"
+ }
+
+ private lateinit var webView: WebView
+ private lateinit var dialog: AlertDialog
+ private lateinit var jsInterface: CaptchaCallbackInterface
+
+ @SuppressLint("AddJavascriptInterface", "SetJavaScriptEnabled")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setTheme(Themes.appThemeNoDisplay)
+ setFinishOnTouchOutside(false)
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ WebView.setWebContentsDebuggingEnabled(true)
+ }
+
+ val base64Content = """
+PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vd3d3Lmdvb2ds
+ZS5jb20vcmVjYXB0Y2hhL2FwaS5qcz9vbmxvYWQ9cmVhZHkmcmVuZGVyPWV4cGxpY2l0Ij48L3Nj
+cmlwdD48L2hlYWQ+PGJvZHk+PGJyPjxjZW50ZXIgaWQ9ImdyIj48L2NlbnRlcj48YnI+PHNjcmlw
+dD5mdW5jdGlvbiByZWFkeSgpe2dyZWNhcHRjaGEucmVuZGVyKCdncicse3NpdGVrZXk6JzZMZjQ4
+bW9VQUFBQUFCOUNsaGR2SHI0NmdSV1ItQ04zMUNYUVBHMlUnLHRoZW1lOidUSEVNRScsY2FsbGJh
+Y2s6ZnVuY3Rpb24oZSl7d2luZG93LmlmLmNhbGxiYWNrKGUpO30sImV4cGlyZWQtY2FsbGJhY2si
+OmZ1bmN0aW9uKCl7d2luZG93LmlmLmV4cGlyZWRDYWxsYmFjayhlKTt9LCJlcnJvci1jYWxsYmFj
+ayI6ZnVuY3Rpb24oKXt3aW5kb3cuaWYuZXJyb3JDYWxsYmFjayhlKTt9fSk7fTwvc2NyaXB0Pjwv
+Ym9keT48L2h0bWw+"""
+
+ val backgroundColor = if (Themes.isDark) 0x424242 else 0xffffff
+ val backgroundColorString = hexFromColorInt(backgroundColor)
+
+ val htmlContent = Base64.decode(base64Content, Base64.DEFAULT)
+ .toString(Charset.defaultCharset())
+ .replace("COLOR", backgroundColorString, true)
+ .replace("THEME", if (Themes.isDark) "dark" else "light")
+
+ jsInterface = object : CaptchaCallbackInterface {
+ @JavascriptInterface
+ override fun callback(recaptchaResponse: String) {
+ MaterialDialog.Builder(this@LoginLibrusCaptchaActivity)
+ .title("Captcha checked")
+ .content("Response: $recaptchaResponse")
+ .positiveText("OK")
+ .show()
+ }
+
+ @JavascriptInterface
+ override fun expiredCallback() {
+ MaterialDialog.Builder(this@LoginLibrusCaptchaActivity)
+ .title("Captcha expired")
+ .content("Captcha expired")
+ .positiveText("OK")
+ .show()
+ }
+
+ @JavascriptInterface
+ override fun errorCallback() {
+ MaterialDialog.Builder(this@LoginLibrusCaptchaActivity)
+ .title("Captcha error")
+ .content("Captcha error")
+ .positiveText("OK")
+ .show()
+ }
+ }
+
+ webView = WebView(this).apply {
+ //setBackgroundColor((backgroundColor.toLong() or 0xff000000).toInt())
+ setBackgroundColor(Color.TRANSPARENT)
+ settings.javaScriptEnabled = true
+ settings.userAgentString = LIBRUS_USER_AGENT
+ addJavascriptInterface(jsInterface, "if")
+ loadDataWithBaseURL("https://portal.librus.pl/rodzina/login/", htmlContent, "text/html", "UTF-8", null)
+ setLayerType(WebView.LAYER_TYPE_SOFTWARE, null)
+ }
+
+ dialog = MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.login_librus_captcha_title)
+ .setView(webView)
+ .setNegativeButton(R.string.cancel) { dialog, _ ->
+ dialog.dismiss()
+ finish()
+ }
+ .setCancelable(false)
+ .show()
+ }
+
+ interface CaptchaCallbackInterface {
+ @JavascriptInterface
+ fun callback(recaptchaResponse: String)
+ @JavascriptInterface
+ fun expiredCallback()
+ @JavascriptInterface
+ fun errorCallback()
+ }
+}
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index cedad80b..10b278a4 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -36,24 +36,46 @@
android:layout_height="wrap_content"
android:visibility="gone"
android:orientation="vertical"
- tools:visibility="visible">
+ tools:visibility="visible"
+ tools:ignore="HardcodedText">
+
+
+
+
+
+ android:layout_height="wrap_content"
+ android:gravity="center">
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a08886af..dafa8099 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -984,4 +984,5 @@
Nie pytaj ponownie
Nie udało się otworzyć ustawień
Tworzenie powiadomień
+ Librus - logowanie