Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
e465552
fix: [FC-0078] RTL, user avatar and dark theme bugs (#426)
PavloNetrebchuk Feb 14, 2025
19eb8e3
Performance: Optimized data loading of course (#416)
Mar 4, 2025
4dbff8b
feat: authorization request dialog (#431)
PavloNetrebchuk Mar 4, 2025
d659f71
feat: [FC-0078] Downloads page (#432)
PavloNetrebchuk Apr 1, 2025
0156743
Feat: discussion content style (#437)
PavloNetrebchuk Apr 3, 2025
ddcb57d
fix: issue to load the video through chrome-cast device (#83) (#436)
k1rill Apr 7, 2025
9014e63
fix: fixed upgrade item on SettingsFragment, moved upgrade popup to M…
PavloNetrebchuk Apr 9, 2025
943381b
fix: primary course in landscape (#435)
k1rill Apr 9, 2025
0b254f7
fix: AllEnrolledCoursesView and DashboardGalleryView tablet layout pa…
PavloNetrebchuk Apr 9, 2025
6e59c7f
fix: ProgressBarRangeInfo IllegalArgumentException - current must not…
volodymyr-chekyrta May 13, 2025
7b5846a
fix: fetch future course dates for calendar (#444)
volodymyr-chekyrta May 15, 2025
b126701
chore: bump foundation version (#449)
volodymyr-chekyrta Jul 16, 2025
c8fc181
fix: removing video after user logs out (#451)
PavloNetrebchuk Jul 29, 2025
b6405a0
fix: refactored and fixed memory leak in isImeVisibleState function (…
PavloNetrebchuk Jul 31, 2025
4059282
fix: MainFragment pager memory leaks (#453)
PavloNetrebchuk Jul 31, 2025
e59df5d
Refactor: resourses (#455)
PavloNetrebchuk Aug 6, 2025
fbbf47e
fix: R8 (#456)
PavloNetrebchuk Aug 8, 2025
6880aaa
feat: lib upgrade (#457)
PavloNetrebchuk Aug 14, 2025
4df0b02
feat: [FC-0092] Course progress tab (#448)
PavloNetrebchuk Aug 18, 2025
12f3d75
fix: handle NoCachedDataException (#460)
PavloNetrebchuk Aug 19, 2025
8de8a4d
feat: [FC-0092] Course content tabs (#450)
PavloNetrebchuk Sep 1, 2025
6e45ae1
chore: dependencies upgrade (#461)
PavloNetrebchuk Sep 5, 2025
f3ffa98
Feat: Home tab[0092] (#462)
PavloNetrebchuk Oct 7, 2025
a3b5977
feat: [FC-0092]: Video navigation (#464)
PavloNetrebchuk Oct 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
35 changes: 21 additions & 14 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,13 @@ if (firebaseEnabled) {
}

android {
compileSdk 34
namespace 'org.openedx.app'
compileSdkVersion compile_sdk_version

defaultConfig {
applicationId appId
minSdk 24
targetSdk 34
minSdk min_sdk_version
targetSdk target_sdk_version
versionCode 1
versionName "1.0.0"

Expand All @@ -42,7 +43,6 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

namespace 'org.openedx.app'

flavorDimensions += "env"
productFlavors {
Expand Down Expand Up @@ -88,12 +88,14 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
sourceCompatibility java_version
targetCompatibility java_version
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17
freeCompilerArgs = List.of("-Xstring-concat=inline")
kotlin {
compilerOptions {
jvmTarget = jvm_target_version
freeCompilerArgs = ['-XXLanguage:+PropertyParamAnnotationDefaultTargetMode']
}
}
buildFeatures {
viewBinding true
Expand Down Expand Up @@ -125,22 +127,23 @@ dependencies {
implementation project(path: ':profile')
implementation project(path: ':discussion')
implementation project(path: ':whatsnew')
implementation project(path: ':downloads')

ksp "androidx.room:room-compiler:$room_version"

implementation 'androidx.core:core-splashscreen:1.0.1'
implementation "androidx.core:core-splashscreen:$core_splashscreen_version"

api platform("com.google.firebase:firebase-bom:$firebase_version")
api "com.google.firebase:firebase-messaging"

// Braze SDK Integration
implementation "com.braze:android-sdk-ui:30.2.0"
implementation "com.braze:android-sdk-ui:$braze_sdk_version"

// Plugins
implementation("com.github.openedx:openedx-app-firebase-analytics-android:1.0.0")
implementation("com.github.openedx:openedx-app-firebase-analytics-android:$openedx_firebase_analytics_version")

androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation "androidx.test.ext:junit:$test_ext_version"
androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
testImplementation "junit:junit:$junit_version"
testImplementation "io.mockk:mockk:$mockk_version"
testImplementation "io.mockk:mockk-android:$mockk_version"
Expand Down Expand Up @@ -180,3 +183,7 @@ private def setupFirebaseConfigFields(buildType) {

buildType.manifestPlaceholders = [fcmEnabled: firebaseEnabled && cloudMessagingEnabled]
}

ksp {
arg("room.schemaLocation", "$projectDir/schemas")
}
119 changes: 117 additions & 2 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# CRITICAL: Keep generic type information for TypeToken to work properly
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
-keepattributes *Annotation*

# For using GSON @Expose annotation
-keepattributes *Annotation*

Expand All @@ -23,8 +27,74 @@
}

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
# CRITICAL: Do NOT allow obfuscation or shrinking of TypeToken - it needs to preserve generic type information
-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken

# Keep TypeToken constructors and methods to preserve generic type information
-keepclassmembers class com.google.gson.reflect.TypeToken {
<init>(...);
<methods>;
}

# Keep all Gson reflection classes that handle generic types
-keep class com.google.gson.reflect.** { *; }

# CRITICAL: Keep Google Guava TypeToken and TypeCapture classes (used by Gson)
-keep class com.google.common.reflect.TypeToken { *; }
-keep class com.google.common.reflect.TypeCapture { *; }
-keep class com.google.common.reflect.TypeToken$* { *; }
-keep class com.google.common.reflect.TypeCapture$* { *; }

# Keep all anonymous subclasses of TypeToken (created by object : TypeToken<T>() {})
-keep class * extends com.google.common.reflect.TypeToken { *; }
-keep class * extends com.google.gson.reflect.TypeToken { *; }

# Keep Gson TypeAdapter classes used by Room TypeConverters
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory

# Keep Room TypeConverters that use Gson (important for complex types like List<SectionScoreDb>)
-keep @androidx.room.TypeConverter class * { *; }
-keepclassmembers class * {
@androidx.room.TypeConverter <methods>;
}

# Keep generic type information for Room entities with complex types
-keepclassmembers class org.openedx.**.data.model.room.** {
<fields>;
<init>(...);
* mapToDomain();
* mapToRoomEntity();
* mapToEntity();
}

# CRITICAL: Keep the CourseConverter and all its TypeToken usage
-keep class org.openedx.course.data.storage.CourseConverter { *; }
-keepclassmembers class org.openedx.course.data.storage.CourseConverter {
<init>(...);
<methods>;
}

# Keep anonymous TypeToken subclasses created in CourseConverter
-keep class org.openedx.course.data.storage.CourseConverter$* { *; }

# CRITICAL: Prevent obfuscation of CourseConverter methods that use TypeToken
-keepclassmembers,allowobfuscation class org.openedx.course.data.storage.CourseConverter {
@androidx.room.TypeConverter <methods>;
}

# Keep all TypeConverter classes that use Gson
-keep class org.openedx.discovery.data.converter.DiscoveryConverter { *; }

# Keep the specific TypeToken usage patterns in TypeConverters
-keepclassmembers class org.openedx.**.data.storage.** {
@androidx.room.TypeConverter <methods>;
}

-keepclassmembers class org.openedx.**.data.converter.** {
@androidx.room.TypeConverter <methods>;
}
##---------------End: proguard configuration for Gson ----------

-keepclassmembers class * extends java.lang.Enum {
Expand All @@ -33,6 +103,45 @@
public static ** valueOf(java.lang.String);
}

##---------------Begin: proguard configuration for Kotlin Coroutines ----------
# Keep all coroutine-related classes and methods
-keep class kotlinx.coroutines.** { *; }
-keep class kotlin.coroutines.** { *; }
-keep class kotlin.coroutines.intrinsics.** { *; }

# Keep suspend functions and coroutine builders
-keepclassmembers class * {
kotlin.coroutines.Continuation *(...);
}

# Keep coroutine context and related classes
-keep class kotlinx.coroutines.CoroutineContext$* { *; }

# Keep Flow and StateFlow classes
-keep class kotlinx.coroutines.flow.** { *; }

# Keep coroutine dispatchers
-keep class kotlinx.coroutines.Dispatchers { *; }
-keep class kotlinx.coroutines.Dispatchers$* { *; }

# Keep coroutine scope and job classes
-keep class kotlinx.coroutines.CoroutineScope { *; }
-keep class kotlinx.coroutines.Job { *; }
-keep class kotlinx.coroutines.Job$* { *; }

# Keep coroutine intrinsics that are causing the error
-keep class kotlin.coroutines.intrinsics.IntrinsicsKt { *; }
-keep class kotlin.coroutines.intrinsics.IntrinsicsKt$* { *; }

# Keep suspend function markers
-keepclassmembers class * {
@kotlin.coroutines.RestrictsSuspension <methods>;
}

# Keep coroutine-related annotations
-keep @kotlin.coroutines.RestrictsSuspension class * { *; }
##---------------End: proguard configuration for Kotlin Coroutines ----------

-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
Expand Down Expand Up @@ -67,3 +176,9 @@
-dontwarn org.bouncycastle.openssl.PEMKeyPair
-dontwarn org.bouncycastle.openssl.PEMParser
-dontwarn org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter
-dontwarn com.android.billingclient.api.BillingClientStateListener
-dontwarn com.android.billingclient.api.PurchasesUpdatedListener
-dontwarn com.google.crypto.tink.subtle.XChaCha20Poly1305
-dontwarn net.jcip.annotations.GuardedBy
-dontwarn net.jcip.annotations.Immutable
-dontwarn net.jcip.annotations.ThreadSafe
Loading
Loading