44import android .content .Intent ;
55import android .net .Uri ;
66import android .os .Bundle ;
7+ import android .os .Handler ;
8+ import android .os .Looper ;
79import android .view .LayoutInflater ;
810import android .view .Menu ;
911import android .view .MenuItem ;
1012import android .view .View ;
11- import android .view .ViewGroup ;
12- import android .widget .FrameLayout ;
1313import androidx .annotation .NonNull ;
14- import androidx .annotation .Nullable ;
1514import androidx .annotation .StringRes ;
1615import androidx .appcompat .app .AlertDialog ;
1716import androidx .appcompat .widget .LinearLayoutCompat ;
1817import androidx .core .view .ViewCompat ;
1918import androidx .lifecycle .ViewModelProvider ;
20- import androidx .preference .Preference ;
21- import androidx .preference .PreferenceFragmentCompat ;
22- import androidx .recyclerview .widget .RecyclerView ;
2319
2420import com .d4rk .androidtutorials .java .BuildConfig ;
2521import com .d4rk .androidtutorials .java .R ;
@@ -44,6 +40,7 @@ public class HelpActivity extends BaseActivity {
4440
4541 private ActivityHelpBinding binding ;
4642 private HelpViewModel helpViewModel ;
43+ private final Handler handler = new Handler (Looper .getMainLooper ());
4744 private static final List <FaqItem > FAQ_ITEMS = Arrays .asList (
4845 new FaqItem (R .string .question_1 , R .string .summary_preference_faq_1 ),
4946 new FaqItem (R .string .question_2 , R .string .summary_preference_faq_2 ),
@@ -68,12 +65,8 @@ protected void onCreate(Bundle savedInstanceState) {
6865 .build ();
6966 bindFaqItems (binding );
7067 setupContactSupportCard ();
71-
72- if (savedInstanceState == null ) {
73- getSupportFragmentManager ().beginTransaction ()
74- .replace (R .id .frame_layout_feedback , new FeedbackFragment ())
75- .commit ();
76- }
68+ setupFeedbackFab ();
69+ handler .postDelayed (() -> binding .fabContactSupport .shrink (), 5000L );
7770 }
7871
7972 @ Override
@@ -144,6 +137,11 @@ private void setupContactSupportCard() {
144137 binding .contactSupportCard .setOnClickListener (v -> openSupportEmail ());
145138 }
146139
140+ private void setupFeedbackFab () {
141+ binding .fabContactSupport .setOnClickListener (v -> requestReview ());
142+ binding .fabContactSupport .setContentDescription (getString (R .string .send_feedback ));
143+ }
144+
147145 private void openSupportEmail () {
148146 String supportEmail = getString (R .string .contact_support_email );
149147 Intent intent = new Intent (Intent .ACTION_SENDTO );
@@ -160,6 +158,37 @@ private void openSupportEmail() {
160158 }
161159 }
162160
161+ private void requestReview () {
162+ binding .fabContactSupport .setEnabled (false );
163+ helpViewModel .requestReviewFlow (new HelpRepository .OnReviewInfoListener () {
164+ @ Override
165+ public void onSuccess (ReviewInfo info ) {
166+ helpViewModel .launchReviewFlow (HelpActivity .this , info );
167+ binding .fabContactSupport .setEnabled (true );
168+ }
169+
170+ @ Override
171+ public void onFailure (Exception e ) {
172+ binding .fabContactSupport .setEnabled (true );
173+ launchGooglePlayReviews ();
174+ }
175+ });
176+ }
177+
178+ private void launchGooglePlayReviews () {
179+ Uri uri = Uri .parse ("https://play.google.com/store/apps/details?id=" + getPackageName () + "&showAllReviews=true" );
180+ Intent intent = new Intent (Intent .ACTION_VIEW , uri );
181+ intent .addFlags (Intent .FLAG_ACTIVITY_NEW_TASK );
182+ try {
183+ startActivity (intent );
184+ } catch (ActivityNotFoundException e ) {
185+ Snackbar .make (binding .getRoot (),
186+ R .string .snack_unable_to_open_google_play_store ,
187+ Snackbar .LENGTH_SHORT )
188+ .show ();
189+ }
190+ }
191+
163192 public HelpViewModel getHelpViewModel () {
164193 return helpViewModel ;
165194 }
@@ -206,73 +235,6 @@ private void toggleFaqItem(ItemHelpFaqBinding binding) {
206235 ViewCompat .setStateDescription (binding .questionContainer , stateDescription );
207236 }
208237
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-
276238 private static final class FaqItem {
277239 @ StringRes
278240 private final int questionResId ;
@@ -284,4 +246,10 @@ private FaqItem(@StringRes int questionResId, @StringRes int answerResId) {
284246 this .answerResId = answerResId ;
285247 }
286248 }
287- }
249+
250+ @ Override
251+ protected void onDestroy () {
252+ handler .removeCallbacksAndMessages (null );
253+ super .onDestroy ();
254+ }
255+ }
0 commit comments