From 91c483b8924d5dd255e8c9979c516208bfa9de6d Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Fri, 19 Sep 2025 11:12:17 +0300 Subject: [PATCH] Add external link icon for browser-based lessons --- .../android/AndroidStudioFragment.java | 24 ++++++++++++++++++- .../res/drawable-anydpi/ic_open_in_new.xml | 9 +++++++ .../res/layout/item_android_studio_lesson.xml | 10 ++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable-anydpi/ic_open_in_new.xml diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/AndroidStudioFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/AndroidStudioFragment.java index 2aa179cd..4a5c5418 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/AndroidStudioFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/AndroidStudioFragment.java @@ -176,6 +176,7 @@ private List loadItems() { String data = parser.getAttributeValue("http://schemas.android.com/apk/res/android", "data"); if (data != null) intent.setData(Uri.parse(data)); currentLesson.intent = intent; + currentLesson.opensInBrowser = isBrowserIntent(intent); } } else if (event == XmlPullParser.END_TAG) { String name = parser.getName(); @@ -191,6 +192,22 @@ private List loadItems() { return items; } + private boolean isBrowserIntent(Intent intent) { + if (intent.getComponent() != null) { + return false; + } + Uri data = intent.getData(); + if (data == null) { + return false; + } + String scheme = data.getScheme(); + if (scheme == null) { + return false; + } + return Intent.ACTION_VIEW.equals(intent.getAction()) + && ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)); + } + private void populateAdapter(List source, boolean showAds) { List items = new ArrayList<>(); List eligible = new ArrayList<>(); @@ -262,6 +279,7 @@ private static class Lesson { String summary; int iconRes; Intent intent; + boolean opensInBrowser; } private static class Category { @@ -329,7 +347,8 @@ public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { if (oldItem instanceof Lesson oldLesson && newItem instanceof Lesson newLesson) { return Objects.equals(oldLesson.title, newLesson.title) && Objects.equals(oldLesson.summary, newLesson.summary) - && oldLesson.iconRes == newLesson.iconRes; + && oldLesson.iconRes == newLesson.iconRes + && oldLesson.opensInBrowser == newLesson.opensInBrowser; } if (oldItem instanceof Category oldCat && newItem instanceof Category newCat) { return Objects.equals(oldCat.title, newCat.title) @@ -415,6 +434,7 @@ static class LessonHolder extends RecyclerView.ViewHolder { final AppCompatImageView icon; final MaterialTextView title; final MaterialTextView summary; + final AppCompatImageView externalIcon; LessonHolder(@NonNull ItemAndroidStudioLessonBinding binding) { super(binding.getRoot()); @@ -422,6 +442,7 @@ static class LessonHolder extends RecyclerView.ViewHolder { icon = binding.lessonIcon; title = binding.lessonTitle; summary = binding.lessonSummary; + externalIcon = binding.lessonExternalIcon; } void bind(Lesson lesson, boolean first, boolean last) { @@ -438,6 +459,7 @@ void bind(Lesson lesson, boolean first, boolean last) { } else { summary.setVisibility(View.GONE); } + externalIcon.setVisibility(lesson.opensInBrowser ? View.VISIBLE : View.GONE); itemView.setOnClickListener(v -> { if (lesson.intent != null) { v.getContext().startActivity(lesson.intent); diff --git a/app/src/main/res/drawable-anydpi/ic_open_in_new.xml b/app/src/main/res/drawable-anydpi/ic_open_in_new.xml new file mode 100644 index 00000000..139752d4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_open_in_new.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/item_android_studio_lesson.xml b/app/src/main/res/layout/item_android_studio_lesson.xml index fd2bd08e..0665649d 100644 --- a/app/src/main/res/layout/item_android_studio_lesson.xml +++ b/app/src/main/res/layout/item_android_studio_lesson.xml @@ -44,5 +44,15 @@ android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.Material3.BodySmall" /> + +