New 'Help & feedback' menu

pull/935/head
Alex Baker 4 years ago
parent ab793e3dd4
commit bfa865e0c8

@ -180,6 +180,7 @@ dependencies {
implementation("androidx.annotation:annotation:1.1.0")
implementation("androidx.constraintlayout:constraintlayout:2.0.0-beta4")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")
implementation("androidx.preference:preference:1.1.0")
implementation("com.jakewharton.timber:timber:4.7.1")
implementation("com.jakewharton.threetenabp:threetenabp:1.2.1")
implementation("com.google.guava:guava:27.1-android")

@ -829,3 +829,9 @@
license: Bouncy Castle Licence
licenseUrl: http://www.bouncycastle.org/licence.html
url: http://rtyley.github.io/spongycastle/
- artifact: androidx.preference:preference:+
name: AndroidX Preference
copyrightHolder: Android Open Source Project
license: The Apache Software License, Version 2.0
licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
url: https://developer.android.com/jetpack/androidx

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name" tools:ignore="PrivateResource">Tasks Debug</string>
<string name="app_package">org.tasks.debug</string>
<string name="backup_api_key">AEdPqrEAAAAImTf5DbfspggWrU9h06685ONycpUVwJj1JwawQQ</string>
<string name="debug_strict_mode_thread">Strict mode - Thread</string>
<string name="debug_strict_mode_vm">Strict mode - VM</string>

@ -574,6 +574,10 @@
android:name=".etesync.EncryptionSettingsActivity"
android:theme="@style/Tasks" />
<activity
android:name=".preferences.HelpAndFeedback"
android:theme="@style/Tasks" />
<!-- launcher icons -->
<activity-alias

@ -2077,7 +2077,7 @@
"artifactId": {
"name": "databinding-adapters",
"group": "androidx.databinding",
"version": "3.6.0-rc02"
"version": "3.6.0-rc03"
}
},
{
@ -2141,7 +2141,7 @@
"artifactId": {
"name": "databinding-common",
"group": "androidx.databinding",
"version": "3.6.0-rc02"
"version": "3.6.0-rc03"
}
},
{
@ -2157,7 +2157,7 @@
"artifactId": {
"name": "databinding-runtime",
"group": "androidx.databinding",
"version": "3.6.0-rc02"
"version": "3.6.0-rc03"
}
},
{
@ -2189,7 +2189,7 @@
"artifactId": {
"name": "viewbinding",
"group": "androidx.databinding",
"version": "3.6.0-rc02"
"version": "3.6.0-rc03"
}
},
{
@ -2221,7 +2221,7 @@
"artifactId": {
"name": "journalmanager",
"group": "com.etesync",
"version": "1.0.2-SNAPSHOT"
"version": "1.0.4"
}
},
{
@ -2239,6 +2239,22 @@
"group": "com.madgag.spongycastle",
"version": "1.54.0.0"
}
},
{
"notice": null,
"copyrightHolder": "Android Open Source Project",
"copyrightStatement": "Copyright &copy; Android Open Source Project. All rights reserved.",
"license": "The Apache Software License, Version 2.0",
"licenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt",
"normalizedLicense": "apache2",
"year": null,
"url": "https://developer.android.com/jetpack/androidx",
"libraryName": "AndroidX Preference",
"artifactId": {
"name": "preference",
"group": "androidx.preference",
"version": "1.1.0"
}
}
]
}

@ -38,6 +38,7 @@ import org.tasks.data.GoogleTaskAccount;
import org.tasks.etesync.EteSyncCalendarSettingsActivity;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.BasicPreferences;
import org.tasks.preferences.HelpAndFeedback;
import org.tasks.ui.NavigationDrawerFragment;
public class FilterProvider {
@ -194,6 +195,13 @@ public class FilterProvider {
R.drawable.ic_outline_settings_24px,
new Intent(context, BasicPreferences.class),
REQUEST_SETTINGS));
items.add(
new NavigationDrawerAction(
context.getString(R.string.help_and_feedback),
R.drawable.ic_outline_help_outline_24px,
new Intent(context, HelpAndFeedback.class),
0));
}
return items;

@ -11,6 +11,7 @@ import com.todoroo.astrid.gcal.CalendarReminderActivity;
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity;
import com.todoroo.astrid.reminders.ReminderPreferences;
import dagger.Subcomponent;
import org.jetbrains.annotations.NotNull;
import org.tasks.activities.CalendarSelectionActivity;
import org.tasks.activities.CameraActivity;
import org.tasks.activities.ColorPickerActivity;
@ -22,6 +23,7 @@ import org.tasks.activities.GoogleTaskListSettingsActivity;
import org.tasks.etesync.EncryptionSettingsActivity;
import org.tasks.etesync.EteSyncAccountSettingsActivity;
import org.tasks.etesync.EteSyncCalendarSettingsActivity;
import org.tasks.preferences.HelpAndFeedback;
import org.tasks.tags.TagPickerActivity;
import org.tasks.activities.TagSettingsActivity;
import org.tasks.activities.TimePickerActivity;
@ -155,4 +157,6 @@ public interface ActivityComponent {
void inject(EteSyncCalendarSettingsActivity eteSyncCalendarSettingsActivity);
void inject(EncryptionSettingsActivity encryptionSettingsActivity);
void inject(@NotNull HelpAndFeedback helpAndFeedback);
}

@ -10,7 +10,9 @@ import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ReminderControlSet;
import dagger.Subcomponent;
import org.jetbrains.annotations.NotNull;
import org.tasks.fragments.CommentBarFragment;
import org.tasks.preferences.fragments.HelpAndFeedback;
import org.tasks.ui.CalendarControlSet;
import org.tasks.ui.DeadlineControlSet;
import org.tasks.ui.DescriptionControlSet;
@ -61,4 +63,6 @@ public interface FragmentComponent {
void inject(SubtaskControlSet subtaskControlSet);
void inject(TaskListViewModel taskListViewModel);
void inject(@NotNull HelpAndFeedback helpAndFeedback);
}

@ -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)
}

@ -43,9 +43,7 @@ import org.tasks.activities.FilterSelectionActivity;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.analytics.Tracking.Events;
import org.tasks.billing.BillingClient;
import org.tasks.billing.Inventory;
import org.tasks.billing.PurchaseActivity;
import org.tasks.caldav.CaldavAccountSettingsActivity;
import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavDao;
@ -107,7 +105,6 @@ public class BasicPreferences extends InjectingPreferenceActivity
@Inject Toaster toaster;
@Inject ActivityPermissionRequestor permissionRequestor;
@Inject GoogleAccountManager googleAccountManager;
@Inject BillingClient billingClient;
@Inject DefaultFilterProvider defaultFilterProvider;
@Inject LocalBroadcastManager localBroadcastManager;
@Inject WorkManager workManager;
@ -248,12 +245,6 @@ public class BasicPreferences extends InjectingPreferenceActivity
}
return true;
});
findPreference(getString(R.string.p_collect_statistics))
.setOnPreferenceChangeListener(
(preference, newValue) -> {
showRestartDialog();
return true;
});
findPreference(R.string.backup_BAc_import)
.setOnPreferenceClickListener(
@ -292,45 +283,6 @@ public class BasicPreferences extends InjectingPreferenceActivity
}
});
findPreference(R.string.contact_developer)
.setOnPreferenceClickListener(
preference -> {
emailSupport();
return false;
});
findPreference(R.string.third_party_licenses)
.setOnPreferenceClickListener(
preference -> {
startActivity(new Intent(this, AttributionActivity.class));
return false;
});
findPreference(R.string.rate_tasks)
.setOnPreferenceClickListener(
preference -> {
startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.market_url))));
return false;
});
Preference upgradeToPro = findPreference(R.string.upgrade_to_pro);
upgradeToPro.setOnPreferenceClickListener(
p -> {
startActivity(new Intent(this, PurchaseActivity.class));
return false;
});
if (inventory.hasPro()) {
upgradeToPro.setTitle(R.string.manage_subscription);
upgradeToPro.setSummary(R.string.manage_subscription_summary);
}
findPreference(R.string.refresh_purchases).setOnPreferenceClickListener(
preference -> {
billingClient.queryPurchases();
return false;
});
findPreference(getString(R.string.p_background_sync_unmetered_only))
.setOnPreferenceChangeListener(
(preference, o) -> {
@ -362,9 +314,6 @@ public class BasicPreferences extends InjectingPreferenceActivity
return false;
});
findPreference(R.string.changelog)
.setSummary(getString(R.string.version_string, BuildConfig.VERSION_NAME));
requires(
R.string.settings_localization,
atLeastJellybeanMR1(),
@ -375,17 +324,6 @@ public class BasicPreferences extends InjectingPreferenceActivity
requires(BuildConfig.DEBUG, R.string.debug);
//noinspection ConstantConditions
if (BuildConfig.FLAVOR.equals("generic")) {
requires(
R.string.about,
false,
R.string.rate_tasks,
R.string.upgrade_to_pro,
R.string.refresh_purchases);
requires(R.string.privacy, false, R.string.p_collect_statistics);
}
//noinspection ConstantConditions
if (!BuildConfig.FLAVOR.equals("googleplay")) {
removeGroup(R.string.TEA_control_location);

@ -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);
}
}

@ -152,7 +152,11 @@ object CustomIcons {
1115 to R.drawable.ic_outline_scanner_24px,
1116 to R.drawable.ic_outline_router_24px,
1117 to R.drawable.ic_outline_watch_24px,
1118 to R.drawable.ic_outline_videogame_asset_24px
1118 to R.drawable.ic_outline_videogame_asset_24px,
1119 to R.drawable.ic_cached_24px,
1120 to R.drawable.ic_octocat,
1121 to R.drawable.ic_outline_perm_identity_24px,
1122 to R.drawable.ic_track_changes_24px
)
@kotlin.jvm.JvmStatic

@ -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>

@ -496,6 +496,7 @@ File %1$s contained %2$s.\n\n
<string name="tasker_create_task">Create task</string>
<string name="tasker_list_notification">List notification</string>
<string name="help">Help</string>
<string name="help_and_feedback">Help &amp; feedback</string>
<string name="caldav_home_set_not_found">Home set not found</string>
<string name="network_error">Connection failed</string>
<string name="background_sync_unmetered_only">Only on unmetered connections</string>
@ -578,4 +579,5 @@ File %1$s contained %2$s.\n\n
<string name="caldav_account_description">Requires an account with a CalDAV service provider or a self-hosted server. Find a service provider by visiting tasks.org/caldav</string>
<string name="etesync_account_description">Requires an account with EteSync.com or a self-hosted server</string>
<string name="etesync_encryption_description">Choose an encryption password. Do not forget your password, it cannot be recovered!</string>
<string name="documentation">Documentation</string>
</resources>

@ -1,6 +1,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<!-- ========================================================== General -->
<style name="PreferenceTheme" parent="@style/PreferenceThemeOverlay.v14.Material">
<item name="android:tint">@color/icon_tint</item>
</style>
<style name="popup_overlay" parent="ThemeOverlay.MaterialComponents.Light"/>

@ -30,6 +30,7 @@
<item name="weekdayButtonBackground">?attr/colorPrimary</item>
<item name="weekdayButtonText">?attr/colorOnPrimary</item>
<item name="horizontal_divider">2</item> <!-- View.GONE -->
<item name="preferenceTheme">@style/PreferenceTheme</item>
</style>
<style name="Tasks" parent="TasksBase"/>

@ -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>

@ -240,66 +240,6 @@
</PreferenceCategory>
<PreferenceCategory
android:key="@string/about"
android:title="@string/about">
<Preference
android:summary="@string/license_summary"
android:title="@string/source_code">
<intent
android:action="android.intent.action.VIEW"
android:data="https://tasks.org/source"/>
</Preference>
<Preference
android:key="@string/changelog"
android:title="@string/changelog">
<intent
android:action="android.intent.action.VIEW"
android:data="https://tasks.org/changelog"/>
</Preference>
<Preference
android:key="@string/third_party_licenses"
android:title="@string/third_party_licenses"/>
<Preference
android:key="@string/contact_developer"
android:title="@string/contact_developer"/>
<Preference
android:key="@string/rate_tasks"
android:title="@string/rate_tasks"/>
<Preference
android:key="@string/upgrade_to_pro"
android:title="@string/upgrade_to_pro"/>
<Preference
android:key="@string/refresh_purchases"
android:title="@string/refresh_purchases" />
</PreferenceCategory>
<PreferenceCategory
android:key="@string/privacy"
android:title="@string/privacy">
<Preference android:title="@string/privacy_policy">
<intent
android:action="android.intent.action.VIEW"
android:data="http://tasks.org/privacy.html"/>
</Preference>
<CheckBoxPreference
android:defaultValue="true"
android:key="@string/p_collect_statistics"
android:summary="@string/send_anonymous_statistics_summary"
android:title="@string/send_anonymous_statistics"/>
</PreferenceCategory>
<Preference
android:key="@string/debug"
android:title="@string/debug"/>

@ -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…
Cancel
Save