diff --git a/app/build.gradle b/app/build.gradle index 0121d93a..beadd513 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -166,8 +166,8 @@ dependencies { //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" + implementation "com.github.ChuckerTeam.Chucker:library:3.0.1" + //releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1" //implementation 'com.github.wulkanowy:uonet-request-signer:master-SNAPSHOT' //implementation 'com.github.kuba2k2.uonet-request-signer:android:master-63f094b14a-1' diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt index 6469fc0d..b2dc9e0e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt @@ -60,6 +60,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { get() = profile.id var devMode = false + var debugMode = false } val notificationChannelsManager by lazy { NotificationChannelsManager(this) } @@ -103,7 +104,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { .readTimeout(10, TimeUnit.SECONDS) builder.installHttpsSupport(this) - if (devMode || BuildConfig.DEBUG) { + if (debugMode || BuildConfig.DEBUG) { HyperLog.initialize(this) HyperLog.setLogLevel(Log.VERBOSE) HyperLog.setLogFormat(DebugLogFormat(this)) @@ -158,6 +159,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { Iconics.registerFont(SzkolnyFont) App.db = AppDb(this) Themes.themeInt = config.ui.theme + debugMode = config.debugMode MHttp.instance().customOkHttpClient(http) if (!profileLoadById(config.lastProfileId)) { @@ -174,6 +176,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { if (config.devModePassword != null) checkDevModePassword() + debugMode = devMode || config.debugMode if (config.sync.enabled) SyncWorker.scheduleNext(this@App, false) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt index 46fdc63b..4e7a4c23 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt @@ -75,6 +75,11 @@ class Config(val db: AppDb) : CoroutineScope, AbstractConfig { get() { mPrivacyPolicyAccepted = mPrivacyPolicyAccepted ?: values.get("privacyPolicyAccepted", false); return mPrivacyPolicyAccepted ?: false } set(value) { set("privacyPolicyAccepted", value); mPrivacyPolicyAccepted = value } + private var mDebugMode: Boolean? = null + var debugMode: Boolean + get() { mDebugMode = mDebugMode ?: values.get("debugMode", false); return mDebugMode ?: false } + set(value) { set("debugMode", value); mDebugMode = value } + private var mDevModePassword: String? = null var devModePassword: String? get() { mDevModePassword = mDevModePassword ?: values.get("devModePassword", null as String?); return mDevModePassword } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginActivity.kt index 42dc3606..7f65279f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginActivity.kt @@ -23,6 +23,7 @@ class LoginActivity : AppCompatActivity(), CoroutineScope { private const val TAG = "LoginActivity" @JvmField var navOptions: NavOptions? = null + var thisOneIsTricky = 0 } private val app: App by lazy { applicationContext as App } @@ -73,6 +74,8 @@ class LoginActivity : AppCompatActivity(), CoroutineScope { super.onCreate(savedInstanceState) setTheme(R.style.AppTheme_Light) + thisOneIsTricky = -1 + navOptions = NavOptions.Builder() .setEnterAnim(R.anim.slide_in_right) .setExitAnim(R.anim.slide_out_left) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.kt index ef5f0099..ee48a453 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginChooserFragment.kt @@ -3,16 +3,25 @@ package pl.szczodrzynski.edziennik.ui.modules.login import android.app.Activity import android.content.Intent import android.os.Bundle +import android.os.Process import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.AnimationUtils import android.widget.CompoundButton import androidx.fragment.app.Fragment +import com.afollestad.materialdialogs.DialogAction +import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.databinding.FragmentLoginChooserBinding +import pl.szczodrzynski.edziennik.onChange import pl.szczodrzynski.edziennik.onClick import pl.szczodrzynski.edziennik.ui.modules.feedback.FeedbackActivity +import pl.szczodrzynski.edziennik.utils.Anim +import kotlin.system.exitProcess + class LoginChooserFragment : Fragment() { companion object { @@ -34,6 +43,20 @@ class LoginChooserFragment : Fragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + b.topLogo.onClick { + if (LoginActivity.thisOneIsTricky <= -1) { + LoginActivity.thisOneIsTricky = 999 + } + if (LoginActivity.thisOneIsTricky in 0..7) { + LoginActivity.thisOneIsTricky++ + if (LoginActivity.thisOneIsTricky == 7) { + b.topLogo.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.shake)); + if (b.devMode.visibility != View.VISIBLE) + Anim.expand(b.devMode, 500, null); + LoginActivity.thisOneIsTricky = 3 + } + } + } b.loginMobidziennikLogo.onClick { nav.navigate(R.id.loginMobidziennikFragment, null, LoginActivity.navOptions) } b.loginLibrusLogo.onClick { nav.navigate(R.id.loginLibrusFragment, null, LoginActivity.navOptions) } b.loginVulcanLogo.onClick { nav.navigate(R.id.loginVulcanFragment, null, LoginActivity.navOptions) } @@ -61,6 +84,46 @@ class LoginChooserFragment : Fragment() { } } + b.devMode.visibility = if (App.debugMode) View.VISIBLE else View.GONE + b.devMode.onChange { v, isChecked -> + if (isChecked) { + MaterialDialog.Builder(activity) + .title(R.string.are_you_sure) + .content(R.string.dev_mode_enable_warning) + .positiveText(R.string.yes) + .negativeText(R.string.no) + .onPositive { _: MaterialDialog?, _: DialogAction? -> + app.config.debugMode = true + MaterialAlertDialogBuilder(activity) + .setTitle("Restart") + .setMessage("Wymagany restart aplikacji") + .setPositiveButton("OK") { _, _ -> + Process.killProcess(Process.myPid()) + Runtime.getRuntime().exit(0) + exitProcess(0) + } + .setCancelable(false) + .show() + /*if (b.devModeLayout.getVisibility() !== View.VISIBLE) { + Anim.expand(b.devModeTitle, 500, null) + Anim.expand(b.devModeLayout, 500, null) + }*/ + } + .onNegative { _: MaterialDialog?, _: DialogAction? -> + b.devMode.isChecked = app.config.debugMode + b.devMode.jumpDrawablesToCurrentState() + Anim.collapse(b.devMode, 1000, null) + } + .show() + } else { + app.config.debugMode = false + /*if (b.devModeLayout.getVisibility() === View.VISIBLE) { + Anim.collapse(b.devModeTitle, 500, null) + Anim.collapse(b.devModeLayout, 500, null) + }*/ + } + } + b.fakeLogin.visibility = if (App.devMode) View.VISIBLE else View.GONE b.fakeLogin.isChecked = fakeLogin b.fakeLogin.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> @@ -69,4 +132,4 @@ class LoginChooserFragment : Fragment() { b.helpButton.onClick { startActivity(Intent(activity, FeedbackActivity::class.java)) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginEdudziennikFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginEdudziennikFragment.kt index d150add9..be1a83a7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginEdudziennikFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginEdudziennikFragment.kt @@ -4,6 +4,9 @@ package pl.szczodrzynski.edziennik.ui.modules.login +import android.animation.ArgbEvaluator +import android.animation.ObjectAnimator +import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -19,6 +22,7 @@ import pl.szczodrzynski.edziennik.databinding.FragmentLoginEdudziennikBinding import java.util.* import kotlin.coroutines.CoroutineContext + class LoginEdudziennikFragment : Fragment(), CoroutineScope { companion object { private const val TAG = "LoginEdudziennikFragment" @@ -28,6 +32,7 @@ class LoginEdudziennikFragment : Fragment(), CoroutineScope { private lateinit var activity: LoginActivity private lateinit var b: FragmentLoginEdudziennikBinding private val nav by lazy { activity.nav } + private var hehe = 0 private val job: Job = Job() override val coroutineContext: CoroutineContext @@ -52,6 +57,29 @@ class LoginEdudziennikFragment : Fragment(), CoroutineScope { } } + b.topText.onClick { + if (LoginActivity.thisOneIsTricky != -1) + return@onClick + hehe++ + if (hehe >= 5) { + LoginActivity.thisOneIsTricky = 3 + val colorAnim = ObjectAnimator.ofInt( + b.topText, + "textColor", + Color.BLACK, + Color.RED, + Color.BLACK, + Color.RED, + Color.BLACK, + Color.RED, + Color.BLACK + ) + colorAnim.setEvaluator(ArgbEvaluator()) + colorAnim.duration = 1500L + colorAnim.start() + } + } + b.backButton.onClick { nav.navigateUp() } b.loginButton.onClick { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java b/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java index 910fc6f0..082d800d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java @@ -108,7 +108,7 @@ public class Utils { public static List debugLog = new ArrayList<>(); public static void d(String TAG, String message) { - if (App.Companion.getDevMode()) { + if (App.Companion.getDebugMode()) { HyperLog.d("Szkolny/"+TAG, message); //debugLog.add(TAG+": "+message); } diff --git a/app/src/main/res/anim/shake.xml b/app/src/main/res/anim/shake.xml new file mode 100644 index 00000000..40cccc66 --- /dev/null +++ b/app/src/main/res/anim/shake.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/layout/fragment_login_chooser.xml b/app/src/main/res/layout/fragment_login_chooser.xml index a9a85047..8a7c0f77 100644 --- a/app/src/main/res/layout/fragment_login_chooser.xml +++ b/app/src/main/res/layout/fragment_login_chooser.xml @@ -24,6 +24,7 @@ android:orientation="vertical"> + + + android:text="Fake login" + android:visibility="gone" + tools:visibility="visible"/> diff --git a/app/src/main/res/layout/fragment_login_edudziennik.xml b/app/src/main/res/layout/fragment_login_edudziennik.xml index 588eb6b0..551962b5 100644 --- a/app/src/main/res/layout/fragment_login_edudziennik.xml +++ b/app/src/main/res/layout/fragment_login_edudziennik.xml @@ -44,6 +44,7 @@ tools:srcCompat="@tools:sample/avatars" /> Czy na pewno chcesz zastosować te ustawienia?\n\nNie będziesz widział informacji o niektórych danych, przez co możesz przeoczyć ważne komunikaty, wiadomości lub oceny.\n\nUstawienia zostaną zastosowane dla aktualnie otwartego profilu. %s - %s (%s lekcji - %s godzin %s minut) + Developer mode + Te ustawienia nie są przeznaczone dla zwykłych użytkowników, wyłącznie dla twórcy tej aplikacji.\n\nNie są nawet w żaden sposób opisane, nie wiadomo co robią, więc możesz nawet nie wiedzieć kiedy coś zepsujesz.\n\nWłączenie tych opcji może spowodować utratę danych w aplikacji, uszkodzenie twojego systemu lub nawet uruchomienie wirusa na baterii.\n\nLepiej uważaj.