Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ android {
applicationId 'com.d4rk.androidtutorials.java'
minSdk 23
targetSdk 36
versionCode 50
versionCode 51
versionName '5.0.2'
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,18 @@
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.LinearLayoutCompat;
import androidx.core.view.ViewCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.d4rk.androidtutorials.java.BuildConfig;
import com.d4rk.androidtutorials.java.R;
Expand All @@ -43,7 +38,9 @@
@AndroidEntryPoint
public class HelpActivity extends BaseActivity {

private ActivityHelpBinding binding;
private HelpViewModel helpViewModel;
private final Handler handler = new Handler(Looper.getMainLooper());
private static final List<FaqItem> FAQ_ITEMS = Arrays.asList(
new FaqItem(R.string.question_1, R.string.summary_preference_faq_1),
new FaqItem(R.string.question_2, R.string.summary_preference_faq_2),
Expand All @@ -59,22 +56,17 @@ public class HelpActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityHelpBinding binding = ActivityHelpBinding.inflate(getLayoutInflater());
binding = ActivityHelpBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
AdUtils.loadBanner(binding.faqNativeAd);
helpViewModel = new ViewModelProvider(this).get(HelpViewModel.class);
new FastScrollerBuilder(binding.scrollView)
.useMd2Style()
.build();
bindFaqItems(binding);

getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_layout_feedback, new FeedbackFragment())
.commit();
}

public HelpViewModel getHelpViewModel() {
return helpViewModel;
setupContactSupportCard();
setupFeedbackFab();
handler.postDelayed(() -> binding.fabContactSupport.shrink(), 5000L);
}

@Override
Expand Down Expand Up @@ -141,73 +133,66 @@ private void openLink(String url) {
startActivity(browserIntent);
}

public static class FeedbackFragment extends PreferenceFragmentCompat {

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences_feedback, rootKey);

Preference feedbackPreference = findPreference(getString(R.string.key_feedback));
if (feedbackPreference != null) {
feedbackPreference.setOnPreferenceClickListener(preference -> {
if (requireActivity() instanceof HelpActivity helpActivity) {
HelpViewModel vm = helpActivity.getHelpViewModel();
private void setupContactSupportCard() {
binding.contactSupportCard.setOnClickListener(v -> openSupportEmail());
}

vm.requestReviewFlow(new HelpRepository.OnReviewInfoListener() {
@Override
public void onSuccess(ReviewInfo info) {
vm.launchReviewFlow(helpActivity, info);
}
private void setupFeedbackFab() {
binding.fabContactSupport.setOnClickListener(v -> requestReview());
binding.fabContactSupport.setContentDescription(getString(R.string.send_feedback));
}

@Override
public void onFailure(Exception e) {
launchGooglePlayReviews();
}
});
}
return true;
});
}
private void openSupportEmail() {
String supportEmail = getString(R.string.contact_support_email);
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.fromParts("mailto", supportEmail, null));
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{supportEmail});
intent.putExtra(Intent.EXTRA_SUBJECT,
getString(R.string.contact_support_email_subject, getString(R.string.app_name)));
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.contact_support_email_body));

if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(Intent.createChooser(intent, getString(R.string.contact_support_title)));
} else {
Snackbar.make(binding.getRoot(), R.string.support_link_unavailable, Snackbar.LENGTH_SHORT).show();
}
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
RecyclerView listView = getListView();
listView.setNestedScrollingEnabled(false);
listView.setOverScrollMode(View.OVER_SCROLL_NEVER);
listView.setClipToPadding(false);

ViewGroup.LayoutParams layoutParams = listView.getLayoutParams();
FrameLayout.LayoutParams frameLayoutParams;
if (layoutParams instanceof FrameLayout.LayoutParams) {
frameLayoutParams = (FrameLayout.LayoutParams) layoutParams;
} else {
frameLayoutParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
private void requestReview() {
binding.fabContactSupport.setEnabled(false);
helpViewModel.requestReviewFlow(new HelpRepository.OnReviewInfoListener() {
@Override
public void onSuccess(ReviewInfo info) {
helpViewModel.launchReviewFlow(HelpActivity.this, info);
binding.fabContactSupport.setEnabled(true);
}
frameLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
frameLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
listView.setLayoutParams(frameLayoutParams);
}

private void launchGooglePlayReviews() {
Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=" + requireActivity().getPackageName() + "&showAllReviews=true");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Snackbar.make(requireView(),
R.string.snack_unable_to_open_google_play_store,
Snackbar.LENGTH_SHORT)
.show();
@Override
public void onFailure(Exception e) {
binding.fabContactSupport.setEnabled(true);
launchGooglePlayReviews();
}
});
}

private void launchGooglePlayReviews() {
Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName() + "&showAllReviews=true");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Snackbar.make(binding.getRoot(),
R.string.snack_unable_to_open_google_play_store,
Snackbar.LENGTH_SHORT)
.show();
}
}

public HelpViewModel getHelpViewModel() {
return helpViewModel;
}

private void bindFaqItems(ActivityHelpBinding binding) {
LinearLayoutCompat faqList = binding.faqList;
faqList.removeAllViews();
Expand Down Expand Up @@ -261,4 +246,10 @@ private FaqItem(@StringRes int questionResId, @StringRes int answerResId) {
this.answerResId = answerResId;
}
}
}

@Override
protected void onDestroy() {
handler.removeCallbacksAndMessages(null);
super.onDestroy();
}
}
11 changes: 11 additions & 0 deletions app/src/main/res/drawable/bg_contact_support_icon.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="289dp"
android:height="289dp"
android:viewportWidth="289"
android:viewportHeight="289">

<path
android:fillColor="?attr/colorSecondaryContainer"
android:pathData="M3.2,160.9c-3.9-6.6-4.2-14.7-0.8-21.6l4.8-9.7c2-4.1,2.8-8.8,2.1-13.3l-1.6-10.7C6.6,98,9.4,90.4,15.2,85.3 l8.1-7.1c3.4-3,5.9-7,7-11.5L33,56.2c1.9-7.5,7.4-13.4,14.7-15.9l10.2-3.5c4.4-1.5,8.2-4.2,10.9-7.9l6.4-8.7 c4.6-6.2,12-9.6,19.7-9.1l10.8,0.7c4.6,0.3,9.2-0.8,13.1-3.1l9.3-5.5c6.6-3.9,14.7-4.3,21.6-0.8l9.7,4.8c4.1,2,8.8,2.8,13.3,2.1 l10.7-1.6c7.6-1.1,15.2,1.7,20.3,7.5l7.1,8.1c3,3.4,7,5.9,11.5,7l10.5,2.7c7.5,1.9,13.4,7.4,15.9,14.7l3.5,10.2 c1.5,4.4,4.2,8.2,7.9,10.9l8.7,6.4c6.2,4.6,9.6,12,9.1,19.7l-0.7,10.8c-0.3,4.6,0.8,9.2,3.1,13.1l5.5,9.3c3.9,6.6,4.2,14.7,0.8,21.6 l-4.8,9.7c-2,4.1-2.8,8.8-2.1,13.3l1.6,10.7c1.1,7.6-1.7,15.2-7.5,20.3l-8.1,7.1c-3.4,3-5.9,7-7,11.5l-2.7,10.5 c-1.9,7.5-7.4,13.4-14.7,15.9l-10.2,3.5c-4.4,1.5-8.2,4.2-10.9,7.9l-6.4,8.7c-4.6,6.2-12,9.6-19.7,9.1l-10.8-0.7 c-4.6-0.3-9.2,0.8-13.1,3.1l-9.3,5.5c-6.6,3.9-14.7,4.3-21.6,0.8l-9.7-4.8c-4.1-2-8.8-2.8-13.3-2.1l-10.7,1.6 c-7.6,1.1-15.2-1.7-20.3-7.5l-7.1-8.1c-3-3.4-7-5.9-11.5-7L56.2,256c-7.5-1.9-13.4-7.4-15.9-14.7l-3.5-10.2 c-1.5-4.4-4.2-8.2-7.9-10.9l-8.7-6.4c-6.2-4.6-9.6-12-9.1-19.7l0.7-10.8c0.3-4.6-0.8-9.2-3.1-13.1L3.2,160.9L3.2,160.9z" />
</vector>
11 changes: 11 additions & 0 deletions app/src/main/res/drawable/ic_contact_support.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">

<path
android:fillColor="#000000"
android:pathData="M12,2C6.48,2,2,6.48,2,12c0,5.52,4.48,10,10,10s10-4.48,10-10C22,6.48,17.52,2,12,2z M19.46,9.12l-2.78,1.15 c-0.51-1.36-1.58-2.44-2.95-2.94l1.15-2.78C16.98,5.35,18.65,7.02,19.46,9.12z M12,15c-1.66,0-3-1.34-3-3s1.34-3,3-3s3,1.34,3,3 S13.66,15,12,15z M9.13,4.54l1.17,2.78c-1.38,0.5-2.47,1.59-2.98,2.97L4.54,9.13C5.35,7.02,7.02,5.35,9.13,4.54z M4.54,14.87 l2.78-1.15c0.51,1.38,1.59,2.46,2.97,2.96l-1.17,2.78C7.02,18.65,5.35,16.98,4.54,14.87z M14.88,19.46l-1.15-2.78 c1.37-0.51,2.45-1.59,2.95-2.97l2.78,1.17C18.65,16.98,16.98,18.65,14.88,19.46z" />
</vector>
81 changes: 74 additions & 7 deletions app/src/main/res/layout/activity_help.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
Expand Down Expand Up @@ -37,7 +36,6 @@
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.CardViewTopRoundedFilled">

<androidx.appcompat.widget.LinearLayoutCompat
Expand All @@ -51,16 +49,85 @@
android:id="@+id/faq_native_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:layout_marginVertical="2dp"
app:nativeAdLayout="@layout/ad_help" />

<FrameLayout
android:id="@+id/frame_layout_feedback"
<com.google.android.material.card.MaterialCardView
android:id="@+id/contact_support_card"
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackground"
app:cardBackgroundColor="?attr/colorSurfaceVariant"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.CardViewBottomRoundedFilled">

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="20dp"
android:paddingTop="20dp"
android:paddingEnd="20dp"
android:paddingBottom="20dp">

<FrameLayout
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_contact_support_icon"
android:padding="12dp">

<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:src="@drawable/ic_contact_support"
android:tint="?attr/colorOnSecondaryContainer" />

</FrameLayout>

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:orientation="vertical">

<com.google.android.material.textview.MaterialTextView
android:id="@+id/contact_support_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/contact_support_title"
android:textAppearance="@style/TextAppearance.Material3.TitleMedium" />

<com.google.android.material.textview.MaterialTextView
android:id="@+id/contact_support_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/contact_support_description"
android:textAppearance="@style/TextAppearance.Material3.BodyMedium" />

</androidx.appcompat.widget.LinearLayoutCompat>

</androidx.appcompat.widget.LinearLayoutCompat>

</com.google.android.material.card.MaterialCardView>

</androidx.appcompat.widget.LinearLayoutCompat>

</me.zhanghai.android.fastscroll.FastScrollScrollView>

<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/fab_contact_support"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="@string/send_feedback"
app:icon="@drawable/ic_rate_review"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
3 changes: 2 additions & 1 deletion app/src/main/res/layout/ad_help.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
android:layout_height="wrap_content">

<com.google.android.material.card.MaterialCardView
android:id="@+id/ad_card"
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.CardViewBottomRoundedFilled">
app:cardCornerRadius="4dp">

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/res/layout/item_help_faq.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,17 @@
android:paddingVertical="12dp"
tools:targetApi="31">

<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/question_icon"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginHorizontal="4dp"
app:contentPadding="6dp"
android:src="@drawable/ic_feedback"
android:background="?attr/colorPrimaryContainer"
app:shapeAppearanceOverlay="@style/ShapeAppearance.Material3.Corner.Full"
app:tint="?attr/colorOnSurfaceVariant" />

<com.google.android.material.textview.MaterialTextView
android:id="@+id/question"
android:layout_width="0dp"
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values-ar-rEG/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,10 @@
<string name="help">مساعدة</string>
<string name="faq">الأسئلة الشائعة</string>
<string name="send_feedback">إرسال رأيك</string>
<string name="contact_support_title">التواصل مع الدعم</string>
<string name="contact_support_description">شارك التفاصيل للحصول على المساعدة في تحقيق هدفك</string>
<string name="contact_support_email_subject">طلب دعم لـ %1$s</string>
<string name="contact_support_email_body">مرحبًا بالفريق،\n\nيُرجى وصف هدفك وأي مشكلات تواجهها حتى نتمكن من مساعدتك.</string>
<string name="license">الترخيص</string>
<string name="share">مشاركة</string>
<string name="share_subject">جربه الآن.</string>
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values-bg-rBG/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,10 @@
<string name="help">Помощ</string>
<string name="faq">Често задавани въпроси</string>
<string name="send_feedback">Изпращане на обратна връзка</string>
<string name="contact_support_title">Свържете се с поддръжката</string>
<string name="contact_support_description">Споделете подробности, за да получите помощ за постигане на целта си</string>
<string name="contact_support_email_subject">Заявка за поддръжка за %1$s</string>
<string name="contact_support_email_body">Здравейте, екип,\n\nМоля, опишете своята цел и всички проблеми, с които се сблъсквате, за да можем да помогнем.</string>
<string name="license">Лиценз</string>
<string name="share">Споделяне</string>
<string name="share_subject">Опитайте сега.</string>
Expand Down
Loading