From 4a25beab571e96d6cef5680ec9b395dd27ac960c Mon Sep 17 00:00:00 2001 From: ashb155 Date: Fri, 21 Aug 2026 22:57:39 +0530 Subject: [PATCH 1/6] rating model implementation --- .../java/be/scri/helpers/ui/RatingHelper.kt | 62 +++++++++++++++++-- .../ui/common/components/AboutPageItemComp.kt | 24 +++++-- .../ui/common/components/ItemCardContainer.kt | 1 + .../be/scri/ui/screens/about/AboutUtil.kt | 1 + 4 files changed, 78 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt index 878239292..cad009a82 100644 --- a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt +++ b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt @@ -1,10 +1,12 @@ // SPDX-License-Identifier: GPL-3.0-or-later package be.scri.helpers.ui +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri +import android.os.Build import android.util.Log import android.widget.Toast import androidx.activity.ComponentActivity @@ -20,6 +22,8 @@ import com.google.android.play.core.review.ReviewManagerFactory object RatingHelper { private const val INSTALLER_PLAY_STORE = "com.android.vending" private const val INSTALLER_FDROID = "org.fdroid.fdroid" + private const val INSTALLER_AMAZON = "com.amazon.venezia" + private const val INSTALLER_SAMSUNG = "com.sec.android.app.samsungapps" /** * Gets the package name of the app that installed this app. @@ -31,7 +35,12 @@ object RatingHelper { */ private fun getInstallSource(context: Context): String? = try { - context.packageManager.getInstallerPackageName(context.packageName) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + context.packageManager.getInstallSourceInfo(context.packageName).installingPackageName + } else { + @Suppress("DEPRECATION") + context.packageManager.getInstallerPackageName(context.packageName) + } } catch (e: PackageManager.NameNotFoundException) { Log.e("RatingHelper", "Failed to get install source", e) null @@ -47,11 +56,27 @@ object RatingHelper { * @param context The application context. * @param activity The current activity, required for launching the in-app review flow. */ + /** + * Gets the store description text (e.g. "Rate us on Google Play Store"). + * + * @param context App context. + * @return String for the description. + */ + fun getStoreDesc(context: Context): String? = + when (getInstallSource(context)) { + INSTALLER_PLAY_STORE -> "Rate us on Google Play Store" + INSTALLER_FDROID -> "Rate us on F-Droid" + INSTALLER_AMAZON -> "Rate us on Amazon Appstore" + INSTALLER_SAMSUNG -> "Rate us on Galaxy Store" + else -> "Rate us on your app store" + } + fun rateScribe( context: Context, activity: ComponentActivity, ) { - when (getInstallSource(context)) { + val installer = getInstallSource(context) + when (installer) { INSTALLER_PLAY_STORE -> { val reviewManager = ReviewManagerFactory.create(context) val request = reviewManager.requestReviewFlow() @@ -73,14 +98,43 @@ object RatingHelper { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) try { context.startActivity(intent) - } catch (e: PackageManager.NameNotFoundException) { + } catch (e: ActivityNotFoundException) { Toast.makeText(context, "No browser found to open F-Droid page", Toast.LENGTH_SHORT).show() Log.e("RatingHelper", "Unable to open F-Droid link", e) } } + INSTALLER_AMAZON -> { + val url = "https://www.amazon.com/gp/mas/dl/android?p=${context.packageName}" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + try { + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText(context, "No browser found to open Amazon page", Toast.LENGTH_SHORT).show() + Log.e("RatingHelper", "Unable to open Amazon link", e) + } + } + + INSTALLER_SAMSUNG -> { + val url = "https://galaxystore.samsung.com/detail/${context.packageName}" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + try { + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText(context, "No browser found to open Galaxy Store page", Toast.LENGTH_SHORT).show() + Log.e("RatingHelper", "Unable to open Galaxy Store link", e) + } + } + else -> { - Toast.makeText(context, "Unknown installation source", Toast.LENGTH_SHORT).show() + val url = "https://play.google.com/store/apps/details?id=${context.packageName}" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + try { + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText(context, "No browser found to open Play Store page", Toast.LENGTH_SHORT).show() + Log.e("RatingHelper", "Unable to open Play Store link", e) + } } } } diff --git a/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt b/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt index 4bc29fc63..8385a007d 100644 --- a/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt @@ -36,6 +36,7 @@ fun AboutPageItemComp( trailingIcon: Int, onClick: () -> Unit, modifier: Modifier = Modifier, + descText: String? = null, altText: String? = null, ) { val semanticsModifier = @@ -72,12 +73,23 @@ fun AboutPageItemComp( contentDescription = "Leading Icon", ) Spacer(modifier = Modifier.width(8.dp)) - Text( - text = title, - modifier = Modifier.weight(1f).padding(start = 4.dp), - color = MaterialTheme.colorScheme.onSurface, - style = MaterialTheme.typography.bodyMedium, - ) + androidx.compose.foundation.layout.Column( + modifier = Modifier.weight(1f).padding(start = 4.dp) + ) { + Text( + text = title, + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodyMedium, + ) + if (descText != null) { + Text( + text = descText, + color = Color.Gray, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(top = 4.dp), + ) + } + } Icon( painter = painterResource(trailingIcon), modifier = diff --git a/app/src/main/java/be/scri/ui/common/components/ItemCardContainer.kt b/app/src/main/java/be/scri/ui/common/components/ItemCardContainer.kt index d92e4ab45..bfc948bb2 100644 --- a/app/src/main/java/be/scri/ui/common/components/ItemCardContainer.kt +++ b/app/src/main/java/be/scri/ui/common/components/ItemCardContainer.kt @@ -64,6 +64,7 @@ fun ItemsCardContainer( is ScribeItem.ExternalLinkItem -> { AboutPageItemComp( title = stringResource(item.title), + descText = item.descText, altText = item.altText?.let { stringResource(it) }, leadingIcon = item.leadingIcon, trailingIcon = item.trailingIcon, diff --git a/app/src/main/java/be/scri/ui/screens/about/AboutUtil.kt b/app/src/main/java/be/scri/ui/screens/about/AboutUtil.kt index 6eb6e342b..5af849240 100644 --- a/app/src/main/java/be/scri/ui/screens/about/AboutUtil.kt +++ b/app/src/main/java/be/scri/ui/screens/about/AboutUtil.kt @@ -143,6 +143,7 @@ fun feedbackAndSupportList( } else { R.string.i18n_app_about_feedback_rate_scribe }, + descText = RatingHelper.getStoreDesc(context), trailingIcon = R.drawable.external_link, url = null, onClick = { onRateScribeClick() }, From 262055f1b451fa7b796339330aac55ce4157b850 Mon Sep 17 00:00:00 2001 From: ashb155 Date: Fri, 21 Aug 2026 22:57:48 +0530 Subject: [PATCH 2/6] rating model implementation 1 --- app/src/main/java/be/scri/ui/models/ScribeItem.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/be/scri/ui/models/ScribeItem.kt b/app/src/main/java/be/scri/ui/models/ScribeItem.kt index c52eaee9c..1a56f28b3 100644 --- a/app/src/main/java/be/scri/ui/models/ScribeItem.kt +++ b/app/src/main/java/be/scri/ui/models/ScribeItem.kt @@ -64,6 +64,7 @@ sealed class ScribeItem( data class ExternalLinkItem( override val title: Int, override val desc: Int? = null, + val descText: String? = null, override val altText: Int? = null, @DrawableRes val leadingIcon: Int, @DrawableRes val trailingIcon: Int, From a106f4754e9b329a34eca25a83d47b00e7679460 Mon Sep 17 00:00:00 2001 From: ashb155 Date: Fri, 21 Aug 2026 23:11:29 +0530 Subject: [PATCH 3/6] formatting fixes --- .../java/be/scri/helpers/ui/RatingHelper.kt | 20 +++++++++---------- .../ui/common/components/AboutPageItemComp.kt | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt index cad009a82..81a573dfa 100644 --- a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt +++ b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt @@ -46,16 +46,6 @@ object RatingHelper { null } - /** - * Initiates the app rating process based on the installation source. - * - * If the app was installed from the Google Play Store, it attempts to launch the in-app review flow. - * If the app was installed from F-Droid, it opens the app's F-Droid page in a browser. - * For any other installation source, it displays a toast message indicating an unknown source. - * - * @param context The application context. - * @param activity The current activity, required for launching the in-app review flow. - */ /** * Gets the store description text (e.g. "Rate us on Google Play Store"). * @@ -71,6 +61,16 @@ object RatingHelper { else -> "Rate us on your app store" } + /** + * Initiates the app rating process based on the installation source. + * + * If the app was installed from the Google Play Store, it attempts to launch the in-app review flow. + * If the app was installed from F-Droid, it opens the app's F-Droid page in a browser. + * For any other installation source, it displays a toast message indicating an unknown source. + * + * @param context The application context. + * @param activity The current activity, required for launching the in-app review flow. + */ fun rateScribe( context: Context, activity: ComponentActivity, diff --git a/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt b/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt index 8385a007d..fa0aab14a 100644 --- a/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt @@ -74,7 +74,7 @@ fun AboutPageItemComp( ) Spacer(modifier = Modifier.width(8.dp)) androidx.compose.foundation.layout.Column( - modifier = Modifier.weight(1f).padding(start = 4.dp) + modifier = Modifier.weight(1f).padding(start = 4.dp), ) { Text( text = title, From f132f103d571cc0780d4b339c43976e2a92eb1c8 Mon Sep 17 00:00:00 2001 From: ashb155 Date: Fri, 21 Aug 2026 23:32:33 +0530 Subject: [PATCH 4/6] description update --- app/src/main/java/be/scri/helpers/ui/RatingHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt index 81a573dfa..0f372b140 100644 --- a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt +++ b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt @@ -58,7 +58,7 @@ object RatingHelper { INSTALLER_FDROID -> "Rate us on F-Droid" INSTALLER_AMAZON -> "Rate us on Amazon Appstore" INSTALLER_SAMSUNG -> "Rate us on Galaxy Store" - else -> "Rate us on your app store" + else -> "Rate us on Google Play Store" } /** From 2679659486ee5e2be097143ee2166b4bbab5b375 Mon Sep 17 00:00:00 2001 From: ashb155 Date: Tue, 25 Aug 2026 20:48:57 +0530 Subject: [PATCH 5/6] google play flow fix --- app/src/main/java/be/scri/helpers/ui/RatingHelper.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt index 0f372b140..b30c26720 100644 --- a/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt +++ b/app/src/main/java/be/scri/helpers/ui/RatingHelper.kt @@ -88,7 +88,14 @@ object RatingHelper { .launchReviewFlow(activity, reviewInfo) .addOnCompleteListener { } } else { - Toast.makeText(context, "Failed to launch review flow", Toast.LENGTH_SHORT).show() + val url = "https://play.google.com/store/apps/details?id=${context.packageName}" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + try { + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText(context, "No browser found to open Play Store page", Toast.LENGTH_SHORT).show() + Log.e("RatingHelper", "Unable to open Play Store link", e) + } } } } From 791c7751c47f6ff91d325b10aa96e14440cfef00 Mon Sep 17 00:00:00 2001 From: ashb155 Date: Tue, 25 Aug 2026 21:28:30 +0530 Subject: [PATCH 6/6] changelog additions --- CHANGELOG.md | 67 ++++++++++++++++++++++++++++++++++-------- CHANGELOG_CONJUGATE.md | 40 ++++++++++++++++++++++--- 2 files changed, 90 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2545f5850..10e0255bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Scribe-Android Changelog > [!NOTE] -> This repository contains the code for two different applications: Scribe-Android and Conjugate-Android (Scribe-Conjugate for iOS). This is the changelog for Scribe-Android. See [CHANGELOG_CONJUGATE.md](/CHANGELOG_CONJUGATE.md) for the Conjugate-Android changelog. +> This repository contains the code for two different applications: Scribe-Android and Conjugate-Android (Scribe-Conjugate for Android). This is the changelog for Scribe-Android. See [CHANGELOG_CONJUGATE.md](/CHANGELOG_CONJUGATE.md) for the Conjugate-Android changelog. See the [releases for this repository](https://github.com/scribe-org/Scribe-Android/releases) for an up to date list of versions and their release dates. Versions that are marked as released may not yet be on Google Play and other stores if it's within the submission review period. @@ -13,7 +13,7 @@ Scribe-Android tries to follow [semantic versioning](https://semver.org/), a MAJ Emojis for the following are chosen based on [gitmoji](https://gitmoji.dev/). -## Scribe-Android 1.0.0 +## [Upcoming] Scribe-Android 1.0.0 ### MVP release of Scribe - Language Keyboards on Android @@ -24,32 +24,73 @@ Emojis for the following are chosen based on [gitmoji](https://gitmoji.dev/). ### ⌨️ Keyboards - Keyboards for English, French, German, Italian, Portuguese, Russian, Spanish and Swedish. +- Keyboards can easily be individually installed based on the language the user speaks ([#15](https://github.com/scribe-org/Scribe-Android/issues/15)). ### ✨ New Features - Keyboard extensions that can be used in any app. -- Annotation of words in the command bar including the genders of nouns and cases that follow prepositions. -- Basic translations from any keyboard language into any other keyboard language. -- Querying the plurals of nouns. -- Conjugations of verbs within an interactive UI. +- Annotation of words in the command bar including the genders of nouns and cases that follow prepositions ([#135](https://github.com/scribe-org/Scribe-Android/issues/135), [#136](https://github.com/scribe-org/Scribe-Android/issues/136), [#275](https://github.com/scribe-org/Scribe-Android/issues/275)). +- The Scribe command UI can be displayed by pressing the Scribe Key ([#16](https://github.com/scribe-org/Scribe-Android/issues/16), [#89](https://github.com/scribe-org/Scribe-Android/issues/89), [#137](https://github.com/scribe-org/Scribe-Android/issues/137)). +- Basic translations from any keyboard language into any other keyboard language ([#265](https://github.com/scribe-org/Scribe-Android/issues/265), [#266](https://github.com/scribe-org/Scribe-Android/issues/266)). +- Querying the plurals of nouns ([#272](https://github.com/scribe-org/Scribe-Android/issues/272), [#421](https://github.com/scribe-org/Scribe-Android/issues/421), [#466](https://github.com/scribe-org/Scribe-Android/issues/466), [#467](https://github.com/scribe-org/Scribe-Android/issues/467)). +- Conjugations of verbs within an interactive UI ([#268](https://github.com/scribe-org/Scribe-Android/issues/268), [#270](https://github.com/scribe-org/Scribe-Android/issues/270), [#598](https://github.com/scribe-org/Scribe-Android/issues/598)). +- Instructions for how to install keyboards are provided to the user on the Installation tab ([#113](https://github.com/scribe-org/Scribe-Android/issues/113)). +- Autosuggestions and autocompletions are displayed as the user types ([#408](https://github.com/scribe-org/Scribe-Android/issues/408), [#409](https://github.com/scribe-org/Scribe-Android/issues/409), [#551](https://github.com/scribe-org/Scribe-Android/issues/551)). +- Profanity is removed from autosuggestions and autocompletions ([#665](https://github.com/scribe-org/Scribe-Android/issues/665)). +- Emojis can be selected as autosuggestions and autocompletions ([#66](https://github.com/scribe-org/Scribe-Android/issues/66), [#138](https://github.com/scribe-org/Scribe-Android/issues/138), [#313](https://github.com/scribe-org/Scribe-Android/issues/313), [#428](https://github.com/scribe-org/Scribe-Android/issues/428), [#637](https://github.com/scribe-org/Scribe-Android/issues/637)). +- An integrated emoji keyboard is included in the keyboard ([#425](https://github.com/scribe-org/Scribe-Android/issues/425), [#654](https://github.com/scribe-org/Scribe-Android/issues/654)). +- An integrated numeric keyboard is included when the user is typing in numeric form fields ([#607](https://github.com/scribe-org/Scribe-Android/issues/607)). +- A clipboard can be accessed for copying and pasting texts by long holding the emoji key ([#459](https://github.com/scribe-org/Scribe-Android/issues/459), [#642](https://github.com/scribe-org/Scribe-Android/issues/642), [#663](https://github.com/scribe-org/Scribe-Android/issues/663)). +- The keyboard can float via a key that is pressed when long holding the emoji key ([#261](https://github.com/scribe-org/Scribe-Android/issues/261)). +- Text proxy labels guide the user through Scribe commands ([#271](https://github.com/scribe-org/Scribe-Android/issues/271)). +- Invalid state labels explain to the user why a command hasn't worked ([#273](https://github.com/scribe-org/Scribe-Android/issues/273), [#274](https://github.com/scribe-org/Scribe-Android/issues/274), [#421](https://github.com/scribe-org/Scribe-Android/issues/421), [#553](https://github.com/scribe-org/Scribe-Android/issues/553)). +- Base keyboard functionality like double space periods, auto capitalization auto spacing have been included ([#20](https://github.com/scribe-org/Scribe-Android/issues/20), [#447](https://github.com/scribe-org/Scribe-Android/issues/447), [#669](https://github.com/scribe-org/Scribe-Android/issues/669)). +- Menu items have been provided to enable or disable keyboard functionalities ([#64](https://github.com/scribe-org/Scribe-Android/issues/64), [#65](https://github.com/scribe-org/Scribe-Android/issues/65)). +- Menu items have been provided to customize the keyboard UI ([#148](https://github.com/scribe-org/Scribe-Android/issues/148)). +- The application and community's relationship to the Wikimedia movement is explained in app ([#52](https://github.com/scribe-org/Scribe-Android/issues/52)). +- Vibrate on keypress and key click functionalities are included ([#405](https://github.com/scribe-org/Scribe-Android/issues/405), [#406](https://github.com/scribe-org/Scribe-Android/issues/406)). +- An in-app tutorial is provided to detail functionalities of the application ([#602](https://github.com/scribe-org/Scribe-Android/issues/602), [#615](https://github.com/scribe-org/Scribe-Android/issues/615), [#616](https://github.com/scribe-org/Scribe-Android/issues/616)). +- The user is able to easily rate the application, with installer-aware routing to the appropriate store ([#165](https://github.com/scribe-org/Scribe-Android/issues/165), [#640](https://github.com/scribe-org/Scribe-Android/issues/640)). ### 🗃️ Data +- SQLite databases have been set up for all data needed for the keyboards ([#87](https://github.com/scribe-org/Scribe-Android/issues/87)). +- Calls are made to the [Scribe-Server API](https://scribe-server.toolforge.org/) hosted on Toolforge to download language data and insert it into SQLite tables ([#547](https://github.com/scribe-org/Scribe-Android/issues/547), [#626](github.com/scribe-org/Scribe-Android/issues/626)). +- The user is directed to download data in the keyboard UI if they access it with empty databases ([#581](https://github.com/scribe-org/Scribe-Android/issues/581), [#650](https://github.com/scribe-org/Scribe-Android/issues/650)). +- The data download UI was created to download data for any keyboards that have been installed ([#437](https://github.com/scribe-org/Scribe-Android/issues/437), [#439](https://github.com/scribe-org/Scribe-Android/issues/439), [#513](https://github.com/scribe-org/Scribe-Android/issues/513), [#520](https://github.com/scribe-org/Scribe-Android/issues/520), [#554](https://github.com/scribe-org/Scribe-Android/issues/554)). +- Network indicators for data request have been added to the application and are shown via toasts ([#651](https://github.com/scribe-org/Scribe-Android/issues/651)). + ### 🎨 Design -- The Scribe key and command bar where Scribe commands are triggered. -- 3x2 conjugation tables from which conjugations can be selected in the `Conjugate` command. -- The return key is colored Scribe blue when commands are being triggered to let the user know that that is what they need to press to finish the command. -- Dark mode compatibility. +- The Scribe key and command bar where Scribe commands are triggered ([#16](https://github.com/scribe-org/Scribe-Android/issues/16)). +- 3x2 and other conjugation tables from which conjugations can be selected in the Conjugate command ([#267](https://github.com/scribe-org/Scribe-Android/issues/267), [#270](https://github.com/scribe-org/Scribe-Android/issues/270), [#496](https://github.com/scribe-org/Scribe-Android/issues/496), [#523](https://github.com/scribe-org/Scribe-Android/issues/523)). +- The return key is colored Scribe blue when commands are being triggered to let the user know that that is what they need to press to finish the command ([#160](https://github.com/scribe-org/Scribe-Android/issues/160)). +- Dark mode compatibility through a responsive color scheme ([#25](https://github.com/scribe-org/Scribe-Android/issues/25), [#51](https://github.com/scribe-org/Scribe-Android/issues/51), [#116](https://github.com/scribe-org/Scribe-Android/issues/116), [#121](https://github.com/scribe-org/Scribe-Android/issues/121), [#155](https://github.com/scribe-org/Scribe-Android/issues/155), [#161](https://github.com/scribe-org/Scribe-Android/issues/161), [#543](https://github.com/scribe-org/Scribe-Android/issues/543)). +- The application menu follows modern Android styling ([#114](https://github.com/scribe-org/Scribe-Android/issues/114), [#150](https://github.com/scribe-org/Scribe-Android/issues/150), [#217](https://github.com/scribe-org/Scribe-Android/issues/217), [#246](https://github.com/scribe-org/Scribe-Android/issues/246), [#247](https://github.com/scribe-org/Scribe-Android/issues/247), [248](https://github.com/scribe-org/Scribe-Android/issues/248), [#256](https://github.com/scribe-org/Scribe-Android/issues/256)). ### 🌐 Localization -- The application has been localized into many languages using [Weblate](https://weblate.org/en/) and the [Scribe-i18n](https://github.com/scribe-org/Scribe-i18n) project as a central source of localizations ([#44](https://github.com/scribe-org/Scribe-Android/issues/44), [#214](https://github.com/scribe-org/Scribe-Android/issues/214)). +- The application has been localized into many languages using [Weblate](https://weblate.org/en/) and the [Scribe-i18n](https://github.com/scribe-org/Scribe-i18n) project as a central Git submodule of localizations ([#44](https://github.com/scribe-org/Scribe-Android/issues/44), [#95](https://github.com/scribe-org/Scribe-Android/issues/95), [#214](https://github.com/scribe-org/Scribe-Android/issues/214), [#527](https://github.com/scribe-org/Scribe-Android/issues/527)). ### ✅ Tests -- +- [ktlint](https://github.com/ktlint/ktlint) and [detekt](https://github.com/detekt/detekt) linting was added to the project to validate code quality and standards ([#70](https://github.com/scribe-org/Scribe-Android/issues/70), [#354](https://github.com/scribe-org/Scribe-Android/issues/354)). +- Unit tests and code coverage were written for the project ([#181](https://github.com/scribe-org/Scribe-Android/issues/181), [#196](https://github.com/scribe-org/Scribe-Android/issues/196)). +- GitHub Actions based CI was set up with unit and instrumentation tests ([#195](https://github.com/scribe-org/Scribe-Android/issues/195), [#212](https://github.com/scribe-org/Scribe-Android/issues/212), [#422](https://github.com/scribe-org/Scribe-Android/issues/422), [#580](https://github.com/scribe-org/Scribe-Android/issues/580)). +- prek based pre-commit hooks were added to the repo to catch common mistakes on commit ([#215](https://github.com/scribe-org/Scribe-Android/issues/215)). +- A CI workflow to enforces `CHANGELOG.md` or `CHANGELOG_CONJUGATE.md` updates on all PRs targeting `main`, with support for a `no-changelog` label to skip the check when appropriate. + +### 📝 Documentation + +- Functions in the application have been documented ([#18](https://github.com/scribe-org/Scribe-Android/issues/18), [#354](https://github.com/scribe-org/Scribe-Android/issues/354)). ### ⚖️ Legal -- All code has been developed under the GNU General Public License (GPL-3.0). +- All code has been developed under the GNU General Public License (GPL-3.0) ([#301](https://github.com/scribe-org/Scribe-Android/issues/301)). +- The legal policies of the application are displayed to the user in the About tab ([#58](https://github.com/scribe-org/Scribe-Android/issues/58)). +- A privacy policy was provided to make clear that policies around user data and their security ([#59](https://github.com/scribe-org/Scribe-Android/issues/59)). +- Third party licensed code used in the development of the project were detailed ([#60](https://github.com/scribe-org/Scribe-Android/issues/60)). + +### ♻️ Code Refactoring + +- Code quality improvements were continuously done to assure that the application is easy to maintain and meets Kotlin standards ([#426](https://github.com/scribe-org/Scribe-Android/issues/426)). diff --git a/CHANGELOG_CONJUGATE.md b/CHANGELOG_CONJUGATE.md index 132b594d0..6c62a4a59 100644 --- a/CHANGELOG_CONJUGATE.md +++ b/CHANGELOG_CONJUGATE.md @@ -13,7 +13,7 @@ Conjugate-Android tries to follow [semantic versioning](https://semver.org/), a Emojis for the following are chosen based on [gitmoji](https://gitmoji.dev/). -## Conjugate-Android 1.0.0 +## [Upcoming] Conjugate-Android 1.0.0 ### MVP release of Scribe Conjugate on Android @@ -23,18 +23,50 @@ Emojis for the following are chosen based on [gitmoji](https://gitmoji.dev/). ### ✨ New Features -- Feature +- A verb Conjugation tab was added to the application ([#563](https://github.com/scribe-org/Scribe-Android/issues/563)). +- Users can search for verbs across languages ([#566](https://github.com/scribe-org/Scribe-Android/issues/566)). +- A reactive conjugation selection UI was developed to easily copy desired conjugations ([#567](https://github.com/scribe-org/Scribe-Android/issues/567), [#570](https://github.com/scribe-org/Scribe-Android/issues/570)). +- Users are able to filter verb conjugations by tense ([#572](https://github.com/scribe-org/Scribe-Android/issues/572)). +- Recently conjugated verbs are displayed to the user in the Conjugation tab ([#568](https://github.com/scribe-org/Scribe-Android/issues/568), [#569](https://github.com/scribe-org/Scribe-Android/issues/569)). +- The Settings tab for the Scribe keyboard application was migrated to allow base settings for the app interface ([#562](https://github.com/scribe-org/Scribe-Android/issues/562)). +- The About tab for the Scribe keyboard application was migrated to provide information on the application and community ([#561](https://github.com/scribe-org/Scribe-Android/issues/561)). +- The application and community's relationship to the Wikimedia movement is explained in app ([#52](https://github.com/scribe-org/Scribe-Android/issues/52)). +- The user is able to easily rate the application, with installer-aware routing to the appropriate store ([#165](https://github.com/scribe-org/Scribe-Android/issues/165), [#640](https://github.com/scribe-org/Scribe-Android/issues/640)). ### 🗃️ Data +- SQLite databases have been set up for all data needed for the conjugate UI ([#87](https://github.com/scribe-org/Scribe-Android/issues/87), [#571](https://github.com/scribe-org/Scribe-Android/issues/571)). +- Calls are made to the [Scribe-Server API](https://scribe-server.toolforge.org/) hosted on Toolforge to download language data and insert it into SQLite tables ([#547](https://github.com/scribe-org/Scribe-Android/issues/547), [#565](https://github.com/scribe-org/Scribe-Android/issues/565), [#626](github.com/scribe-org/Scribe-Android/issues/626)). +- The data download UI was created to download data for any keyboards that have been installed ([#437](https://github.com/scribe-org/Scribe-Android/issues/437), [#439](https://github.com/scribe-org/Scribe-Android/issues/439), [#513](https://github.com/scribe-org/Scribe-Android/issues/513), [#554](https://github.com/scribe-org/Scribe-Android/issues/554), [#564](https://github.com/scribe-org/Scribe-Android/issues/564)). +- Network indicators for data request have been added to the application and are shown via toasts ([#651](https://github.com/scribe-org/Scribe-Android/issues/651)). + ### 🎨 Design +- Dark mode compatibility through a responsive color scheme ([#25](https://github.com/scribe-org/Scribe-Android/issues/25), [#51](https://github.com/scribe-org/Scribe-Android/issues/51), [#116](https://github.com/scribe-org/Scribe-Android/issues/116), [#121](https://github.com/scribe-org/Scribe-Android/issues/121), [#155](https://github.com/scribe-org/Scribe-Android/issues/155), [#161](https://github.com/scribe-org/Scribe-Android/issues/161), [#543](https://github.com/scribe-org/Scribe-Android/issues/543)). +- The application menu follows modern Android styling ([#114](https://github.com/scribe-org/Scribe-Android/issues/114), [#150](https://github.com/scribe-org/Scribe-Android/issues/150), [#217](https://github.com/scribe-org/Scribe-Android/issues/217), [#246](https://github.com/scribe-org/Scribe-Android/issues/246), [#247](https://github.com/scribe-org/Scribe-Android/issues/247), [248](https://github.com/scribe-org/Scribe-Android/issues/248), [#256](https://github.com/scribe-org/Scribe-Android/issues/256)). + ### 🌐 Localization -- The application has been localized into many languages using [Weblate](https://weblate.org/en/) and the [Scribe-i18n](https://github.com/scribe-org/Scribe-i18n) project as a central source of localizations ([#44](https://github.com/scribe-org/Scribe-Android/issues/44), [#214](https://github.com/scribe-org/Scribe-Android/issues/214)). +- The application has been localized into many languages using [Weblate](https://weblate.org/en/) and the [Scribe-i18n](https://github.com/scribe-org/Scribe-i18n) project as a central Git submodule of localizations ([#44](https://github.com/scribe-org/Scribe-Android/issues/44), [#95](https://github.com/scribe-org/Scribe-Android/issues/95), [#214](https://github.com/scribe-org/Scribe-Android/issues/214), [#527](https://github.com/scribe-org/Scribe-Android/issues/527)). ### ✅ Tests +- [ktlint](https://github.com/ktlint/ktlint) and [detekt](https://github.com/detekt/detekt) linting was added to the project to validate code quality and standards ([#70](https://github.com/scribe-org/Scribe-Android/issues/70), [#354](https://github.com/scribe-org/Scribe-Android/issues/354)). +- Unit tests and code coverage were written for the project ([#181](https://github.com/scribe-org/Scribe-Android/issues/181), [#196](https://github.com/scribe-org/Scribe-Android/issues/196)). +- GitHub Actions based CI was set up with unit and instrumentation tests ([#195](https://github.com/scribe-org/Scribe-Android/issues/195), [#212](https://github.com/scribe-org/Scribe-Android/issues/212), [#422](https://github.com/scribe-org/Scribe-Android/issues/422), [#580](https://github.com/scribe-org/Scribe-Android/issues/580)). +- prek based pre-commit hooks were added to the repo to catch common mistakes on commit ([#215](https://github.com/scribe-org/Scribe-Android/issues/215)). + +### 📝 Documentation + +- Functions in the application have been documented ([#18](https://github.com/scribe-org/Scribe-Android/issues/18), [#354](https://github.com/scribe-org/Scribe-Android/issues/354)). + ### ⚖️ Legal -- All code has been developed under the GNU General Public License (GPL-3.0). +- All code has been developed under the GNU General Public License (GPL-3.0) ([#301](https://github.com/scribe-org/Scribe-Android/issues/301)). +- The legal policies of the application are displayed to the user in the About tab ([#58](https://github.com/scribe-org/Scribe-Android/issues/58), [#561](https://github.com/scribe-org/Scribe-Android/issues/561)). +- A privacy policy was provided to make clear that policies around user data and their security ([#59](https://github.com/scribe-org/Scribe-Android/issues/59)). +- Third party licensed code used in the development of the project were detailed ([#60](https://github.com/scribe-org/Scribe-Android/issues/60)). + +### ♻️ Code Refactoring + +- Code quality improvements were continuously done to assure that the application is easy to maintain and meets Kotlin standards ([#426](https://github.com/scribe-org/Scribe-Android/issues/426)).