Skip to content

πŸ—‚ Android application which downloads educational content to the device and provides it to other apps

License

Notifications You must be signed in to change notification settings

elimu-ai/content-provider

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

elimu.ai Content Provider

Android application which downloads educational content (e.g. letters, words, audios, storybooks, videos, etc) to the device and provides it to other elimu.ai apps.

See software architecture diagram at https://github.com/elimu-ai/model/blob/main/README.md

Software Architecture

Software Architecture

Utils Library πŸ“¦

The Content Provider comes with a utils library (.aar) which makes it easier for other Android apps to fetch content from the Content Provider.

Note

Here is how to use the utils library in another Android app:

  1. Add repository:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    
  2. Add dependency:

    dependencies {
        implementation 'com.github.elimu-ai:content-provider:<version>@aar'
    }
    

See https://jitpack.io/#elimu-ai/content-provider/ for the latest version available.

Usage Example

For an example of another Android app using the utils library, see the Vitabu app's Gradle configuration:

  1. https://github.com/elimu-ai/vitabu/blob/main/build.gradle
  2. https://github.com/elimu-ai/vitabu/blob/main/app/build.gradle

Development πŸ‘©πŸ½β€πŸ’»

During development, you can choose between 3 build types:

  1. debug
  2. qa_test
  3. release

By default, both debug and qa_test are pointing to a webapp test server. And if you want to run the webapp yourself on localhost while testing the Content Provider app, you can change the return value of the getBaseUrl method in BaseApplication.java:

//        return url;
        return "http://192.168.xxx.xxx:8080/webapp";

Use the ifconfig or ipconfig to get your IPv4 address.

You will also have to enable http connections by adding the following file to app/src/main/res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

And then adding it to AndroidManifest.xml:

<application
        android:networkSecurityConfig="@xml/network_security_config"

After that, connect your Android device to the same Wi-Fi network as your computer, and run the app.

Gradle Upgrade

./gradlew wrapper --gradle-version x.x.x --distribution-type all

Database Migration πŸ”€

Important

When adding a new database @Entity (or modifying an existing one), you need to prepare a database migration (SQL script) in app/src/main/java/ai/elimu/content_provider/room/db/RoomDb.java.

Follow these steps:

  1. Add the new/modified @Entity to app/src/main/java/ai/elimu/content_provider/room/entity/

  2. Add the entity's DAO interface to app/src/main/java/ai/elimu/content_provider/room/dao/

  3. Include the DAO interface in app/src/main/java/ai/elimu/content_provider/room/db/RoomDb.java

  4. Include the entity in the entities section of the @Database in app/src/main/java/ai/elimu/content_provider/room/db/RoomDb.java

  5. Bump the @Database version in app/src/main/java/ai/elimu/content_provider/room/db/RoomDb.java

  6. Build the code with ./gradlew clean build

  7. Open the new database schema generated at app/schemas/ai.elimu.content_provider.room.db.RoomDb/<version>.json

    • Under entities, find the matching tableName and copy its SQL script from the createSql property.
  8. Open RoomDb.java and add a new method for the latest migration

    • Paste the SQL script from the above JSON schema, and replace ${TABLE_NAME} with the name of the table you created/modified.
    • Include the migration in the getDatabase method in RoomDb.java.
  9. To run the database migration, launch the application on your device.

  10. To verify that your database migration ran successfully, look at the Logcat output and ensure that there are no RoomDb errors:

    2023-11-27 11:46:50.662  6124-13233 ai.elimu.c....RoomDb$18 ai.elimu.content_provider.debug      I  migrate (23 --> 24)
    2023-11-27 11:46:50.663  6124-13233 ai.elimu.c....RoomDb$18 ai.elimu.content_provider.debug      I  sql: CREATE TABLE IF NOT EXISTS `LetterSound` 
    (`revisionNumber` INTEGER NOT NULL, `usageCount` INTEGER, `id` INTEGER, PRIMARY KEY(`id`))
    

Tip

You can also use Android Studio's Database Inspector to verify that the database migration succeeded:

Release πŸ“¦

To perform a release, follow these steps:

  1. Create a new branch for the release
  2. Remove -SNAPSHOT
    • from the versionName in app/build.gradle
    • from the versionName in utils/build.gradle
    • from the version in utils/build.gradle under publishing
  3. Commit the changes
  4. Click "Draft a new release" at https://github.com/elimu-ai/content-provider/releases
  5. Pick the new branch you created as the target branch
  6. Create a new tag (e.g. 1.2.19)
  7. Choose a release title, and click "Publish release"
  8. Ensure that the release appears at https://jitpack.io/#elimu-ai/content-provider with "Status: ok"
  9. Prepare for next development iteration by bumping the version and adding -SNAPSHOT
    • in the versionCode in app/build.gradle
    • in the versionName in app/build.gradle
    • in the versionCode in utils/build.gradle
    • in the versionName in utils/build.gradle
    • in the version in utils/build.gradle under publishing
  10. Commit the changes
    • Create a pull request for merging your branch into main

elimu.ai - Free open-source learning software for out-of-school children βœ¨πŸš€

Website 🌐 Β β€’Β  Wiki πŸ“ƒ Β β€’Β  Projects πŸ‘©πŸ½β€πŸ’» Β β€’Β  Milestones 🎯 Β β€’Β  Community πŸ‘‹πŸ½ Β β€’Β  Support πŸ’œ