88import android .view .Menu ;
99import android .view .MenuItem ;
1010import android .view .View ;
11+ import android .view .ViewGroup ;
12+ import android .widget .FrameLayout ;
1113import androidx .annotation .NonNull ;
14+ import androidx .annotation .Nullable ;
1215import androidx .annotation .StringRes ;
1316import androidx .appcompat .app .AlertDialog ;
1417import androidx .appcompat .widget .LinearLayoutCompat ;
1518import androidx .core .view .ViewCompat ;
19+ import androidx .lifecycle .ViewModelProvider ;
20+ import androidx .preference .Preference ;
21+ import androidx .preference .PreferenceFragmentCompat ;
22+ import androidx .recyclerview .widget .RecyclerView ;
1623
1724import com .d4rk .androidtutorials .java .BuildConfig ;
1825import com .d4rk .androidtutorials .java .R ;
2128import com .d4rk .androidtutorials .java .databinding .DialogVersionInfoBinding ;
2229import com .d4rk .androidtutorials .java .databinding .ItemHelpFaqBinding ;
2330import com .d4rk .androidtutorials .java .ui .components .navigation .BaseActivity ;
31+ import com .d4rk .androidtutorials .java .ui .screens .help .repository .HelpRepository ;
2432import com .d4rk .androidtutorials .java .utils .OpenSourceLicensesUtils ;
2533import com .google .android .material .snackbar .Snackbar ;
34+ import com .google .android .play .core .review .ReviewInfo ;
2635
2736import dagger .hilt .android .AndroidEntryPoint ;
2837import me .zhanghai .android .fastscroll .FastScrollerBuilder ;
3443public class HelpActivity extends BaseActivity {
3544
3645 private ActivityHelpBinding binding ;
46+ private HelpViewModel helpViewModel ;
3747 private static final List <FaqItem > FAQ_ITEMS = Arrays .asList (
3848 new FaqItem (R .string .question_1 , R .string .summary_preference_faq_1 ),
3949 new FaqItem (R .string .question_2 , R .string .summary_preference_faq_2 ),
@@ -52,11 +62,18 @@ protected void onCreate(Bundle savedInstanceState) {
5262 binding = ActivityHelpBinding .inflate (getLayoutInflater ());
5363 setContentView (binding .getRoot ());
5464 AdUtils .loadBanner (binding .faqNativeAd );
65+ helpViewModel = new ViewModelProvider (this ).get (HelpViewModel .class );
5566 new FastScrollerBuilder (binding .scrollView )
5667 .useMd2Style ()
5768 .build ();
5869 bindFaqItems (binding );
5970 setupContactSupportCard ();
71+
72+ if (savedInstanceState == null ) {
73+ getSupportFragmentManager ().beginTransaction ()
74+ .replace (R .id .frame_layout_feedback , new FeedbackFragment ())
75+ .commit ();
76+ }
6077 }
6178
6279 @ Override
@@ -128,21 +145,25 @@ private void setupContactSupportCard() {
128145 }
129146
130147 private void openSupportEmail () {
131- Intent intent = new Intent (Intent .ACTION_SENDTO );
132148 String supportEmail = getString (R .string .contact_support_email );
133- intent .setData (Uri .parse ("mailto:" + supportEmail ));
149+ Intent intent = new Intent (Intent .ACTION_SENDTO );
150+ intent .setData (Uri .fromParts ("mailto" , supportEmail , null ));
134151 intent .putExtra (Intent .EXTRA_EMAIL , new String []{supportEmail });
135152 intent .putExtra (Intent .EXTRA_SUBJECT ,
136153 getString (R .string .contact_support_email_subject , getString (R .string .app_name )));
137154 intent .putExtra (Intent .EXTRA_TEXT , getString (R .string .contact_support_email_body ));
138155
139- try {
156+ if ( intent . resolveActivity ( getPackageManager ()) != null ) {
140157 startActivity (Intent .createChooser (intent , getString (R .string .contact_support_title )));
141- } catch ( ActivityNotFoundException e ) {
158+ } else {
142159 Snackbar .make (binding .getRoot (), R .string .support_link_unavailable , Snackbar .LENGTH_SHORT ).show ();
143160 }
144161 }
145162
163+ public HelpViewModel getHelpViewModel () {
164+ return helpViewModel ;
165+ }
166+
146167 private void bindFaqItems (ActivityHelpBinding binding ) {
147168 LinearLayoutCompat faqList = binding .faqList ;
148169 faqList .removeAllViews ();
@@ -185,6 +206,73 @@ private void toggleFaqItem(ItemHelpFaqBinding binding) {
185206 ViewCompat .setStateDescription (binding .questionContainer , stateDescription );
186207 }
187208
209+ public static class FeedbackFragment extends PreferenceFragmentCompat {
210+
211+ @ Override
212+ public void onCreatePreferences (Bundle savedInstanceState , String rootKey ) {
213+ setPreferencesFromResource (R .xml .preferences_feedback , rootKey );
214+
215+ Preference feedbackPreference = findPreference (getString (R .string .key_feedback ));
216+ if (feedbackPreference != null ) {
217+ feedbackPreference .setOnPreferenceClickListener (preference -> {
218+ if (requireActivity () instanceof HelpActivity helpActivity ) {
219+ HelpViewModel vm = helpActivity .getHelpViewModel ();
220+
221+ vm .requestReviewFlow (new HelpRepository .OnReviewInfoListener () {
222+ @ Override
223+ public void onSuccess (ReviewInfo info ) {
224+ vm .launchReviewFlow (helpActivity , info );
225+ }
226+
227+ @ Override
228+ public void onFailure (Exception e ) {
229+ launchGooglePlayReviews ();
230+ }
231+ });
232+ }
233+ return true ;
234+ });
235+ }
236+ }
237+
238+ @ Override
239+ public void onViewCreated (@ NonNull View view , @ Nullable Bundle savedInstanceState ) {
240+ super .onViewCreated (view , savedInstanceState );
241+ RecyclerView listView = getListView ();
242+ listView .setNestedScrollingEnabled (false );
243+ listView .setOverScrollMode (View .OVER_SCROLL_NEVER );
244+ listView .setClipToPadding (false );
245+
246+ ViewGroup .LayoutParams layoutParams = listView .getLayoutParams ();
247+ FrameLayout .LayoutParams frameLayoutParams ;
248+ if (layoutParams instanceof FrameLayout .LayoutParams ) {
249+ frameLayoutParams = (FrameLayout .LayoutParams ) layoutParams ;
250+ } else {
251+ frameLayoutParams = new FrameLayout .LayoutParams (
252+ ViewGroup .LayoutParams .MATCH_PARENT ,
253+ ViewGroup .LayoutParams .WRAP_CONTENT
254+ );
255+ }
256+ frameLayoutParams .height = ViewGroup .LayoutParams .WRAP_CONTENT ;
257+ frameLayoutParams .width = ViewGroup .LayoutParams .MATCH_PARENT ;
258+ listView .setLayoutParams (frameLayoutParams );
259+ }
260+
261+ private void launchGooglePlayReviews () {
262+ Uri uri = Uri .parse ("https://play.google.com/store/apps/details?id=" + requireActivity ().getPackageName () + "&showAllReviews=true" );
263+ Intent intent = new Intent (Intent .ACTION_VIEW , uri );
264+ intent .addFlags (Intent .FLAG_ACTIVITY_NEW_TASK );
265+ try {
266+ startActivity (intent );
267+ } catch (ActivityNotFoundException e ) {
268+ Snackbar .make (requireView (),
269+ R .string .snack_unable_to_open_google_play_store ,
270+ Snackbar .LENGTH_SHORT )
271+ .show ();
272+ }
273+ }
274+ }
275+
188276 private static final class FaqItem {
189277 @ StringRes
190278 private final int questionResId ;
0 commit comments