From 07053702f80c80343212ad7075276711396a7546 Mon Sep 17 00:00:00 2001 From: D4rK Date: Wed, 11 Jun 2025 15:22:30 +0300 Subject: [PATCH] feat(home): add promoted apps section --- .../java/data/model/PromotedApp.java | 11 +++++ .../java/ui/screens/home/HomeFragment.java | 14 ++++++ .../java/ui/screens/home/HomeViewModel.java | 35 ++++++++++++++ .../home/repository/HomeRepository.java | 10 ++++ app/src/main/res/layout/fragment_home.xml | 29 ++++++++++++ app/src/main/res/layout/promoted_app_item.xml | 46 +++++++++++++++++++ app/src/main/res/values/strings.xml | 7 +++ .../res/values/untranslatable_strings.xml | 3 ++ 8 files changed, 155 insertions(+) create mode 100644 app/src/main/java/com/d4rk/androidtutorials/java/data/model/PromotedApp.java create mode 100644 app/src/main/res/layout/promoted_app_item.xml diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/data/model/PromotedApp.java b/app/src/main/java/com/d4rk/androidtutorials/java/data/model/PromotedApp.java new file mode 100644 index 00000000..f8dcb575 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/data/model/PromotedApp.java @@ -0,0 +1,11 @@ +package com.d4rk.androidtutorials.java.data.model; + +import androidx.annotation.DrawableRes; +import androidx.annotation.StringRes; + +public record PromotedApp( + @DrawableRes int iconResId, + @StringRes int nameResId, + @StringRes int descriptionResId, + String packageName +) {} diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeFragment.java index d985c48a..d7a17a98 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeFragment.java @@ -38,6 +38,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat binding.tipText.setText(tip); binding.shareTipButton.setOnClickListener(v -> shareTip(tip)); }); + setupPromotions(LayoutInflater.from(requireContext())); new FastScrollerBuilder(binding.scrollView) .useMd2Style() .build(); @@ -62,4 +63,17 @@ private void shareTip(String tip) { shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, tip); startActivity(android.content.Intent.createChooser(shareIntent, getString(com.d4rk.androidtutorials.java.R.string.share_using))); } + + private void setupPromotions(LayoutInflater inflater) { + ViewGroup container = binding.promotedAppsContainer; + for (com.d4rk.androidtutorials.java.data.model.PromotedApp app : homeViewModel.getPromotedApps()) { + com.d4rk.androidtutorials.java.databinding.PromotedAppItemBinding itemBinding = + com.d4rk.androidtutorials.java.databinding.PromotedAppItemBinding.inflate(inflater, container, false); + itemBinding.appIcon.setImageResource(app.iconResId()); + itemBinding.appName.setText(app.nameResId()); + itemBinding.appDescription.setText(app.descriptionResId()); + itemBinding.appButton.setOnClickListener(v -> startActivity(homeViewModel.getPromotedAppIntent(app.packageName()))); + container.addView(itemBinding.getRoot()); + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeViewModel.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeViewModel.java index ddda5632..6cf9ffcd 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeViewModel.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeViewModel.java @@ -2,6 +2,10 @@ import android.app.Application; import android.content.Intent; +import java.util.ArrayList; +import java.util.List; + +import com.d4rk.androidtutorials.java.data.model.PromotedApp; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -19,6 +23,7 @@ public class HomeViewModel extends AndroidViewModel { private final MutableLiveData announcementTitle = new MutableLiveData<>(); private final MutableLiveData announcementSubtitle = new MutableLiveData<>(); private final MutableLiveData dailyTip = new MutableLiveData<>(); + private final List promotedApps = new ArrayList<>(); public HomeViewModel(@NonNull Application application) { super(application); @@ -27,6 +32,22 @@ public HomeViewModel(@NonNull Application application) { announcementTitle.setValue(application.getString(R.string.announcement_title)); announcementSubtitle.setValue(application.getString(R.string.announcement_subtitle)); dailyTip.setValue(homeRepository.getDailyTip()); + + promotedApps.add(new PromotedApp( + R.mipmap.ic_shortcut_kotlin_edition, + R.string.kotlin_edition_name, + R.string.kotlin_edition_description, + application.getString(R.string.package_ast_kotlin))); + promotedApps.add(new PromotedApp( + R.drawable.ic_shop, + R.string.cart_calculator_name, + R.string.cart_calculator_description, + application.getString(R.string.package_cart_calculator))); + promotedApps.add(new PromotedApp( + R.drawable.ic_safety_check_tinted, + R.string.cleaner_android_name, + R.string.cleaner_android_description, + application.getString(R.string.package_cleaner_android))); } /** @@ -57,4 +78,18 @@ public LiveData getDailyTip() { public Intent getOpenPlayStoreIntent() { return homeRepository.getPlayStoreIntent(); } + + /** + * List of apps to promote on the Home screen. + */ + public List getPromotedApps() { + return promotedApps; + } + + /** + * Builds an intent to open the Google Play listing for the provided package. + */ + public Intent getPromotedAppIntent(String packageName) { + return homeRepository.getAppPlayStoreIntent(packageName); + } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/repository/HomeRepository.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/repository/HomeRepository.java index a53a739d..ee5ed996 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/repository/HomeRepository.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/repository/HomeRepository.java @@ -29,6 +29,16 @@ public Intent getPlayStoreIntent() { return intent; } + /** + * Returns an Intent that opens the Google Play Store page for the provided package. + */ + public Intent getAppPlayStoreIntent(String packageName) { + String url = "https://play.google.com/store/apps/details?id=" + packageName; + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + intent.setPackage("com.android.vending"); + return intent; + } + /** * Returns a daily tip based on the current date. */ diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 840c3ff0..1c3e6169 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -134,6 +134,35 @@ app:adSize="MEDIUM_RECTANGLE" app:adUnitId="@string/ad_banner_unit_id" /> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 032d3186..0d187a2a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -404,4 +404,11 @@ Use Material Design 3 components for a modern look. Profile your app regularly to track performance. + More apps by the developer + AST - Kotlin Edition + Learn Android development with Kotlin. + Cart Calculator + Quickly total up your shopping cart. + Cleaner for Android + Free up space and optimize your device. \ No newline at end of file diff --git a/app/src/main/res/values/untranslatable_strings.xml b/app/src/main/res/values/untranslatable_strings.xml index b4c90a1a..5963c266 100644 --- a/app/src/main/res/values/untranslatable_strings.xml +++ b/app/src/main/res/values/untranslatable_strings.xml @@ -44,4 +44,7 @@ Error loading changelog ca-app-pub-5294151573817700/3821250346 + com.d4rk.androidtutorials + com.d4rk.cartcalculator + com.d4rk.cleaner \ No newline at end of file