44import android .content .Intent ;
55import android .net .Uri ;
66import android .os .Bundle ;
7+ import android .view .LayoutInflater ;
78import android .view .Menu ;
89import android .view .MenuItem ;
10+ import android .view .View ;
11+ import android .view .ViewGroup ;
12+ import android .widget .FrameLayout ;
913
14+ import androidx .annotation .Nullable ;
1015import androidx .annotation .NonNull ;
16+ import androidx .annotation .StringRes ;
1117import androidx .appcompat .app .AlertDialog ;
18+ import androidx .appcompat .widget .LinearLayoutCompat ;
19+ import androidx .core .view .ViewCompat ;
1220import androidx .lifecycle .ViewModelProvider ;
1321import androidx .preference .Preference ;
1422import androidx .preference .PreferenceFragmentCompat ;
23+ import androidx .recyclerview .widget .RecyclerView ;
1524
1625import com .d4rk .androidtutorials .java .BuildConfig ;
1726import com .d4rk .androidtutorials .java .R ;
1827import com .d4rk .androidtutorials .java .ads .AdUtils ;
1928import com .d4rk .androidtutorials .java .databinding .ActivityHelpBinding ;
2029import com .d4rk .androidtutorials .java .databinding .DialogVersionInfoBinding ;
30+ import com .d4rk .androidtutorials .java .databinding .ItemHelpFaqBinding ;
2131import com .d4rk .androidtutorials .java .ui .components .navigation .BaseActivity ;
2232import com .d4rk .androidtutorials .java .ui .screens .help .repository .HelpRepository ;
23- import com .d4rk .androidtutorials .java .utils .EdgeToEdgeDelegate ;
2433import com .d4rk .androidtutorials .java .utils .OpenSourceLicensesUtils ;
2534import com .google .android .material .snackbar .Snackbar ;
2635import com .google .android .play .core .review .ReviewInfo ;
2736
2837import dagger .hilt .android .AndroidEntryPoint ;
2938import me .zhanghai .android .fastscroll .FastScrollerBuilder ;
3039
40+ import java .util .Arrays ;
41+ import java .util .List ;
42+
3143@ AndroidEntryPoint
3244public class HelpActivity extends BaseActivity {
3345
3446 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+ );
3558
3659 @ Override
3760 protected void onCreate (Bundle savedInstanceState ) {
3861 super .onCreate (savedInstanceState );
3962 ActivityHelpBinding binding = ActivityHelpBinding .inflate (getLayoutInflater ());
4063 setContentView (binding .getRoot ());
41- EdgeToEdgeDelegate .apply (this , binding .getRoot ());
4264 AdUtils .loadBanner (binding .faqNativeAd );
4365 helpViewModel = new ViewModelProvider (this ).get (HelpViewModel .class );
44- new FastScrollerBuilder (binding .scrollContainer )
66+ new FastScrollerBuilder (binding .scrollView )
4567 .useMd2Style ()
4668 .build ();
47- getSupportFragmentManager ().beginTransaction ()
48- .replace (R .id .frame_layout_faq , new FaqFragment ())
49- .commit ();
69+ bindFaqItems (binding );
5070
5171 getSupportFragmentManager ().beginTransaction ()
5272 .replace (R .id .frame_layout_feedback , new FeedbackFragment ())
@@ -121,13 +141,6 @@ private void openLink(String url) {
121141 startActivity (browserIntent );
122142 }
123143
124- public static class FaqFragment extends PreferenceFragmentCompat {
125- @ Override
126- public void onCreatePreferences (Bundle savedInstanceState , String rootKey ) {
127- setPreferencesFromResource (R .xml .preferences_faq , rootKey );
128- }
129- }
130-
131144 public static class FeedbackFragment extends PreferenceFragmentCompat {
132145
133146 @ Override
@@ -157,6 +170,29 @@ public void onFailure(Exception e) {
157170 }
158171 }
159172
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+
160196 private void launchGooglePlayReviews () {
161197 Uri uri = Uri .parse ("https://play.google.com/store/apps/details?id=" + requireActivity ().getPackageName () + "&showAllReviews=true" );
162198 Intent intent = new Intent (Intent .ACTION_VIEW , uri );
@@ -171,4 +207,58 @@ private void launchGooglePlayReviews() {
171207 }
172208 }
173209 }
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 .answer .setVisibility (View .GONE );
222+ itemBinding .toggleIcon .setRotation (0f );
223+ CharSequence questionText = itemBinding .question .getText ();
224+ itemBinding .getRoot ().setContentDescription (questionText );
225+ itemBinding .questionContainer .setContentDescription (questionText );
226+ ViewCompat .setStateDescription (itemBinding .getRoot (), getString (R .string .faq_state_collapsed ));
227+ ViewCompat .setStateDescription (itemBinding .questionContainer , getString (R .string .faq_state_collapsed ));
228+
229+ View .OnClickListener toggleListener = v -> toggleFaqItem (itemBinding );
230+ itemBinding .getRoot ().setOnClickListener (toggleListener );
231+ itemBinding .questionContainer .setOnClickListener (toggleListener );
232+ itemBinding .toggleIcon .setOnClickListener (toggleListener );
233+ itemBinding .divider .setVisibility (i == FAQ_ITEMS .size () - 1 ? View .GONE : View .VISIBLE );
234+ faqList .addView (itemBinding .getRoot ());
235+ }
236+ }
237+
238+ private void toggleFaqItem (ItemHelpFaqBinding binding ) {
239+ boolean expand = binding .answer .getVisibility () != View .VISIBLE ;
240+ binding .answer .setVisibility (expand ? View .VISIBLE : View .GONE );
241+ float rotation = expand ? 180f : 0f ;
242+ binding .toggleIcon .animate ().cancel ();
243+ binding .toggleIcon .animate ()
244+ .rotation (rotation )
245+ .setDuration (200L )
246+ .start ();
247+ int stateRes = expand ? R .string .faq_state_expanded : R .string .faq_state_collapsed ;
248+ CharSequence stateDescription = getString (stateRes );
249+ ViewCompat .setStateDescription (binding .getRoot (), stateDescription );
250+ ViewCompat .setStateDescription (binding .questionContainer , stateDescription );
251+ }
252+
253+ private static final class FaqItem {
254+ @ StringRes
255+ private final int questionResId ;
256+ @ StringRes
257+ private final int answerResId ;
258+
259+ private FaqItem (@ StringRes int questionResId , @ StringRes int answerResId ) {
260+ this .questionResId = questionResId ;
261+ this .answerResId = answerResId ;
262+ }
263+ }
174264}
0 commit comments