Skip to content

Commit 91939b3

Browse files
Merge pull request #20 from raccoongang/develop
Develop to main. Release v1.1
2 parents 777d3de + e1e1eec commit 91939b3

File tree

150 files changed

+3590
-1414
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+3590
-1414
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,15 @@ Modern vision of the mobile application for the Open EdX platform from Raccoon G
1818

1919
6. Click the **Run** button.
2020

21+
## API plugin
22+
This project uses custom APIs to improve performance and reduce the number of requests to the server.
23+
24+
You can find the plugin with the API and installation guide [here](https://github.com/raccoongang/mobile-api-extensions).
25+
2126
## Roadmap
2227
Please feel welcome to develop any of the suggested features below and submit a pull request.
2328

24-
- Migrate to the new APIs
29+
- ~~Migrate to the new APIs~~
2530
- Recent searches
2631
- Migrate to the Olive and JWT token
2732
- UnAuth User mode

app/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ dependencies {
7676

7777
kapt "androidx.room:room-compiler:$room_version"
7878

79-
implementation "androidx.window:window:1.0.0"
8079
implementation 'androidx.core:core-splashscreen:1.0.0'
8180
testImplementation 'junit:junit:4.13.2'
8281

app/src/main/java/com/raccoongang/newedx/AppActivity.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import androidx.window.layout.WindowMetricsCalculator
1515
import com.raccoongang.auth.presentation.signin.SignInFragment
1616
import com.raccoongang.core.data.storage.PreferencesManager
1717
import com.raccoongang.core.extension.requestApplyInsetsWhenAttached
18+
import com.raccoongang.core.presentation.global.AppData
19+
import com.raccoongang.core.presentation.global.AppDataHolder
1820
import com.raccoongang.core.presentation.global.InsetHolder
1921
import com.raccoongang.core.presentation.global.WindowSizeHolder
2022
import com.raccoongang.core.ui.WindowSize
@@ -24,7 +26,7 @@ import com.raccoongang.profile.presentation.ProfileRouter
2426
import org.koin.android.ext.android.inject
2527
import org.koin.androidx.viewmodel.ext.android.viewModel
2628

27-
class AppActivity : AppCompatActivity(), InsetHolder, WindowSizeHolder {
29+
class AppActivity : AppCompatActivity(), InsetHolder, WindowSizeHolder, AppDataHolder {
2830

2931
override val topInset: Int
3032
get() = _insetTop
@@ -34,6 +36,9 @@ class AppActivity : AppCompatActivity(), InsetHolder, WindowSizeHolder {
3436
override val windowSize: WindowSize
3537
get() = _windowSize
3638

39+
override val appData: AppData
40+
get() = AppData(BuildConfig.VERSION_NAME)
41+
3742
private lateinit var binding: ActivityAppBinding
3843
private val preferencesManager by inject<PreferencesManager>()
3944
private val viewModel by viewModel<AppViewModel>()

app/src/main/java/com/raccoongang/newedx/AppRouter.kt

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ import com.raccoongang.auth.presentation.signin.SignInFragment
88
import com.raccoongang.auth.presentation.signup.SignUpFragment
99
import com.raccoongang.core.FragmentViewType
1010
import com.raccoongang.core.domain.model.Account
11-
import com.raccoongang.core.domain.model.Certificate
1211
import com.raccoongang.core.domain.model.CoursewareAccess
1312
import com.raccoongang.core.presentation.course.CourseViewMode
1413
import com.raccoongang.course.presentation.CourseRouter
1514
import com.raccoongang.course.presentation.container.CourseContainerFragment
1615
import com.raccoongang.course.presentation.container.NoAccessCourseContainerFragment
17-
import com.raccoongang.course.presentation.detail.CourseDetailFragment
16+
import com.raccoongang.course.presentation.detail.CourseDetailsFragment
1817
import com.raccoongang.course.presentation.handouts.HandoutsType
1918
import com.raccoongang.course.presentation.handouts.WebViewFragment
2019
import com.raccoongang.discovery.presentation.search.CourseSearchFragment
@@ -38,7 +37,7 @@ import com.raccoongang.profile.presentation.delete.DeleteProfileFragment
3837
import com.raccoongang.profile.presentation.edit.EditProfileFragment
3938
import com.raccoongang.profile.presentation.settings.video.VideoQualityFragment
4039
import com.raccoongang.profile.presentation.settings.video.VideoSettingsFragment
41-
import java.util.Date
40+
import java.util.*
4241

4342
class AppRouter : AuthRouter, DiscoveryRouter, DashboardRouter, CourseRouter, DiscussionRouter,
4443
ProfileRouter {
@@ -62,7 +61,7 @@ class AppRouter : AuthRouter, DiscoveryRouter, DashboardRouter, CourseRouter, Di
6261

6362
//region DiscoveryRouter
6463
override fun navigateToCourseDetail(fm: FragmentManager, courseId: String) {
65-
replaceFragmentWithBackStack(fm, CourseDetailFragment.newInstance(courseId))
64+
replaceFragmentWithBackStack(fm, CourseDetailsFragment.newInstance(courseId))
6665
}
6766

6867
override fun navigateToCourseSearch(fm: FragmentManager) {
@@ -71,26 +70,26 @@ class AppRouter : AuthRouter, DiscoveryRouter, DashboardRouter, CourseRouter, Di
7170
//endregion
7271

7372
//region DashboardRouter
73+
7474
override fun navigateToCourseOutline(
7575
fm: FragmentManager,
7676
courseId: String,
77-
title: String,
78-
image: String,
79-
certificate: Certificate,
80-
coursewareAccess: CoursewareAccess,
81-
auditAccessExpires: Date?
77+
courseTitle: String
8278
) {
83-
val destinationFragment = if (coursewareAccess.hasAccess) {
84-
CourseContainerFragment.newInstance(courseId, title, image, certificate)
85-
} else {
86-
NoAccessCourseContainerFragment.newInstance(title, coursewareAccess, auditAccessExpires)
87-
}
88-
8979
replaceFragmentWithBackStack(
9080
fm,
91-
destinationFragment
81+
CourseContainerFragment.newInstance(courseId, courseTitle)
9282
)
9383
}
84+
85+
override fun navigateToNoAccess(
86+
fm: FragmentManager,
87+
title: String,
88+
coursewareAccess: CoursewareAccess,
89+
auditAccessExpires: Date?
90+
) {
91+
replaceFragment(fm, NoAccessCourseContainerFragment.newInstance(title,coursewareAccess, auditAccessExpires))
92+
}
9493
//endregion
9594

9695
//region CourseRouter
@@ -194,10 +193,14 @@ class AppRouter : AuthRouter, DiscoveryRouter, DashboardRouter, CourseRouter, Di
194193
)
195194
}
196195

197-
override fun navigateToDiscussionResponses(fm: FragmentManager, comment: DiscussionComment) {
196+
override fun navigateToDiscussionResponses(
197+
fm: FragmentManager,
198+
comment: DiscussionComment,
199+
isClosed: Boolean
200+
) {
198201
replaceFragmentWithBackStack(
199202
fm,
200-
DiscussionResponsesFragment.newInstance(comment)
203+
DiscussionResponsesFragment.newInstance(comment, isClosed)
201204
)
202205
}
203206

app/src/main/java/com/raccoongang/newedx/di/AppModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.google.gson.GsonBuilder
77
import com.raccoongang.auth.presentation.AuthRouter
88
import com.raccoongang.core.data.storage.PreferencesManager
99
import com.raccoongang.core.module.DownloadWorkerController
10+
import com.raccoongang.core.module.TranscriptManager
1011
import com.raccoongang.core.module.download.FileDownloader
1112
import com.raccoongang.core.system.AppCookieManager
1213
import com.raccoongang.core.system.ResourceManager
@@ -99,4 +100,6 @@ val appModule = module {
99100
single {
100101
DownloadWorkerController(get(), get(), get())
101102
}
103+
104+
single { TranscriptManager(get()) }
102105
}

app/src/main/java/com/raccoongang/newedx/di/ScreenModule.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.raccoongang.auth.presentation.signin.SignInViewModel
77
import com.raccoongang.auth.presentation.signup.SignUpViewModel
88
import com.raccoongang.core.Validator
99
import com.raccoongang.core.domain.model.Account
10+
import com.raccoongang.core.presentation.dialog.SelectDialogViewModel
1011
import com.raccoongang.course.data.repository.CourseRepository
1112
import com.raccoongang.course.domain.interactor.CourseInteractor
1213
import com.raccoongang.course.presentation.container.CourseContainerViewModel
@@ -81,12 +82,13 @@ val screenModule = module {
8182
viewModel { (courseId: String) -> CourseOutlineViewModel(courseId, get(), get(), get(), get(), get(), get(), get()) }
8283
viewModel { CourseUnitsViewModel(get(), get(),get(), get(), get()) }
8384
viewModel { (courseId: String) -> CourseSectionViewModel(get(), get(), get(), get(), get(), get(), courseId) }
84-
viewModel { (courseId: String) -> CourseUnitContainerViewModel(get(), courseId) }
85+
viewModel { (courseId: String) -> CourseUnitContainerViewModel(get(), get(), courseId) }
8586
viewModel { (courseId: String) -> CourseVideoViewModel(courseId, get(), get(), get(), get(), get(), get(), get()) }
8687
viewModel { (courseId: String) -> VideoViewModel(courseId, get(), get(), get()) }
87-
viewModel { (courseId: String) -> VideoUnitViewModel(courseId, get(), get(), get(), get()) }
88+
viewModel { (courseId: String) -> VideoUnitViewModel(courseId, get(), get(), get(), get(), get()) }
8889
viewModel { (courseId:String, handoutsType: String) -> HandoutsViewModel(courseId, handoutsType, get()) }
8990
viewModel { CourseSearchViewModel(get(), get()) }
91+
viewModel { SelectDialogViewModel(get()) }
9092

9193
single { DiscussionRepository(get()) }
9294
factory { DiscussionInteractor(get()) }

app/src/main/java/com/raccoongang/newedx/room/AppDatabase.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import androidx.room.Database
44
import androidx.room.RoomDatabase
55
import androidx.room.TypeConverters
66
import com.raccoongang.core.data.model.room.CourseEntity
7+
import com.raccoongang.core.data.model.room.CourseStructureEntity
78
import com.raccoongang.core.data.model.room.discovery.EnrolledCourseEntity
89
import com.raccoongang.core.module.db.DownloadDao
910
import com.raccoongang.core.module.db.DownloadModelEntity
10-
import com.raccoongang.course.data.model.BlockDbEntity
1111
import com.raccoongang.course.data.storage.CourseConverter
1212
import com.raccoongang.course.data.storage.CourseDao
1313
import com.raccoongang.dashboard.data.DashboardDao
@@ -21,7 +21,7 @@ const val DATABASE_NAME = "newEdx_db"
2121
entities = [
2222
CourseEntity::class,
2323
EnrolledCourseEntity::class,
24-
BlockDbEntity::class,
24+
CourseStructureEntity::class,
2525
DownloadModelEntity::class
2626
],
2727
version = DATABASE_VERSION,

auth/src/main/java/com/raccoongang/auth/presentation/restore/RestorePasswordFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ private fun RestorePasswordScreen(
224224
.height(42.dp),
225225
contentAlignment = Alignment.Center
226226
) {
227-
CircularProgressIndicator(color = MaterialTheme.colors.primary)
227+
CircularProgressIndicator(color = MaterialTheme.appColors.primary)
228228
}
229229
} else {
230230
NewEdxButton(

auth/src/main/java/com/raccoongang/auth/presentation/signin/SignInFragment.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.ui.res.stringResource
2525
import androidx.compose.ui.text.input.ImeAction
2626
import androidx.compose.ui.text.input.KeyboardType
2727
import androidx.compose.ui.text.input.PasswordVisualTransformation
28+
import androidx.compose.ui.text.input.TextFieldValue
2829
import androidx.compose.ui.tooling.preview.Devices
2930
import androidx.compose.ui.tooling.preview.Preview
3031
import androidx.compose.ui.unit.Dp
@@ -254,7 +255,7 @@ private fun AuthForm(
254255
}
255256

256257
if (isLoading) {
257-
CircularProgressIndicator(color = MaterialTheme.colors.primary)
258+
CircularProgressIndicator(color = MaterialTheme.appColors.primary)
258259
} else {
259260
NewEdxButton(
260261
width = buttonWidth,
@@ -274,7 +275,11 @@ private fun PasswordTextField(
274275
onValueChanged: (String) -> Unit,
275276
onPressDone: () -> Unit,
276277
) {
277-
var passwordTextFieldValue by rememberSaveable { mutableStateOf("") }
278+
var passwordTextFieldValue by rememberSaveable(stateSaver = TextFieldValue.Saver) {
279+
mutableStateOf(
280+
TextFieldValue("")
281+
)
282+
}
278283
val focusManager = LocalFocusManager.current
279284
Text(
280285
modifier = Modifier.fillMaxWidth(),
@@ -288,7 +293,7 @@ private fun PasswordTextField(
288293
value = passwordTextFieldValue,
289294
onValueChange = {
290295
passwordTextFieldValue = it
291-
onValueChanged(it.trim())
296+
onValueChanged(it.text.trim())
292297
},
293298
colors = TextFieldDefaults.outlinedTextFieldColors(
294299
unfocusedBorderColor = MaterialTheme.appColors.textFieldBorder,

auth/src/main/java/com/raccoongang/auth/presentation/signup/SignUpFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ internal fun RegistrationScreen(
290290
Modifier
291291
.fillMaxSize(), contentAlignment = Alignment.Center
292292
) {
293-
CircularProgressIndicator()
293+
CircularProgressIndicator(color = MaterialTheme.appColors.primary)
294294
}
295295
}
296296
is SignUpUIState.Fields -> {
@@ -380,7 +380,7 @@ internal fun RegistrationScreen(
380380
.height(42.dp),
381381
contentAlignment = Alignment.Center
382382
) {
383-
CircularProgressIndicator()
383+
CircularProgressIndicator(color = MaterialTheme.appColors.primary)
384384
}
385385
} else {
386386
NewEdxButton(

0 commit comments

Comments
 (0)