From d780d5118d612585a87fa68b4af1fc91fedc391a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 5 Sep 2020 18:38:53 +0200 Subject: [PATCH 001/408] [Proguard] Add rules to fix API responses. --- app/proguard/app.pro | 4 ++-- .../edziennik/ui/dialogs/RegisterUnavailableDialog.kt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/proguard/app.pro b/app/proguard/app.pro index 68d1fde8..b96a904c 100644 --- a/app/proguard/app.pro +++ b/app/proguard/app.pro @@ -64,6 +64,6 @@ -keep class pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing { public final byte[] pleaseStopRightNow(java.lang.String, long); } --keepclassmembernames class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; } --keepclassmembernames class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; } +-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; } +-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; } -keepclassmembernames class pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo.Platform { *; } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt index e1e4b2b6..57397726 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt @@ -67,6 +67,7 @@ class RegisterUnavailableDialog( onDismissListener?.invoke(TAG) } .show() + return@run } val update = app.config.update From bd2a9524c6e414b1c14ae9f5570d4751df824ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 5 Sep 2020 18:47:30 +0200 Subject: [PATCH 002/408] [UI] Use HtmlCompat instead of Html. Fix a typo. --- .../edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt | 6 +++--- app/src/main/res/layout/dialog_register_unavailable.xml | 6 +++--- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt index eefd4f6f..f5e58541 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt @@ -4,11 +4,11 @@ package pl.szczodrzynski.edziennik.ui.modules.home.cards -import android.text.Html import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import androidx.core.text.HtmlCompat import androidx.core.view.isVisible import androidx.core.view.plusAssign import androidx.core.view.setMargins @@ -59,8 +59,8 @@ class HomeAvailabilityCard( var onInfoClick = { _: View -> } if (status != null && !status.available && status.message != null) { - b.homeAvailabilityTitle.text = Html.fromHtml(status.message.title) - b.homeAvailabilityText.text = Html.fromHtml(status.message.contentShort) + b.homeAvailabilityTitle.text = HtmlCompat.fromHtml(status.message.title, HtmlCompat.FROM_HTML_MODE_LEGACY) + b.homeAvailabilityText.text = HtmlCompat.fromHtml(status.message.contentShort, HtmlCompat.FROM_HTML_MODE_LEGACY) b.homeAvailabilityUpdate.isVisible = false b.homeAvailabilityIcon.setImageResource(R.drawable.ic_sync) if (status.message.icon != null) diff --git a/app/src/main/res/layout/dialog_register_unavailable.xml b/app/src/main/res/layout/dialog_register_unavailable.xml index da86a52b..a47bf17c 100644 --- a/app/src/main/res/layout/dialog_register_unavailable.xml +++ b/app/src/main/res/layout/dialog_register_unavailable.xml @@ -8,7 +8,7 @@ - + @@ -45,7 +45,7 @@ android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@{Html.fromHtml(message.title)}" + android:text="@{HtmlCompat.fromHtml(message.title, HtmlCompat.FROM_HTML_MODE_LEGACY)}" android:textAppearance="@style/NavView.TextView.Title" tools:text="Dziennik nie działa" /> @@ -54,7 +54,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:text="@{Html.fromHtml(message.contentLong)}" + android:text="@{HtmlCompat.fromHtml(message.contentLong, HtmlCompat.FROM_HTML_MODE_LEGACY)}" tools:text="Dziennik się zepsuł i nie działa, szkoda\n\n\nwiele linijek ma ten tekst" /> Brak aktualnego profilu Uczeń %s nie posiada profilu na tym koncie w aktualnym roku szkolnym. Prawdopodobnie ten profil został usunięty lub uczeń nie uczęszcza już do tej klasy.\n\nAby przejść do aktualnego profilu, wybierz ucznia z listy lub zaloguj się na jego konto przyciskiem Dodaj ucznia. Znaki towarowe zamieszczone w tej aplikacji należą do ich prawowitych właścicieli i są używane wyłącznie w celach informacyjnych. - Dostępna aktualiacja aplikacji + Dostępna aktualizacja aplikacji Używasz starej wersji aplikacji Szkolny.eu (%s). Aby móc korzystać z aplikacji oraz zapewnić najlepsze działanie, zaktualizuj aplikację do wersji %s.\n\nDziennik zmian:\n%s Posiadasz nieaktualną wersję aplikacji Szkolny.eu. Aby móc dalej synchronizować dane, musisz zaktualizować aplikację. Aktualizuj From 810cfd8092798d8b861899eafb762d1f1e3728af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 5 Sep 2020 19:13:37 +0200 Subject: [PATCH 003/408] [API] Rename response parameters to fix compatibility. --- .../java/pl/szczodrzynski/edziennik/MainActivity.kt | 2 +- .../edziennik/data/api/edziennik/EdziennikTask.kt | 2 +- .../szkolny/response/RegisterAvailabilityStatus.kt | 4 ++-- .../ui/dialogs/RegisterUnavailableDialog.kt | 12 ++++++------ .../ui/modules/home/cards/HomeAvailabilityCard.kt | 10 +++++----- .../ui/modules/login/LoginChooserFragment.kt | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index e1fe3b0c..28331a75 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -647,7 +647,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope { app.profile.registerName?.let { registerName -> var status = app.config.sync.registerAvailability[registerName] - if (status == null || status.nextCheck < currentTimeUnix()) { + if (status == null || status.nextCheckAt < currentTimeUnix()) { withContext(Dispatchers.IO) { val api = SzkolnyApi(app) api.runCatching(this@MainActivity) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt index aa316948..c6938f7a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt @@ -93,7 +93,7 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa profile.registerName?.let { registerName -> var status = app.config.sync.registerAvailability[registerName] - if (status == null || status.nextCheck < currentTimeUnix()) { + if (status == null || status.nextCheckAt < currentTimeUnix()) { val api = SzkolnyApi(app) api.runCatching({ val availability = getRegisterAvailability() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/RegisterAvailabilityStatus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/RegisterAvailabilityStatus.kt index 0596a8ac..82f2e050 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/RegisterAvailabilityStatus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/RegisterAvailabilityStatus.kt @@ -11,8 +11,8 @@ import pl.szczodrzynski.edziennik.currentTimeUnix data class RegisterAvailabilityStatus( val available: Boolean, val name: String?, - val message: Message?, - val nextCheck: Long = currentTimeUnix() + 7 * DAY, + val userMessage: Message?, + val nextCheckAt: Long = currentTimeUnix() + 7 * DAY, val minVersionCode: Int = BuildConfig.VERSION_CODE ) { data class Message( diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt index 57397726..6ecd494f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/RegisterUnavailableDialog.kt @@ -47,14 +47,14 @@ class RegisterUnavailableDialog( onShowListener?.invoke(TAG) app = activity.applicationContext as App - if (!status.available && status.message != null) { + if (!status.available && status.userMessage != null) { val b = DialogRegisterUnavailableBinding.inflate(LayoutInflater.from(activity), null, false) - b.message = status.message - if (status.message.image != null) - b.image.load(status.message.image) - if (status.message.url != null) { + b.message = status.userMessage + if (status.userMessage.image != null) + b.image.load(status.userMessage.image) + if (status.userMessage.url != null) { b.readMore.onClick { - Utils.openUrl(activity, status.message.url) + Utils.openUrl(activity, status.userMessage.url) } } b.text.movementMethod = LinkMovementMethod.getInstance() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt index f5e58541..957dff0c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeAvailabilityCard.kt @@ -58,13 +58,13 @@ class HomeAvailabilityCard( var onInfoClick = { _: View -> } - if (status != null && !status.available && status.message != null) { - b.homeAvailabilityTitle.text = HtmlCompat.fromHtml(status.message.title, HtmlCompat.FROM_HTML_MODE_LEGACY) - b.homeAvailabilityText.text = HtmlCompat.fromHtml(status.message.contentShort, HtmlCompat.FROM_HTML_MODE_LEGACY) + if (status != null && !status.available && status.userMessage != null) { + b.homeAvailabilityTitle.text = HtmlCompat.fromHtml(status.userMessage.title, HtmlCompat.FROM_HTML_MODE_LEGACY) + b.homeAvailabilityText.text = HtmlCompat.fromHtml(status.userMessage.contentShort, HtmlCompat.FROM_HTML_MODE_LEGACY) b.homeAvailabilityUpdate.isVisible = false b.homeAvailabilityIcon.setImageResource(R.drawable.ic_sync) - if (status.message.icon != null) - b.homeAvailabilityIcon.load(status.message.icon) + if (status.userMessage.icon != null) + b.homeAvailabilityIcon.load(status.userMessage.icon) onInfoClick = { RegisterUnavailableDialog(activity, status) } 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 90945294..abbb4ad9 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 @@ -117,7 +117,7 @@ class LoginChooserFragment : Fragment(), CoroutineScope { else -> null }?.let { registerName -> var status = app.config.sync.registerAvailability[registerName] - if (status == null || status.nextCheck < currentTimeUnix()) { + if (status == null || status.nextCheckAt < currentTimeUnix()) { withContext(Dispatchers.IO) { val api = SzkolnyApi(app) api.runCatching(activity) { From 8e3d4043522dbed820e93cfe6ded13995a1c4dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 5 Sep 2020 19:14:11 +0200 Subject: [PATCH 004/408] [4.4.2] Update build.gradle, signing and changelog. --- app/src/main/assets/pl-changelog.html | 3 ++- app/src/main/cpp/szkolny-signing.cpp | 2 +- .../edziennik/data/api/szkolny/interceptor/Signing.kt | 2 +- build.gradle | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index 217e9cd2..c7150a83 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -1,8 +1,9 @@ -

Wersja 4.4.1, 2020-09-03

+

Wersja 4.4.2, 2020-09-05

  • Poprawione komunikaty o aktualizacjach aplikacji.
  • Mobidziennik: poprawione wyświetlanie przedmiotu w planie lekcji.
  • Mobidziennik: naprawiony moduł frekwencji.
  • +
  • Naprawione zatrzymanie aplikacji na ekranie logowania.


diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp index 4d19eb33..9642f8a9 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] = { - 0x72, 0x4b, 0x61, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + 0x1a, 0xcd, 0xf0, 0x80, 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 76fc1193..4d9f425c 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.MTIzNDU2Nzg5MDv1BTei5k===.$param2".sha256() + return "$param1.MTIzNDU2Nzg5MDx45DzIF8===.$param2".sha256() } } diff --git a/build.gradle b/build.gradle index 1f63c6ba..43dc3e9f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.3.61' release = [ - versionName: "4.4.1", - versionCode: 4040199 + versionName: "4.4.2", + versionCode: 4040299 ] setup = [ From 752cdfa8d6267f2be4dfa60a2775b06af3d66ea1 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Thu, 17 Sep 2020 17:30:28 +0200 Subject: [PATCH 005/408] Implement wear module base. --- .idea/compiler.xml | 1 + .../pl/szczodrzynski/edziennik/Extensions.kt | 2 +- .../edziennik/ui/modules/home/HomeFragment.kt | 3 +- build.gradle | 2 + settings.gradle | 2 + wear/.gitignore | 1 + wear/build.gradle | 48 +++-- wear/proguard-rules.pro | 21 +++ .../edziennik/ExampleInstrumentedTest.kt | 26 +++ wear/src/main/AndroidManifest.xml | 37 ++-- .../szczodrzynski/edziennik/MainActivity.java | 153 --------------- .../szczodrzynski/edziennik/MainActivity.kt | 47 +++++ .../drawable-v24/ic_launcher_foreground.xml | 34 ++++ .../res/drawable/ic_launcher_background.xml | 174 ++++++++++++++++++ wear/src/main/res/layout/activity_main.xml | 56 ++---- .../res/mipmap-anydpi-v26/ic_launcher.xml | 9 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 9 + wear/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2963 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes wear/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6387 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes wear/src/main/res/values-night/themes.xml | 20 ++ wear/src/main/res/values-round/strings.xml | 4 + wear/src/main/res/values/colors.xml | 17 +- wear/src/main/res/values/dimens.xml | 4 + wear/src/main/res/values/strings.xml | 4 + wear/src/main/res/values/styles.xml | 9 - wear/src/main/res/values/themes.xml | 20 ++ wear/src/main/res/values/wear.xml | 6 - .../edziennik/ExampleUnitTest.kt | 20 ++ 36 files changed, 481 insertions(+), 248 deletions(-) create mode 100644 wear/.gitignore create mode 100644 wear/proguard-rules.pro create mode 100644 wear/src/androidTest/java/pl/szczodrzynski/edziennik/ExampleInstrumentedTest.kt delete mode 100644 wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.java create mode 100644 wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt create mode 100644 wear/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 wear/src/main/res/drawable/ic_launcher_background.xml create mode 100644 wear/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 wear/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 wear/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 wear/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 wear/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 wear/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 wear/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 wear/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 wear/src/main/res/values-night/themes.xml delete mode 100644 wear/src/main/res/values/styles.xml create mode 100644 wear/src/main/res/values/themes.xml delete mode 100644 wear/src/main/res/values/wear.xml create mode 100644 wear/src/test/java/pl/szczodrzynski/edziennik/ExampleUnitTest.kt diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 733f463f..12871fc6 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -11,6 +11,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index 7306109a..d7fb13de 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -299,7 +299,7 @@ fun colorFromCssName(name: String): Int { "orange" -> 0xffffa500 "black" -> 0xff000000 "white" -> 0xffffffff - else -> -1 + else -> -1L }.toInt() } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt index 1b53e826..8afd7c04 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt @@ -152,13 +152,14 @@ class HomeFragment : Fragment(), CoroutineScope { val items = mutableListOf() cards.mapNotNullTo(items) { + @Suppress("USELESS_CAST") when (it.cardId) { HomeCard.CARD_LUCKY_NUMBER -> HomeLuckyNumberCard(it.cardId, app, activity, this, app.profile) HomeCard.CARD_TIMETABLE -> HomeTimetableCard(it.cardId, app, activity, this, app.profile) HomeCard.CARD_GRADES -> HomeGradesCard(it.cardId, app, activity, this, app.profile) HomeCard.CARD_EVENTS -> HomeEventsCard(it.cardId, app, activity, this, app.profile) else -> null - } + } as HomeCard? } //if (App.devMode) // items += HomeDebugCard(100, app, activity, this, app.profile) diff --git a/build.gradle b/build.gradle index 43dc3e9f..6ef45518 100644 --- a/build.gradle +++ b/build.gradle @@ -53,6 +53,8 @@ buildscript { retrofit : "2.6.4" ] + versions.kotlin = '1.4.0' + versions.kotlin = '1.4.0' } repositories { diff --git a/settings.gradle b/settings.gradle index 3625fac9..b43e4d66 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,5 @@ +include ':wear' +include ':wear' include ':codegen' include ':annotation' rootProject.name='Szkolny.eu' diff --git a/wear/.gitignore b/wear/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/wear/.gitignore @@ -0,0 +1 @@ +/build diff --git a/wear/build.gradle b/wear/build.gradle index 6e4aa162..5b531ae4 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -1,37 +1,53 @@ -apply plugin: 'com.android.application' +/* + * Copyright (c) Kacper Ziubryniewicz 2020-9-17 + */ + +plugins { + id 'com.android.application' + id 'kotlin-android' +} android { - compileSdkVersion 28 - + compileSdkVersion 29 + buildToolsVersion "29.0.3" defaultConfig { applicationId "pl.szczodrzynski.edziennik" minSdkVersion 23 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 1 versionName "1.0" - multiDexEnabled true + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { - sourceCompatibility = '1.8' - targetCompatibility = '1.8' + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' } } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin}" + implementation 'androidx.core:core-ktx:1.3.1' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + testImplementation 'junit:junit:4.13' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - implementation 'com.google.android.support:wearable:2.4.0' - implementation 'com.google.android.gms:play-services-wearable:16.0.1' - implementation 'androidx.percentlayout:percentlayout:1.0.0-beta01' - implementation 'androidx.legacy:legacy-support-v4:1.0.0-beta01' - implementation 'androidx.recyclerview:recyclerview:1.0.0-beta01' - implementation 'androidx.wear:wear:1.0.0-beta01' - compileOnly 'com.google.android.wearable:wearable:2.4.0' + implementation 'androidx.wear:wear:1.0.0' + implementation 'com.google.android.support:wearable:2.7.0' + compileOnly 'com.google.android.wearable:wearable:2.7.0' + + implementation "com.google.android.gms:play-services-wearable:${versions.play_services}" } diff --git a/wear/proguard-rules.pro b/wear/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/wear/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/wear/src/androidTest/java/pl/szczodrzynski/edziennik/ExampleInstrumentedTest.kt b/wear/src/androidTest/java/pl/szczodrzynski/edziennik/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..84289796 --- /dev/null +++ b/wear/src/androidTest/java/pl/szczodrzynski/edziennik/ExampleInstrumentedTest.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2020-9-17 + */ + +package pl.szczodrzynski.edziennik + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("pl.szczodrzynski.edziennik", appContext.packageName) + } +} diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 8148e132..803bc28d 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -1,44 +1,43 @@ + + - + - - - + - - - + android:theme="@style/Theme.Szkolnyeu"> + + + + android:label="@string/app_name"> - - - - \ No newline at end of file + diff --git a/wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.java b/wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.java deleted file mode 100644 index b96fff96..00000000 --- a/wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.java +++ /dev/null @@ -1,153 +0,0 @@ -package pl.szczodrzynski.edziennik; - -import android.app.Activity; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import androidx.wear.widget.drawer.WearableDrawerLayout; -import androidx.wear.widget.drawer.WearableDrawerView; -import androidx.wear.widget.drawer.WearableNavigationDrawerView; -import android.support.wearable.activity.WearableActivity; -import android.util.Log; -import android.view.View; -import android.widget.ProgressBar; - -import com.google.android.gms.tasks.Task; -import com.google.android.gms.wearable.CapabilityClient; -import com.google.android.gms.wearable.CapabilityInfo; -import com.google.android.gms.wearable.DataEvent; -import com.google.android.gms.wearable.DataItem; -import com.google.android.gms.wearable.Node; -import com.google.android.gms.wearable.PutDataMapRequest; -import com.google.android.gms.wearable.PutDataRequest; -import com.google.android.gms.wearable.Wearable; - -import java.util.Arrays; -import java.util.Set; - -public class MainActivity extends WearableActivity { - - private static final String TAG = "MainActivity"; - private ProgressBar progressBar; - private WearableDrawerLayout wearableDrawerLayout; - private WearableNavigationDrawerView mWearableNavigationDrawer; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - // Enables Always-on - setAmbientEnabled(); - - progressBar = findViewById(R.id.progressBar); - - wearableDrawerLayout = findViewById(R.id.drawer_layout); - wearableDrawerLayout.setDrawerStateCallback(new WearableDrawerLayout.DrawerStateCallback() { - @Override - public void onDrawerOpened(WearableDrawerLayout layout, WearableDrawerView drawerView) { - super.onDrawerOpened(layout, drawerView); - } - - @Override - public void onDrawerClosed(WearableDrawerLayout layout, WearableDrawerView drawerView) { - super.onDrawerClosed(layout, drawerView); - progressBar.setVisibility(View.GONE); - } - }); - - mWearableNavigationDrawer = (WearableNavigationDrawerView) findViewById(R.id.top_navigation_drawer); - WearableNavigationDrawerView.WearableNavigationDrawerAdapter navigationDrawerAdapter = new NavigationDrawerAdapter(this); - mWearableNavigationDrawer.setAdapter(navigationDrawerAdapter); - mWearableNavigationDrawer.addOnItemSelectedListener(new WearableNavigationDrawerView.OnItemSelectedListener() { - @Override - public void onItemSelected(int i) { - //Toast.makeText(MainActivity.this, "Selected item "+i, Toast.LENGTH_SHORT).show(); - progressBar.setVisibility(View.VISIBLE); - } - }); - // Peeks navigation drawer on the top. - mWearableNavigationDrawer.getController().peekDrawer(); - - Wearable.getMessageClient(this).addListener(messageEvent -> { - Log.d(TAG, messageEvent.getPath()+" :: "+ Arrays.toString(messageEvent.getData())); - }); - - Task capabilityInfoTask = - Wearable.getCapabilityClient(this) - .getCapability("edziennik_phone_app", CapabilityClient.FILTER_REACHABLE); - capabilityInfoTask.addOnCompleteListener((task) -> { - if (task.isSuccessful()) { - CapabilityInfo capabilityInfo = task.getResult(); - assert capabilityInfo != null; - Set nodes; - nodes = capabilityInfo.getNodes(); - Log.d(TAG, "Nodes "+nodes); - } else { - Log.d(TAG, "Capability request failed to return any results."); - } - }); - - Wearable.getDataClient(this).addListener(dataEventBuffer -> { - Log.d(TAG, "onDataChanged(): " + dataEventBuffer); - - for (DataEvent event : dataEventBuffer) { - if (event.getType() == DataEvent.TYPE_CHANGED) { - String path = event.getDataItem().getUri().getPath(); - Log.d(TAG, "Data "+path+ " :: "+Arrays.toString(event.getDataItem().getData())); - } - } - }); - - findViewById(R.id.test).setOnClickListener((v -> { - PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/ping"); - putDataMapRequest.getDataMap().putLong("millis", System.currentTimeMillis()); - - PutDataRequest request = putDataMapRequest.asPutDataRequest(); - request.setData("Hello".getBytes()); - request.setUrgent(); - - Log.d(TAG, "Generating DataItem: " + request); - - Task dataItemTask = - Wearable.getDataClient(getApplicationContext()).putDataItem(request); - dataItemTask.addOnCompleteListener(task -> { - if (task.isSuccessful()) { - - Log.d(TAG, "success"); - } else { - Log.d(TAG, "Capability request failed to return any results."); - } - }); - })); - - - - // Block on a task and get the result synchronously (because this is on a background - // thread). - //DataItem dataItem = dataItemTask.getResult(); - - //Log.d(TAG, "DataItem saved: " + dataItem); - - } - - - private class NavigationDrawerAdapter extends WearableNavigationDrawerView.WearableNavigationDrawerAdapter { - public NavigationDrawerAdapter(Activity activity) { - - } - - @Override - public CharSequence getItemText(int i) { - return "Item "+i; - } - - @Override - public Drawable getItemDrawable(int i) { - return null; - } - - @Override - public int getCount() { - return 5; - } - } -} diff --git a/wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt new file mode 100644 index 00000000..ed694372 --- /dev/null +++ b/wear/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2020-9-17 + */ + +package pl.szczodrzynski.edziennik + +import android.os.Bundle +import android.support.wearable.activity.WearableActivity +import com.google.android.gms.wearable.* + +class MainActivity : WearableActivity(), DataClient.OnDataChangedListener { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + // Enables Always-on + setAmbientEnabled() + } + + override fun onDataChanged(dataEvents: DataEventBuffer) { + dataEvents.forEach { event -> + if (event.type == DataEvent.TYPE_CHANGED) { + event.dataItem.also { item -> + if (item?.uri?.path?.compareTo("/test") == 0) { + DataMapItem.fromDataItem(item).dataMap.apply { + getInt("test") + } + } + } + } else if (event.type == DataEvent.TYPE_DELETED) { + // DataItem deleted + } + + } + } + + override fun onResume() { + super.onResume() + Wearable.getDataClient(this).addListener(this) + } + + override fun onPause() { + super.onPause() + Wearable.getDataClient(this).removeListener(this) + } +} diff --git a/wear/src/main/res/drawable-v24/ic_launcher_foreground.xml b/wear/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..d36dec1a --- /dev/null +++ b/wear/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + diff --git a/wear/src/main/res/drawable/ic_launcher_background.xml b/wear/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..f14b2240 --- /dev/null +++ b/wear/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wear/src/main/res/layout/activity_main.xml b/wear/src/main/res/layout/activity_main.xml index 83b1a1ef..8d270149 100644 --- a/wear/src/main/res/layout/activity_main.xml +++ b/wear/src/main/res/layout/activity_main.xml @@ -1,47 +1,29 @@ - - + + + android:layout_height="match_parent" + android:background="@color/white" + android:padding="@dimen/box_inset_layout_padding" + tools:context=".MainActivity" + tools:deviceIds="wear"> + android:layout_height="match_parent" + android:padding="@dimen/inner_frame_layout_padding" + app:boxedEdges="all" + tools:ignore="MissingPrefix"> - - - -