{"id":19766020,"url":"https://github.com/elimu-ai/analytics","last_synced_at":"2025-10-12T13:43:30.890Z","repository":{"id":10229720,"uuid":"65042949","full_name":"elimu-ai/analytics","owner":"elimu-ai","description":"📊  Android application which collects, provides and uploads learning event data","archived":false,"fork":false,"pushed_at":"2024-08-08T05:44:16.000Z","size":648,"stargazers_count":0,"open_issues_count":12,"forks_count":2,"subscribers_count":13,"default_branch":"main","last_synced_at":"2024-08-08T07:09:14.865Z","etag":null,"topics":["csv","data","data-science","dataset","edtech","egma","egra","infrastructural","learning-analytics"],"latest_commit_sha":null,"homepage":"https://jitpack.io/#elimu-ai/analytics","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elimu-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://www.drips.network/app/drip-lists/41305178594442616889778610143373288091511468151140966646158126636698"]}},"created_at":"2016-08-05T19:10:59.000Z","updated_at":"2024-08-08T05:44:19.000Z","dependencies_parsed_at":"2023-12-06T23:22:37.364Z","dependency_job_id":"50b4f3be-4c34-4c55-a112-413260b68deb","html_url":"https://github.com/elimu-ai/analytics","commit_stats":null,"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elimu-ai%2Fanalytics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elimu-ai%2Fanalytics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elimu-ai%2Fanalytics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elimu-ai%2Fanalytics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elimu-ai","download_url":"https://codeload.github.com/elimu-ai/analytics/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224215512,"owners_count":17274799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csv","data","data-science","dataset","edtech","egma","egra","infrastructural","learning-analytics"],"created_at":"2024-11-12T04:21:35.987Z","updated_at":"2025-10-12T13:43:30.869Z","avatar_url":"https://github.com/elimu-ai.png","language":"Java","funding_links":["https://www.drips.network/app/drip-lists/41305178594442616889778610143373288091511468151140966646158126636698"],"categories":[],"sub_categories":[],"readme":"[![](https://jitpack.io/v/ai.elimu/analytics.svg)](https://jitpack.io/#ai.elimu/analytics)\n\n# elimu.ai Analytics 📊\n\nAndroid application which collects, provides and uploads learning event data.\n\n## Software Architecture\n\n[\n  \u003cimg width=\"320\" alt=\"Software Architecture\" src=\"https://user-images.githubusercontent.com/15718174/83595568-fb6a1e00-a594-11ea-990a-10c0bd62ed11.png\"\u003e\n](https://github.com/elimu-ai/wiki/blob/main/SOFTWARE_ARCHITECTURE.md)\n\n## Learning Events\n\nThe various types of _learning events_ are handled by the Android receivers at [`app/src/main/java/ai/elimu/analytics/receiver`](app/src/main/java/ai/elimu/analytics/receiver).\n\nA _learning event_ is an event without any corresponding testing of the student's mastery of a concept. For example; A student presses a word in a storybook and listens to its pronunciation.\n\n  * `StoryBookLearningEvent`\n  * `WordLearningEvent`\n  * `LetterSoundLearningEvent` (letter-sound correspondence)\n\n## Assessment Events\n\nThe various types of _assessment events_ are handled by the Android receivers at [`app/src/main/java/ai/elimu/analytics/receiver`](app/src/main/java/ai/elimu/analytics/receiver).\n\nAn _assessment event_ is an event that involves testing of whether or not the student is able to master a concept. For example; A word is sounded out, and the student is asked select the corresponding written text amongst a list of alternatives (multiple choice).\n\n  * `WordAssessmentEvent`\n  * `LetterSoundAssessmentEvent` (letter-sound correspondence)\n\n## Development 👩🏽‍💻\n\nCompile APK:\n\n```\n./gradlew clean build\n```\n\nInstall APK:\n\n```\nadb install app/build/outputs/apk/debug/app-debug.apk\n```\n\n### Utils Library 📦\n\nA [`utils`](utils) library (`.aar`) makes it easier for other Android apps to report learning/assessment events.\n\n* [`LearningEventUtil`](https://github.com/elimu-ai/analytics/blob/main/utils/src/main/java/ai/elimu/analytics/utils/LearningEventUtil.kt)\n* [`AssessmentEventUtil`](https://github.com/elimu-ai/analytics/blob/main/utils/src/main/java/ai/elimu/analytics/utils/AssessmentEventUtil.kt)\n\nSee https://jitpack.io/#ai.elimu/analytics/ for the latest version.\n\n\u003ca name=\"utils-snapshot\"\u003e\u003c/a\u003e\n### How to Test `-SNAPSHOT` Versions of the Utils Library\n\n1. Publish the library to your local Maven repository:\n    ```sh\n    ./gradlew clean assemble utils:publishToMavenLocal\n    ```\n2. In the app that will be testing the `-SNAPSHOT` version of the library, add `mavenLocal()`:\n    ```diff\n    allprojects {\n        repositories {\n            google()\n            mavenCentral()\n            maven {\n                url \"https://jitpack.io\"\n            }\n    +       mavenLocal()\n        }\n    }\n    ```\n3. Then change to your `-SNAPSHOT` version of the library:\n    ```diff\n    [versions]\n    elimuModel = \"model-2.0.101\"\n    -elimuAnalytics = \"3.1.33\"\n    +elimuAnalytics = \"3.1.34-SNAPSHOT\"\n    ```\n\n#### Utils Usage Sample\n\n\u003e [!NOTE]\n\u003e To use the `utils` library in another Android app, add the dependency in `app/build.gradle`:\n\n```java\nimplementation 'ai.elimu:analytics:\u003cversion\u003e@aar'\n```\n\nFor an example of an app that is reporting learning events, see https://github.com/elimu-ai/vitabu:\n\n  * https://github.com/elimu-ai/vitabu/blob/main/app/build.gradle#L51\n  * https://github.com/elimu-ai/vitabu/blob/main/app/src/main/java/ai/elimu/vitabu/ui/storybook/ChapterFragment.java#L150\n\n### Database Migration 🔀\n\n\u003e [!IMPORTANT]\n\u003e When adding a new database `@Entity` (or modifying an existing one), you need to prepare a database \nmigration (SQL script) in \n[`app/src/main/java/ai/elimu/analytics/db/RoomDb.java`](app/src/main/java/ai/elimu/analytics/db/RoomDb.java).\n\nFollow these steps:\n\n1. Add the new/modified `@Entity` to [`app/src/main/java/ai/elimu/analytics/entity/`](app/src/main/java/ai/elimu/analytics/entity/)\n1. Include the entity in the `entities` section of the `@Database` in [`app/src/main/java/ai/elimu/analytics/db/RoomDb.java`](app/src/main/java/ai/elimu/analytics/db/RoomDb.java)\n1. Bump the `@Database` version in [`app/src/main/java/ai/elimu/analytics/db/RoomDb.java`](app/src/main/java/ai/elimu/analytics/db/RoomDb.java)\n1. Build the code with `./gradlew clean build`\n1. Open the new database schema generated at `app/schemas/ai.elimu.analytics.db.RoomDb/\u003cversion\u003e.json`\n   - Under `entities`, find the matching `tableName` and copy its SQL script from the `createSql` property.\n1. Open `RoomDb.java` and add a new method for the latest migration\n   - Paste the SQL script from the above JSON schema, and replace `${TABLE_NAME}` with the name of the table you created/modified.\n   - Include the migration in the `getDatabase` method in `RoomDb.java`.\n1. To run the database migration, launch the application on your device.\n1. To verify that your database migration ran successfully, look at the Logcat output and \nensure that there are no RoomDb errors:\n   ```\n   2023-10-25 15:40:55.640 15303-914   RoomDb                  ai.elimu.analytics.debug             I  migrate (5 --\u003e 6)\n   2023-10-25 15:40:55.641 15303-914   RoomDb                  ai.elimu.analytics.debug             I  sql: CREATE TABLE IF NOT EXISTS \n   `LetterSoundCorrespondenceLearningEvent` (`letterSoundCorrespondenceLearningEventId` INTEGER, `androidId` TEXT NOT NULL, `packageName` TEXT NOT NULL, `time` \n   INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\n   ```\n\n\u003e [!TIP]\n\u003e You can also use Android Studio's _Database Inspector_ to verify that the database \nmigration succeeded:\n\n![Database Inspector](https://github.com/elimu-ai/analytics/assets/1451036/64eb7aa2-40a3-4347-91b8-971b1f833241)\n\n### Gradle Upgrade\n\n```\n./gradlew wrapper --gradle-version x.x.x\n```\n\n### Release 📦\n\nTo perform a release, follow these steps:\n\n1. Merge your PR into the `main` branch\n1. Wait for the [\"Gradle Release\"](https://github.com/elimu-ai/analytics/actions/workflows/gradle-release.yml) workflow to complete\n1. Ensure that the new release version appears at https://github.com/elimu-ai/analytics/releases\n\n\u003e [!IMPORTANT]\n\u003e After you publish a new release, remember to also bump the version in all Android app repos that depend on the `utils` library:\n\u003e * https://github.com/elimu-ai/appstore/blob/main/gradle/libs.versions.toml\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/elimu-ai/webapp/blob/main/src/main/webapp/static/img/logo-text-256x78.png\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  elimu.ai - Free open-source learning software for out-of-school children ✨🚀\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://elimu.ai\"\u003eWebsite 🌐\u003c/a\u003e\n  \u0026nbsp;•\u0026nbsp;\n  \u003ca href=\"https://github.com/elimu-ai/wiki#readme\"\u003eWiki 📃\u003c/a\u003e\n  \u0026nbsp;•\u0026nbsp;\n  \u003ca href=\"https://github.com/orgs/elimu-ai/projects?query=is%3Aopen\"\u003eProjects 👩🏽‍💻\u003c/a\u003e\n  \u0026nbsp;•\u0026nbsp;\n  \u003ca href=\"https://github.com/elimu-ai/wiki/milestones\"\u003eMilestones 🎯\u003c/a\u003e\n  \u0026nbsp;•\u0026nbsp;\n  \u003ca href=\"https://github.com/elimu-ai/wiki#open-source-community\"\u003eCommunity 👋🏽\u003c/a\u003e\n  \u0026nbsp;•\u0026nbsp;\n  \u003ca href=\"https://www.drips.network/app/drip-lists/41305178594442616889778610143373288091511468151140966646158126636698\"\u003eSupport 💜\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felimu-ai%2Fanalytics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felimu-ai%2Fanalytics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felimu-ai%2Fanalytics/lists"}