diff --git a/app/src/main/java/org/thoughtcrime/securesms/help/HelpFragment.java b/app/src/main/java/org/thoughtcrime/securesms/help/HelpFragment.java index 1ab7498004..7fca33f3c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/help/HelpFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/help/HelpFragment.java @@ -6,8 +6,11 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; +import android.widget.Spinner; import android.widget.Toast; import androidx.annotation.IdRes; @@ -32,14 +35,16 @@ import java.util.List; public class HelpFragment extends LoggingFragment { - private EditText problem; - private CheckBox includeDebugLogs; - private View debugLogInfo; - private View faq; - private CircularProgressButton next; - private View toaster; - private List emoji; - private HelpViewModel helpViewModel; + private EditText problem; + private CheckBox includeDebugLogs; + private View debugLogInfo; + private View faq; + private CircularProgressButton next; + private View toaster; + private List emoji; + private HelpViewModel helpViewModel; + private Spinner categorySpinner; + private ArrayAdapter categoryAdapter; @Override public @Nullable View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -57,7 +62,7 @@ public class HelpFragment extends LoggingFragment { @Override public void onResume() { super.onResume(); - ((ApplicationPreferencesActivity) getActivity()).getSupportActionBar().setTitle(R.string.preferences__help); + ((ApplicationPreferencesActivity) requireActivity()).requireSupportActionBar().setTitle(R.string.preferences__help); cancelSpinning(next); problem.setEnabled(true); @@ -74,6 +79,7 @@ public class HelpFragment extends LoggingFragment { faq = view.findViewById(R.id.help_fragment_faq); next = view.findViewById(R.id.help_fragment_next); toaster = view.findViewById(R.id.help_fragment_next_toaster); + categorySpinner = view.findViewById(R.id.help_fragment_category); emoji = new ArrayList<>(Feeling.values().length); for (Feeling feeling : Feeling.values()) { @@ -81,6 +87,11 @@ public class HelpFragment extends LoggingFragment { emojiView.setImageEmoji(feeling.getEmojiCode()); emoji.add(view.findViewById(feeling.getViewId())); } + + categoryAdapter = ArrayAdapter.createFromResource(requireContext(), R.array.HelpFragment__categories, android.R.layout.simple_spinner_item); + categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + categorySpinner.setAdapter(categoryAdapter); } private void initializeListeners() { @@ -90,6 +101,16 @@ public class HelpFragment extends LoggingFragment { debugLogInfo.setOnClickListener(v -> launchDebugLogInfo()); next.setOnClickListener(v -> submitForm()); toaster.setOnClickListener(v -> Toast.makeText(requireContext(), R.string.HelpFragment__please_be_as_descriptive_as_possible, Toast.LENGTH_LONG).show()); + categorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + helpViewModel.onCategorySelected(position); + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); } private void initializeObservers() { @@ -144,6 +165,7 @@ public class HelpFragment extends LoggingFragment { .map(view -> Feeling.getByViewId(view.getId())) .findFirst().orElse(null); + CommunicationActions.openEmail(requireContext(), SupportEmailUtil.getSupportEmailAddress(requireContext()), getEmailSubject(), @@ -171,8 +193,11 @@ public class HelpFragment extends LoggingFragment { suffix.append(getString(feeling.getStringId())); } + String category = categoryAdapter.getItem(helpViewModel.getCategoryIndex()).toString(); + return SupportEmailUtil.generateSupportEmailBody(requireContext(), R.string.HelpFragment__signal_android_support_request, + " - " + category, problem.getText().toString() + "\n\n", suffix.toString()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/help/HelpViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/help/HelpViewModel.java index a526ab23b3..2311a51a27 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/help/HelpViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/help/HelpViewModel.java @@ -21,6 +21,7 @@ public class HelpViewModel extends ViewModel { private MutableLiveData problemMeetsLengthRequirements = new MutableLiveData<>(); private MutableLiveData hasLines = new MutableLiveData<>(false); private LiveData isFormValid = Transformations.map(new LiveDataPair<>(problemMeetsLengthRequirements, hasLines), this::transformValidationData); + private int categoryIndex = 0; private final SubmitDebugLogRepository submitDebugLogRepository; @@ -43,6 +44,14 @@ public class HelpViewModel extends ViewModel { problemMeetsLengthRequirements.setValue(problem.length() >= MINIMUM_PROBLEM_CHARS); } + void onCategorySelected(int index) { + this.categoryIndex = index; + } + + int getCategoryIndex() { + return this.categoryIndex; + } + LiveData onSubmitClicked(boolean includeDebugLogs) { MutableLiveData resultLiveData = new MutableLiveData<>(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SupportEmailUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SupportEmailUtil.java index 306f042c66..5d1212a977 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SupportEmailUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SupportEmailUtil.java @@ -27,21 +27,35 @@ public final class SupportEmailUtil { * Generates a support email body with system info near the top. */ public static @NonNull String generateSupportEmailBody(@NonNull Context context, - @StringRes int subject, + @StringRes int filter, @Nullable String prefix, @Nullable String suffix) { - prefix = Util.firstNonNull(prefix, ""); - suffix = Util.firstNonNull(suffix, ""); - return String.format("%s\n%s\n%s", prefix, buildSystemInfo(context, subject), suffix); + return generateSupportEmailBody(context, filter, null, prefix, suffix); } - private static @NonNull String buildSystemInfo(@NonNull Context context, @StringRes int subject) { + /** + * Generates a support email body with system info near the top. + */ + public static @NonNull String generateSupportEmailBody(@NonNull Context context, + @StringRes int filter, + @Nullable String filterSuffix, + @Nullable String prefix, + @Nullable String suffix) + { + filterSuffix = Util.emptyIfNull(filterSuffix); + prefix = Util.emptyIfNull(prefix); + suffix = Util.emptyIfNull(suffix); + + return String.format("%s\n%s\n%s", prefix, buildSystemInfo(context, filter, filterSuffix), suffix); + } + + private static @NonNull String buildSystemInfo(@NonNull Context context, @StringRes int filter, @NonNull String filterSuffix) { Resources englishResources = ResourceUtil.getEnglishResources(context); return "--- " + context.getString(R.string.HelpFragment__support_info) + " ---" + "\n" + - context.getString(R.string.SupportEmailUtil_filter) + " " + englishResources.getString(subject) + + context.getString(R.string.SupportEmailUtil_filter) + " " + englishResources.getString(filter) + filterSuffix + "\n" + context.getString(R.string.SupportEmailUtil_device_info) + " " + getDeviceInfo() + "\n" + diff --git a/app/src/main/res/layout/help_fragment.xml b/app/src/main/res/layout/help_fragment.xml index 8451d6044b..af587ff7b2 100644 --- a/app/src/main/res/layout/help_fragment.xml +++ b/app/src/main/res/layout/help_fragment.xml @@ -54,48 +54,43 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/help_fragment_contact" /> - + app:layout_constraintTop_toBottomOf="@id/help_fragment_problem" /> -