Skip to content

Commit 20b2c0c

Browse files
Rework help FAQ into single scroll list
1 parent 0e4ad71 commit 20b2c0c

File tree

5 files changed

+118
-128
lines changed

5 files changed

+118
-128
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/help/HelpActivity.java

Lines changed: 72 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
import android.content.Intent;
55
import android.net.Uri;
66
import android.os.Bundle;
7+
import android.view.LayoutInflater;
78
import android.view.Menu;
89
import android.view.MenuItem;
910
import android.view.View;
1011
import android.view.ViewGroup;
1112
import android.widget.FrameLayout;
1213

13-
import androidx.annotation.NonNull;
1414
import androidx.annotation.Nullable;
15+
import androidx.appcompat.widget.LinearLayoutCompat;
16+
17+
import androidx.annotation.NonNull;
18+
import androidx.annotation.StringRes;
1519
import androidx.appcompat.app.AlertDialog;
1620
import androidx.lifecycle.ViewModelProvider;
1721
import androidx.preference.Preference;
@@ -23,37 +27,46 @@
2327
import com.d4rk.androidtutorials.java.ads.AdUtils;
2428
import com.d4rk.androidtutorials.java.databinding.ActivityHelpBinding;
2529
import com.d4rk.androidtutorials.java.databinding.DialogVersionInfoBinding;
30+
import com.d4rk.androidtutorials.java.databinding.ItemHelpFaqBinding;
2631
import com.d4rk.androidtutorials.java.ui.components.navigation.BaseActivity;
2732
import com.d4rk.androidtutorials.java.ui.screens.help.repository.HelpRepository;
28-
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
2933
import com.d4rk.androidtutorials.java.utils.OpenSourceLicensesUtils;
3034
import com.google.android.material.snackbar.Snackbar;
3135
import com.google.android.play.core.review.ReviewInfo;
3236

3337
import dagger.hilt.android.AndroidEntryPoint;
3438
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
3539

40+
import java.util.Arrays;
41+
import java.util.List;
42+
3643
@AndroidEntryPoint
3744
public class HelpActivity extends BaseActivity {
3845

3946
private HelpViewModel helpViewModel;
47+
private static final List<FaqItem> FAQ_ITEMS = Arrays.asList(
48+
new FaqItem(R.string.question_1, R.string.summary_preference_faq_1),
49+
new FaqItem(R.string.question_2, R.string.summary_preference_faq_2),
50+
new FaqItem(R.string.question_3, R.string.summary_preference_faq_3),
51+
new FaqItem(R.string.question_4, R.string.summary_preference_faq_4),
52+
new FaqItem(R.string.question_5, R.string.summary_preference_faq_5),
53+
new FaqItem(R.string.question_6, R.string.summary_preference_faq_6),
54+
new FaqItem(R.string.question_7, R.string.summary_preference_faq_7),
55+
new FaqItem(R.string.question_8, R.string.summary_preference_faq_8),
56+
new FaqItem(R.string.question_9, R.string.summary_preference_faq_9)
57+
);
4058

4159
@Override
4260
protected void onCreate(Bundle savedInstanceState) {
4361
super.onCreate(savedInstanceState);
4462
ActivityHelpBinding binding = ActivityHelpBinding.inflate(getLayoutInflater());
4563
setContentView(binding.getRoot());
46-
setSupportActionBar(binding.topAppBar);
47-
binding.topAppBar.setNavigationOnClickListener(v -> getOnBackPressedDispatcher().onBackPressed());
48-
EdgeToEdgeDelegate.apply(this, binding.helpContainer);
4964
AdUtils.loadBanner(binding.faqNativeAd);
5065
helpViewModel = new ViewModelProvider(this).get(HelpViewModel.class);
51-
new FastScrollerBuilder(binding.scrollContainer)
66+
new FastScrollerBuilder(binding.scrollView)
5267
.useMd2Style()
5368
.build();
54-
getSupportFragmentManager().beginTransaction()
55-
.replace(R.id.frame_layout_faq, new FaqFragment())
56-
.commit();
69+
bindFaqItems(binding);
5770

5871
getSupportFragmentManager().beginTransaction()
5972
.replace(R.id.frame_layout_feedback, new FeedbackFragment())
@@ -128,36 +141,6 @@ private void openLink(String url) {
128141
startActivity(browserIntent);
129142
}
130143

131-
public static class FaqFragment extends PreferenceFragmentCompat {
132-
@Override
133-
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
134-
setPreferencesFromResource(R.xml.preferences_faq, rootKey);
135-
}
136-
137-
@Override
138-
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
139-
super.onViewCreated(view, savedInstanceState);
140-
RecyclerView listView = getListView();
141-
listView.setNestedScrollingEnabled(false);
142-
listView.setOverScrollMode(View.OVER_SCROLL_NEVER);
143-
listView.setClipToPadding(false);
144-
145-
ViewGroup.LayoutParams layoutParams = listView.getLayoutParams();
146-
FrameLayout.LayoutParams frameLayoutParams;
147-
if (layoutParams instanceof FrameLayout.LayoutParams) {
148-
frameLayoutParams = (FrameLayout.LayoutParams) layoutParams;
149-
} else {
150-
frameLayoutParams = new FrameLayout.LayoutParams(
151-
ViewGroup.LayoutParams.MATCH_PARENT,
152-
ViewGroup.LayoutParams.WRAP_CONTENT
153-
);
154-
}
155-
frameLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
156-
frameLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
157-
listView.setLayoutParams(frameLayoutParams);
158-
}
159-
}
160-
161144
public static class FeedbackFragment extends PreferenceFragmentCompat {
162145

163146
@Override
@@ -187,6 +170,29 @@ public void onFailure(Exception e) {
187170
}
188171
}
189172

173+
@Override
174+
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
175+
super.onViewCreated(view, savedInstanceState);
176+
RecyclerView listView = getListView();
177+
listView.setNestedScrollingEnabled(false);
178+
listView.setOverScrollMode(View.OVER_SCROLL_NEVER);
179+
listView.setClipToPadding(false);
180+
181+
ViewGroup.LayoutParams layoutParams = listView.getLayoutParams();
182+
FrameLayout.LayoutParams frameLayoutParams;
183+
if (layoutParams instanceof FrameLayout.LayoutParams) {
184+
frameLayoutParams = (FrameLayout.LayoutParams) layoutParams;
185+
} else {
186+
frameLayoutParams = new FrameLayout.LayoutParams(
187+
ViewGroup.LayoutParams.MATCH_PARENT,
188+
ViewGroup.LayoutParams.WRAP_CONTENT
189+
);
190+
}
191+
frameLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
192+
frameLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
193+
listView.setLayoutParams(frameLayoutParams);
194+
}
195+
190196
private void launchGooglePlayReviews() {
191197
Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=" + requireActivity().getPackageName() + "&showAllReviews=true");
192198
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
@@ -201,4 +207,31 @@ private void launchGooglePlayReviews() {
201207
}
202208
}
203209
}
210+
211+
private void bindFaqItems(ActivityHelpBinding binding) {
212+
LinearLayoutCompat faqList = binding.faqList;
213+
faqList.removeAllViews();
214+
LayoutInflater inflater = LayoutInflater.from(this);
215+
216+
for (int i = 0; i < FAQ_ITEMS.size(); i++) {
217+
FaqItem item = FAQ_ITEMS.get(i);
218+
ItemHelpFaqBinding itemBinding = ItemHelpFaqBinding.inflate(inflater, faqList, false);
219+
itemBinding.question.setText(item.questionResId);
220+
itemBinding.answer.setText(item.answerResId);
221+
itemBinding.divider.setVisibility(i == FAQ_ITEMS.size() - 1 ? View.GONE : View.VISIBLE);
222+
faqList.addView(itemBinding.getRoot());
223+
}
224+
}
225+
226+
private static final class FaqItem {
227+
@StringRes
228+
private final int questionResId;
229+
@StringRes
230+
private final int answerResId;
231+
232+
private FaqItem(@StringRes int questionResId, @StringRes int answerResId) {
233+
this.questionResId = questionResId;
234+
this.answerResId = answerResId;
235+
}
236+
}
204237
}

app/src/main/res/layout/activity_help.xml

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,33 @@
22
<androidx.constraintlayout.widget.ConstraintLayout
33
xmlns:android="http://schemas.android.com/apk/res/android"
44
xmlns:app="http://schemas.android.com/apk/res-auto"
5-
android:id="@+id/help_container"
5+
android:id="@+id/container"
66
android:layout_width="match_parent"
77
android:layout_height="match_parent">
88

9-
<com.google.android.material.appbar.MaterialToolbar
10-
android:id="@+id/top_app_bar"
11-
style="@style/Widget.Material3.Toolbar.Surface"
12-
android:layout_width="0dp"
13-
android:layout_height="wrap_content"
14-
app:layout_constraintEnd_toEndOf="parent"
15-
app:layout_constraintStart_toStartOf="parent"
16-
app:layout_constraintTop_toTopOf="parent"
17-
app:title="@string/help" />
18-
199
<me.zhanghai.android.fastscroll.FastScrollScrollView
20-
android:id="@+id/scroll_container"
21-
android:layout_width="0dp"
10+
android:id="@+id/scroll_view"
11+
android:layout_width="match_parent"
2212
android:layout_height="0dp"
2313
android:clipToPadding="false"
2414
app:layout_constraintBottom_toBottomOf="parent"
25-
app:layout_constraintEnd_toEndOf="parent"
26-
app:layout_constraintStart_toStartOf="parent"
27-
app:layout_constraintTop_toBottomOf="@id/top_app_bar">
15+
app:layout_constraintTop_toTopOf="parent">
2816

29-
<LinearLayout
17+
<androidx.appcompat.widget.LinearLayoutCompat
3018
android:id="@+id/content_container"
3119
android:layout_width="match_parent"
3220
android:layout_height="wrap_content"
3321
android:orientation="vertical"
34-
android:paddingHorizontal="24dp"
35-
android:paddingTop="24dp"
22+
android:paddingStart="24dp"
23+
android:paddingTop="16dp"
24+
android:paddingEnd="24dp"
3625
android:paddingBottom="32dp">
3726

3827
<com.google.android.material.textview.MaterialTextView
3928
android:id="@+id/text_view_faq"
4029
android:layout_width="wrap_content"
4130
android:layout_height="wrap_content"
42-
android:layout_marginBottom="12dp"
31+
android:layout_marginBottom="16dp"
4332
android:text="@string/faq"
4433
android:textAppearance="@style/TextAppearance.Material3.TitleMedium" />
4534

@@ -51,17 +40,12 @@
5140
android:layout_marginBottom="24dp"
5241
app:shapeAppearance="@style/ShapeAppearanceOverlay.CardViewTopRoundedFilled">
5342

54-
<LinearLayout
43+
<androidx.appcompat.widget.LinearLayoutCompat
44+
android:id="@+id/faq_list"
5545
android:layout_width="match_parent"
5646
android:layout_height="wrap_content"
5747
android:orientation="vertical"
58-
android:padding="16dp">
59-
60-
<FrameLayout
61-
android:id="@+id/frame_layout_faq"
62-
android:layout_width="match_parent"
63-
android:layout_height="wrap_content" />
64-
</LinearLayout>
48+
android:padding="16dp" />
6549
</com.google.android.material.card.MaterialCardView>
6650

6751
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
@@ -76,7 +60,8 @@
7660
android:layout_width="match_parent"
7761
android:layout_height="wrap_content" />
7862

79-
</LinearLayout>
63+
</androidx.appcompat.widget.LinearLayoutCompat>
64+
8065
</me.zhanghai.android.fastscroll.FastScrollScrollView>
8166

8267
</androidx.constraintlayout.widget.ConstraintLayout>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
android:layout_width="match_parent"
5+
android:layout_height="wrap_content"
6+
android:orientation="vertical"
7+
android:paddingVertical="16dp">
8+
9+
<com.google.android.material.textview.MaterialTextView
10+
android:id="@+id/question"
11+
android:layout_width="match_parent"
12+
android:layout_height="wrap_content"
13+
android:textAppearance="@style/TextAppearance.Material3.TitleSmall"
14+
android:textStyle="bold" />
15+
16+
<com.google.android.material.textview.MaterialTextView
17+
android:id="@+id/answer"
18+
android:layout_width="match_parent"
19+
android:layout_height="wrap_content"
20+
android:layout_marginTop="8dp"
21+
android:textAppearance="@style/TextAppearance.Material3.BodyMedium" />
22+
23+
<com.google.android.material.divider.MaterialDivider
24+
android:id="@+id/divider"
25+
android:layout_width="match_parent"
26+
android:layout_height="wrap_content"
27+
android:layout_marginTop="16dp" />
28+
29+
</androidx.appcompat.widget.LinearLayoutCompat>

app/src/main/res/xml/preferences_faq.xml

Lines changed: 0 additions & 57 deletions
This file was deleted.

docs/screens/help.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
The Help screen provides users with access to frequently asked questions (FAQs), options to submit feedback, and links to important information like the app's privacy policy, terms of service, and open-source licenses.
55

66
## Structure
7-
The Help screen is implemented as an `Activity` that hosts different sections using `PreferenceFragmentCompat`:
8-
- **`HelpActivity`**: The main activity for this screen. It manages the layout and hosts the fragments.
9-
- **`FaqFragment`**: Displays a list of frequently asked questions, loaded from `R.xml.preferences_faq`.
7+
The Help screen is implemented as an `Activity` that composes different sections:
8+
- **`HelpActivity`**: The main activity for this screen. It manages the layout, renders the FAQ list, and hosts the feedback fragment.
9+
- **FAQ list**: Built dynamically inside the activity by inflating a shared item layout for each question/answer pair.
1010
- **`FeedbackFragment`**: Contains preferences related to user feedback, including an option to rate the app. This is loaded from `R.xml.preferences_feedback`.
1111

1212
## Features

0 commit comments

Comments
 (0)