Skip to content

Commit 6906dd0

Browse files
Merge pull request #50 from MihaiCristianCondrea/codex/ensure-app-follows-recommended-architecture
Implement domain use cases for all screens
2 parents 13a06d2 + 88bf323 commit 6906dd0

39 files changed

+570
-42
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ Our app is designed to be easy to use and lightweight. Plus, it's free and open
4141

4242
Download Android Studio Tutorials: Java Edition from the Google Play Store and begin your Android development journey today. It's free, easy to use, and perfect for beginners.
4343

44+
## Architecture
45+
46+
The app follows the modern layered architecture recommended by Google. The UI layer observes
47+
immutable state from ViewModels. Business logic is encapsulated in use case classes within the
48+
domain layer, which interact with repositories in the data layer. Each screen now exposes its
49+
operations through a small set of use cases. This pattern was inspired by the
50+
[Android Clean Architecture](https://github.com/android10/Android-CleanArchitecture) sample but
51+
implemented in a simplified form to avoid adding heavy dependencies. The result keeps the UI
52+
simple and ensures a clear separation of concerns across the whole app.
53+
4454
## Feedback
4555

4656
We are constantly updating and improving Android Studio Tutorials: Java Edition to give you the best possible experience. If you have suggested features or improvements, please leave a review. If something isn't working correctly, let us know so we can fix it.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.about;
2+
3+
import com.d4rk.androidtutorials.java.ui.screens.about.repository.AboutRepository;
4+
5+
/** Provides current year as a string. */
6+
public class GetCurrentYearUseCase {
7+
private final AboutRepository repository;
8+
9+
public GetCurrentYearUseCase(AboutRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public String invoke() {
14+
return repository.getCurrentYear();
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.about;
2+
3+
import com.d4rk.androidtutorials.java.ui.screens.about.repository.AboutRepository;
4+
5+
/** Returns the formatted app version string. */
6+
public class GetVersionStringUseCase {
7+
private final AboutRepository repository;
8+
9+
public GetVersionStringUseCase(AboutRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public String invoke() {
14+
return repository.getVersionString();
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.android;
2+
3+
import com.d4rk.androidtutorials.java.ui.screens.android.repository.LessonRepository;
4+
5+
/** Retrieves lesson data by name. */
6+
public class GetLessonUseCase {
7+
private final LessonRepository repository;
8+
9+
public GetLessonUseCase(LessonRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public LessonRepository.Lesson invoke(String lessonName) {
14+
return repository.getLesson(lessonName);
15+
}
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.d4rk.androidtutorials.java.domain.help;
2+
3+
import android.app.Activity;
4+
import com.d4rk.androidtutorials.java.ui.screens.help.repository.HelpRepository;
5+
import com.google.android.play.core.review.ReviewInfo;
6+
7+
/** Launches the in-app review flow. */
8+
public class LaunchReviewFlowUseCase {
9+
private final HelpRepository repository;
10+
11+
public LaunchReviewFlowUseCase(HelpRepository repository) {
12+
this.repository = repository;
13+
}
14+
15+
public void invoke(Activity activity, ReviewInfo info) {
16+
repository.launchReviewFlow(activity, info);
17+
}
18+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.help;
2+
3+
import com.d4rk.androidtutorials.java.ui.screens.help.repository.HelpRepository;
4+
5+
/** Requests the Google Play review flow. */
6+
public class RequestReviewFlowUseCase {
7+
private final HelpRepository repository;
8+
9+
public RequestReviewFlowUseCase(HelpRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public void invoke(HelpRepository.OnReviewInfoListener listener) {
14+
repository.requestReviewFlow(listener);
15+
}
16+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.d4rk.androidtutorials.java.domain.home;
2+
3+
import com.d4rk.androidtutorials.java.ui.screens.home.repository.HomeRepository;
4+
5+
/** Use case that provides the daily tip text. */
6+
public class GetDailyTipUseCase {
7+
private final HomeRepository repository;
8+
9+
public GetDailyTipUseCase(HomeRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
/**
14+
* Returns today's tip string.
15+
*/
16+
public String invoke() {
17+
return repository.getDailyTip();
18+
}
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.d4rk.androidtutorials.java.domain.home;
2+
3+
import com.d4rk.androidtutorials.java.data.model.PromotedApp;
4+
import com.d4rk.androidtutorials.java.ui.screens.home.repository.HomeRepository;
5+
6+
import java.util.List;
7+
8+
/** Use case that fetches promoted apps from the repository. */
9+
public class GetPromotedAppsUseCase {
10+
private final HomeRepository repository;
11+
12+
public interface Callback {
13+
void onResult(List<PromotedApp> apps);
14+
}
15+
16+
public GetPromotedAppsUseCase(HomeRepository repository) {
17+
this.repository = repository;
18+
}
19+
20+
/**
21+
* Fetches the promoted apps and returns them via the callback.
22+
*/
23+
public void invoke(Callback callback) {
24+
repository.fetchPromotedApps(callback::onResult);
25+
}
26+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.main;
2+
3+
import com.d4rk.androidtutorials.java.ui.screens.main.repository.MainRepository;
4+
5+
/** Applies the saved language preference. */
6+
public class ApplyLanguageSettingsUseCase {
7+
private final MainRepository repository;
8+
9+
public ApplyLanguageSettingsUseCase(MainRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public void invoke() {
14+
repository.applyLanguageSettings();
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.main;
2+
3+
import com.d4rk.androidtutorials.java.ui.screens.main.repository.MainRepository;
4+
5+
/** Applies theme preference and returns true if changed. */
6+
public class ApplyThemeSettingsUseCase {
7+
private final MainRepository repository;
8+
9+
public ApplyThemeSettingsUseCase(MainRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public boolean invoke(String[] darkModeValues) {
14+
return repository.applyThemeSettings(darkModeValues);
15+
}
16+
}

0 commit comments

Comments
 (0)