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 .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ jobs:
run: chmod +x gradlew

- name: Build & run all tests
run: ./gradlew build --stacktrace --info
run: ./gradlew build
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,69 @@
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
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;
import com.d4rk.androidtutorials.java.ads.AdUtils;
import com.d4rk.androidtutorials.java.databinding.ActivityHelpBinding;
import com.d4rk.androidtutorials.java.databinding.DialogVersionInfoBinding;
import com.d4rk.androidtutorials.java.databinding.ItemHelpFaqBinding;
import com.d4rk.androidtutorials.java.ui.components.navigation.BaseActivity;
import com.d4rk.androidtutorials.java.ui.screens.help.repository.HelpRepository;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
import com.d4rk.androidtutorials.java.utils.OpenSourceLicensesUtils;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.play.core.review.ReviewInfo;

import dagger.hilt.android.AndroidEntryPoint;
import me.zhanghai.android.fastscroll.FastScrollerBuilder;

import java.util.Arrays;
import java.util.List;

@AndroidEntryPoint
public class HelpActivity extends BaseActivity {

private HelpViewModel helpViewModel;
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),
new FaqItem(R.string.question_3, R.string.summary_preference_faq_3),
new FaqItem(R.string.question_4, R.string.summary_preference_faq_4),
new FaqItem(R.string.question_5, R.string.summary_preference_faq_5),
new FaqItem(R.string.question_6, R.string.summary_preference_faq_6),
new FaqItem(R.string.question_7, R.string.summary_preference_faq_7),
new FaqItem(R.string.question_8, R.string.summary_preference_faq_8),
new FaqItem(R.string.question_9, R.string.summary_preference_faq_9)
);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityHelpBinding binding = ActivityHelpBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
EdgeToEdgeDelegate.apply(this, binding.getRoot());
AdUtils.loadBanner(binding.faqNativeAd);
helpViewModel = new ViewModelProvider(this).get(HelpViewModel.class);
new FastScrollerBuilder(binding.scrollContainer)
new FastScrollerBuilder(binding.scrollView)
.useMd2Style()
.build();
getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_layout_faq, new FaqFragment())
.commit();
bindFaqItems(binding);

getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_layout_feedback, new FeedbackFragment())
Expand Down Expand Up @@ -121,13 +141,6 @@ private void openLink(String url) {
startActivity(browserIntent);
}

public static class FaqFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences_faq, rootKey);
}
}

public static class FeedbackFragment extends PreferenceFragmentCompat {

@Override
Expand Down Expand Up @@ -157,6 +170,29 @@ public void onFailure(Exception e) {
}
}

@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
);
}
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);
Expand All @@ -171,4 +207,58 @@ private void launchGooglePlayReviews() {
}
}
}

private void bindFaqItems(ActivityHelpBinding binding) {
LinearLayoutCompat faqList = binding.faqList;
faqList.removeAllViews();
LayoutInflater inflater = LayoutInflater.from(this);

for (int i = 0; i < FAQ_ITEMS.size(); i++) {
FaqItem item = FAQ_ITEMS.get(i);
ItemHelpFaqBinding itemBinding = ItemHelpFaqBinding.inflate(inflater, faqList, false);
itemBinding.question.setText(item.questionResId);
itemBinding.answer.setText(item.answerResId);
itemBinding.answer.setVisibility(View.GONE);
itemBinding.toggleIcon.setRotation(0f);
CharSequence questionText = itemBinding.question.getText();
itemBinding.getRoot().setContentDescription(questionText);
itemBinding.questionContainer.setContentDescription(questionText);
ViewCompat.setStateDescription(itemBinding.getRoot(), getString(R.string.faq_state_collapsed));
ViewCompat.setStateDescription(itemBinding.questionContainer, getString(R.string.faq_state_collapsed));

View.OnClickListener toggleListener = v -> toggleFaqItem(itemBinding);
itemBinding.getRoot().setOnClickListener(toggleListener);
itemBinding.questionContainer.setOnClickListener(toggleListener);
itemBinding.toggleIcon.setOnClickListener(toggleListener);
itemBinding.divider.setVisibility(i == FAQ_ITEMS.size() - 1 ? View.GONE : View.VISIBLE);
faqList.addView(itemBinding.getRoot());
}
}

private void toggleFaqItem(ItemHelpFaqBinding binding) {
boolean expand = binding.answer.getVisibility() != View.VISIBLE;
binding.answer.setVisibility(expand ? View.VISIBLE : View.GONE);
float rotation = expand ? 180f : 0f;
binding.toggleIcon.animate().cancel();
binding.toggleIcon.animate()
.rotation(rotation)
.setDuration(200L)
.start();
int stateRes = expand ? R.string.faq_state_expanded : R.string.faq_state_collapsed;
CharSequence stateDescription = getString(stateRes);
ViewCompat.setStateDescription(binding.getRoot(), stateDescription);
ViewCompat.setStateDescription(binding.questionContainer, stateDescription);
}

private static final class FaqItem {
@StringRes
private final int questionResId;
@StringRes
private final int answerResId;

private FaqItem(@StringRes int questionResId, @StringRes int answerResId) {
this.questionResId = questionResId;
this.answerResId = answerResId;
}
}
}
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/ic_expand_more_24.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?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="@android:color/white"
android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z" />
</vector>
87 changes: 49 additions & 38 deletions app/src/main/res/layout/activity_help.xml
Original file line number Diff line number Diff line change
@@ -1,55 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<me.zhanghai.android.fastscroll.FastScrollScrollView
<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/scroll_container"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:id="@+id/container"
<me.zhanghai.android.fastscroll.FastScrollScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_height="0dp"
android:clipToPadding="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">

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

<com.google.android.material.card.MaterialCardView
android:id="@+id/card_view_faq"
style="@style/Widget.Material3.CardView.Filled"
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:shapeAppearance="@style/ShapeAppearanceOverlay.CardViewTopRoundedFilled">
android:orientation="vertical"
android:paddingStart="24dp"
android:paddingTop="16dp"
android:paddingEnd="24dp"
android:paddingBottom="32dp">

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

<LinearLayout
<com.google.android.material.card.MaterialCardView
android:id="@+id/card_view_faq"
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="12dp">
<FrameLayout
android:id="@+id/frame_layout_faq"
android:layout_marginBottom="2dp"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.CardViewTopRoundedFilled">

<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/faq_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
android:layout_height="wrap_content"
android:orientation="vertical" />
</com.google.android.material.card.MaterialCardView>

<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
android:id="@+id/faq_native_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
app:nativeAdLayout="@layout/ad_help" />
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
android:id="@+id/faq_native_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
app:nativeAdLayout="@layout/ad_help" />

<FrameLayout
android:id="@+id/frame_layout_feedback"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/frame_layout_feedback"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</androidx.appcompat.widget.LinearLayoutCompat>

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

</LinearLayout>
</me.zhanghai.android.fastscroll.FastScrollScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
2 changes: 1 addition & 1 deletion app/src/main/res/layout/ad_help.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:shapeAppearance="@style/ShapeAppearanceOverlay.CardViewBottomRoundedFilled">
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.CardViewBottomRoundedFilled">

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
Expand Down
Loading
Loading