mirror of https://github.com/tasks/tasks
New 'Help & feedback' menu
parent
ab793e3dd4
commit
bfa865e0c8
@ -0,0 +1,72 @@
|
||||
package org.tasks.injection
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.DialogInterface
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceGroup
|
||||
import com.jakewharton.processphoenix.ProcessPhoenix
|
||||
import com.todoroo.astrid.activity.MainActivity
|
||||
import com.todoroo.astrid.api.Filter
|
||||
import org.tasks.R
|
||||
import org.tasks.dialogs.DialogBuilder
|
||||
import org.tasks.preferences.Device
|
||||
import javax.inject.Inject
|
||||
|
||||
abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() {
|
||||
|
||||
@Inject lateinit var device: Device
|
||||
@Inject lateinit var dialogBuilder: DialogBuilder
|
||||
|
||||
private var injected = false
|
||||
|
||||
override fun onAttach(activity: Activity) {
|
||||
super.onAttach(activity)
|
||||
if (!injected) {
|
||||
inject((activity as InjectingActivity).component.plus(FragmentModule(this)))
|
||||
injected = true
|
||||
}
|
||||
}
|
||||
|
||||
protected open fun showRestartDialog() {
|
||||
dialogBuilder
|
||||
.newDialog()
|
||||
.setMessage(R.string.restart_required)
|
||||
.setPositiveButton(R.string.restart_now) { _: DialogInterface?, _: Int ->
|
||||
val nextIntent = Intent(context, MainActivity::class.java)
|
||||
nextIntent.putExtra(MainActivity.OPEN_FILTER, null as Filter?)
|
||||
ProcessPhoenix.triggerRebirth(context, nextIntent)
|
||||
}
|
||||
.setNegativeButton(R.string.restart_later, null)
|
||||
.show()
|
||||
}
|
||||
|
||||
protected fun requires(@StringRes prefGroup: Int, check: Boolean, vararg resIds: Int) {
|
||||
if (!check) {
|
||||
remove(findPreference(prefGroup) as PreferenceGroup, resIds)
|
||||
}
|
||||
}
|
||||
|
||||
protected fun remove(vararg resIds: Int) {
|
||||
remove(preferenceScreen, resIds)
|
||||
}
|
||||
|
||||
private fun remove(preferenceGroup: PreferenceGroup, resIds: IntArray) {
|
||||
for (resId in resIds) {
|
||||
preferenceGroup.removePreference(findPreference(resId))
|
||||
}
|
||||
}
|
||||
|
||||
protected fun recreate() {
|
||||
activity!!.recreate()
|
||||
}
|
||||
|
||||
protected fun findPreference(@StringRes prefId: Int): Preference {
|
||||
return findPreference(getString(prefId))!!
|
||||
}
|
||||
|
||||
protected abstract fun inject(component: FragmentComponent)
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
package org.tasks.preferences
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import org.tasks.R
|
||||
import org.tasks.databinding.ActivityPreferencesBinding
|
||||
import org.tasks.injection.ActivityComponent
|
||||
import org.tasks.injection.ThemedInjectingAppCompatActivity
|
||||
import org.tasks.preferences.fragments.HelpAndFeedback
|
||||
import org.tasks.ui.MenuColorizer
|
||||
|
||||
private const val EXTRA_TITLE = "extra_title"
|
||||
|
||||
class HelpAndFeedback : ThemedInjectingAppCompatActivity(),
|
||||
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
|
||||
|
||||
lateinit var toolbar: Toolbar
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val binding = ActivityPreferencesBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
toolbar = binding.toolbar.toolbar
|
||||
if (savedInstanceState == null) {
|
||||
supportFragmentManager
|
||||
.beginTransaction()
|
||||
.replace(R.id.settings, HelpAndFeedback())
|
||||
.commit()
|
||||
toolbar.title = getString(R.string.help_and_feedback)
|
||||
} else {
|
||||
toolbar.title = savedInstanceState.getCharSequence(EXTRA_TITLE)
|
||||
}
|
||||
supportFragmentManager.addOnBackStackChangedListener {
|
||||
if (supportFragmentManager.backStackEntryCount == 0) {
|
||||
toolbar.title = getString(R.string.help_and_feedback)
|
||||
}
|
||||
}
|
||||
toolbar.navigationIcon = ContextCompat.getDrawable(this, R.drawable.ic_outline_arrow_back_24px);
|
||||
toolbar.setNavigationOnClickListener { onBackPressed() }
|
||||
MenuColorizer.colorToolbar(this, toolbar)
|
||||
}
|
||||
|
||||
override fun inject(component: ActivityComponent) {
|
||||
component.inject(this)
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
outState.putCharSequence(EXTRA_TITLE, toolbar.title)
|
||||
}
|
||||
|
||||
override fun onSupportNavigateUp(): Boolean {
|
||||
if (supportFragmentManager.popBackStackImmediate()) {
|
||||
return true
|
||||
}
|
||||
return super.onSupportNavigateUp()
|
||||
}
|
||||
|
||||
override fun onPreferenceStartFragment(
|
||||
caller: PreferenceFragmentCompat,
|
||||
pref: Preference
|
||||
): Boolean {
|
||||
val args = pref.extras
|
||||
val fragment = supportFragmentManager.fragmentFactory.instantiate(
|
||||
classLoader,
|
||||
pref.fragment
|
||||
).apply {
|
||||
arguments = args
|
||||
setTargetFragment(caller, 0)
|
||||
}
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.settings, fragment)
|
||||
.addToBackStack(null)
|
||||
.commit()
|
||||
toolbar.title = pref.title
|
||||
return true
|
||||
}
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
package org.tasks.preferences.fragments
|
||||
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import org.tasks.BuildConfig
|
||||
import org.tasks.R
|
||||
import org.tasks.billing.BillingClient
|
||||
import org.tasks.billing.Inventory
|
||||
import org.tasks.injection.FragmentComponent
|
||||
import org.tasks.injection.InjectingPreferenceFragment
|
||||
import javax.inject.Inject
|
||||
|
||||
class HelpAndFeedback : InjectingPreferenceFragment() {
|
||||
|
||||
@Inject lateinit var billingClient: BillingClient
|
||||
@Inject lateinit var inventory: Inventory
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.help_and_feedback, rootKey)
|
||||
|
||||
findPreference(R.string.changelog).summary = getString(R.string.version_string, BuildConfig.VERSION_NAME)
|
||||
|
||||
findPreference(R.string.contact_developer)
|
||||
.setOnPreferenceClickListener {
|
||||
val uri = Uri.fromParts("mailto", "Alex <" + getString(R.string.support_email) + ">", null)
|
||||
val intent = Intent(Intent.ACTION_SENDTO, uri)
|
||||
.putExtra(Intent.EXTRA_SUBJECT, "Tasks Feedback")
|
||||
.putExtra(Intent.EXTRA_TEXT, device.debugInfo)
|
||||
startActivity(intent)
|
||||
false
|
||||
}
|
||||
|
||||
findPreference(R.string.refresh_purchases)
|
||||
.setOnPreferenceClickListener {
|
||||
billingClient.queryPurchases()
|
||||
false
|
||||
}
|
||||
|
||||
findPreference(R.string.p_collect_statistics)
|
||||
.setOnPreferenceClickListener {
|
||||
showRestartDialog()
|
||||
true
|
||||
}
|
||||
|
||||
if (inventory.hasPro()) {
|
||||
val findPreference = findPreference(R.string.upgrade_to_pro)
|
||||
findPreference.title = getString(R.string.manage_subscription)
|
||||
findPreference.summary = getString(R.string.manage_subscription_summary)
|
||||
}
|
||||
|
||||
@Suppress("ConstantConditionIf")
|
||||
if (BuildConfig.FLAVOR == "generic") {
|
||||
remove(R.string.p_collect_statistics,
|
||||
R.string.rate_tasks,
|
||||
R.string.upgrade_to_pro,
|
||||
R.string.refresh_purchases)
|
||||
}
|
||||
}
|
||||
|
||||
override fun inject(component: FragmentComponent) {
|
||||
component.inject(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
<vector android:autoMirrored="true" android:height="24dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M19,8l-4,4h3c0,3.31 -2.69,6 -6,6 -1.01,0 -1.97,-0.25 -2.8,-0.7l-1.46,1.46C8.97,19.54 10.43,20 12,20c4.42,0 8,-3.58 8,-8h3l-4,-4zM6,12c0,-3.31 2.69,-6 6,-6 1.01,0 1.97,0.25 2.8,0.7l1.46,-1.46C15.03,4.46 13.57,4 12,4c-4.42,0 -8,3.58 -8,8H1l4,4 4,-4H6z"/>
|
||||
</vector>
|
@ -0,0 +1,5 @@
|
||||
<vector android:autoMirrored="true" android:height="23.470589dp"
|
||||
android:viewportHeight="133" android:viewportWidth="136"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#181717" android:pathData="M67.867,-0C30.388,-0 -0,30.387 -0,67.875C-0,97.862 19.446,123.3 46.417,132.279C49.813,132.9 51.05,130.804 51.05,129.004C51.05,127.395 50.992,123.125 50.958,117.462C32.079,121.562 28.096,108.362 28.096,108.362C25.008,100.525 20.558,98.437 20.558,98.437C14.396,94.225 21.025,94.308 21.025,94.308C27.837,94.791 31.421,101.304 31.421,101.304C37.475,111.675 47.308,108.679 51.175,106.945C51.792,102.558 53.542,99.566 55.483,97.87C40.413,96.158 24.567,90.333 24.567,64.325C24.567,56.916 27.213,50.858 31.554,46.112C30.854,44.395 28.525,37.495 32.217,28.15C32.217,28.15 37.917,26.325 50.883,35.108C56.296,33.604 62.104,32.85 67.875,32.825C73.638,32.85 79.446,33.604 84.867,35.108C97.825,26.325 103.513,28.15 103.513,28.15C107.217,37.495 104.888,44.395 104.188,46.112C108.538,50.858 111.167,56.916 111.167,64.325C111.167,90.4 95.296,96.137 80.175,97.816C82.613,99.912 84.783,104.054 84.783,110.387C84.783,119.458 84.7,126.779 84.7,129.004C84.7,130.82 85.921,132.933 89.367,132.27C116.317,123.275 135.746,97.854 135.746,67.875C135.746,30.387 105.354,-0 67.867,-0"/>
|
||||
</vector>
|
@ -0,0 +1,5 @@
|
||||
<vector android:autoMirrored="true" android:height="24dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M12,6c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2m0,9c2.7,0 5.8,1.29 6,2v1L6,18v-0.99c0.2,-0.72 3.3,-2.01 6,-2.01m0,-11C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3c0,-2.66 -5.33,-4 -8,-4z"/>
|
||||
</vector>
|
@ -0,0 +1,5 @@
|
||||
<vector android:autoMirrored="true" android:height="24dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M19.07,4.93l-1.41,1.41C19.1,7.79 20,9.79 20,12c0,4.42 -3.58,8 -8,8s-8,-3.58 -8,-8c0,-4.08 3.05,-7.44 7,-7.93v2.02C8.16,6.57 6,9.03 6,12c0,3.31 2.69,6 6,6s6,-2.69 6,-6c0,-1.66 -0.67,-3.16 -1.76,-4.24l-1.41,1.41C15.55,9.9 16,10.9 16,12c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4c0,-1.86 1.28,-3.41 3,-3.86v2.14c-0.6,0.35 -1,0.98 -1,1.72 0,1.1 0.9,2 2,2s2,-0.9 2,-2c0,-0.74 -0.4,-1.38 -1,-1.72V2h-1C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10c0,-2.76 -1.12,-5.26 -2.93,-7.07z"/>
|
||||
</vector>
|
@ -0,0 +1,14 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
android:id="@+id/toolbar"
|
||||
layout="@layout/toolbar" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/settings"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
</LinearLayout>
|
@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<Preference
|
||||
android:title="@string/documentation"
|
||||
app:icon="@drawable/ic_outline_help_outline_24px">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:data="https://tasks.org" />
|
||||
</Preference>
|
||||
|
||||
<Preference
|
||||
android:key="@string/contact_developer"
|
||||
android:title="@string/contact_developer"
|
||||
app:icon="@drawable/ic_outline_email_24px" />
|
||||
|
||||
<Preference
|
||||
android:key="@string/rate_tasks"
|
||||
android:title="@string/rate_tasks"
|
||||
app:icon="@drawable/ic_outline_star_border_24px">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:data="@string/market_url" />
|
||||
</Preference>
|
||||
|
||||
<Preference
|
||||
android:key="@string/changelog"
|
||||
android:title="@string/changelog"
|
||||
app:allowDividerAbove="true"
|
||||
app:icon="@drawable/ic_track_changes_24px">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:data="https://tasks.org/changelog" />
|
||||
</Preference>
|
||||
|
||||
<Preference
|
||||
android:summary="@string/license_summary"
|
||||
android:title="@string/source_code"
|
||||
app:icon="@drawable/ic_octocat">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:data="https://tasks.org/source" />
|
||||
</Preference>
|
||||
|
||||
<Preference
|
||||
android:title="@string/third_party_licenses"
|
||||
app:icon="@drawable/ic_outline_gavel_24px">
|
||||
<intent
|
||||
android:targetClass="org.tasks.preferences.AttributionActivity"
|
||||
android:targetPackage="@string/app_package" />
|
||||
</Preference>
|
||||
|
||||
<Preference
|
||||
android:key="@string/upgrade_to_pro"
|
||||
android:title="@string/upgrade_to_pro"
|
||||
app:allowDividerAbove="true"
|
||||
app:icon="@drawable/ic_outline_attach_money_24px">
|
||||
<intent
|
||||
android:targetClass="org.tasks.billing.PurchaseActivity"
|
||||
android:targetPackage="@string/app_package" />
|
||||
</Preference>
|
||||
|
||||
<Preference
|
||||
android:key="@string/refresh_purchases"
|
||||
android:title="@string/refresh_purchases"
|
||||
app:icon="@drawable/ic_cached_24px" />
|
||||
|
||||
<Preference
|
||||
android:title="@string/privacy_policy"
|
||||
app:allowDividerAbove="true"
|
||||
app:icon="@drawable/ic_outline_perm_identity_24px">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:data="https://tasks.org/privacy.html" />
|
||||
</Preference>
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="true"
|
||||
android:key="@string/p_collect_statistics"
|
||||
android:summary="@string/send_anonymous_statistics_summary"
|
||||
android:title="@string/send_anonymous_statistics"
|
||||
app:icon="@drawable/ic_outline_bug_report_24px" />
|
||||
|
||||
</PreferenceScreen>
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="app_name" tools:ignore="PrivateResource">Tasks</string>
|
||||
<string name="app_package">org.tasks</string>
|
||||
<string name="backup_api_key">AEdPqrEAAAAI49v5bBusi_bq1bgLBB1LIsepNV0eBrFkQrBZkw</string>
|
||||
</resources>
|
Loading…
Reference in New Issue