From 10466101c028a3cabbb3df8434875c81f42ca132 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 16 Jul 2018 13:38:02 +0200 Subject: [PATCH] move tracking consent logic into TrackingConsentRequester --- .../keychain/TrackingManager.java | 1 - .../analytics/TrackingConsentRequester.java | 91 +++++++++++++++++++ .../keychain/ui/KeyListFragment.java | 81 +---------------- 3 files changed, 93 insertions(+), 80 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/TrackingConsentRequester.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/TrackingManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/TrackingManager.java index dc42d0237..d57b077e3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/TrackingManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/TrackingManager.java @@ -6,7 +6,6 @@ import android.app.Application; import android.app.Application.ActivityLifecycleCallbacks; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; import org.piwik.sdk.Piwik; import org.piwik.sdk.Tracker; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/TrackingConsentRequester.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/TrackingConsentRequester.java new file mode 100644 index 000000000..59370ba58 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/TrackingConsentRequester.java @@ -0,0 +1,91 @@ +package org.sufficientlysecure.keychain; + + +import java.util.concurrent.TimeUnit; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager.NameNotFoundException; +import android.preference.PreferenceActivity; + +import org.sufficientlysecure.keychain.ui.SettingsActivity; +import org.sufficientlysecure.keychain.ui.SettingsActivity.ExperimentalPrefsFragment; +import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.ui.util.Notify.Style; +import org.sufficientlysecure.keychain.util.Preferences; + + +public class TrackingConsentRequester { + private final Activity activity; + + public static TrackingConsentRequester getInstance(Activity activity) { + return new TrackingConsentRequester(activity); + } + + private TrackingConsentRequester(Activity activity) { + this.activity = activity; + } + + public void maybeAskForAnalytics() { + Preferences preferences = Preferences.getPreferences(activity); + if (preferences.isAnalyticsHasConsent()) { + return; + } + + boolean askedBeforeAndWasRejected = + preferences.isAnalyticsAskedPolitely() && !preferences.isAnalyticsHasConsent(); + if (!Constants.DEBUG && askedBeforeAndWasRejected) { + return; + } + + try { + long firstInstallTime = + activity.getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, 0).firstInstallTime; + long threeDaysAgo = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(3); + boolean installedLessThanThreeDaysAgo = firstInstallTime > threeDaysAgo; + if (!Constants.DEBUG && installedLessThanThreeDaysAgo) { + return; + } + } catch (NameNotFoundException e) { + return; + } + + long twentyFourHoursAgo = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1); + boolean askedLessThan24HoursAgo = preferences.getAnalyticsLastAsked() > twentyFourHoursAgo; + if (!Constants.DEBUG && askedLessThan24HoursAgo) { + return; + } + + preferences.setAnalyticsLastAskedNow(); + + TrackingManager trackingManager = ((KeychainApplication) activity.getApplication()).getTrackingManager(); + AlertDialog show = new Builder(activity) + .setMessage(R.string.dialog_analytics_text) + .setPositiveButton(R.string.button_analytics_yes, (dialog, which) -> { + preferences.setAnalyticsAskedPolitely(); + preferences.setAnalyticsGotUserConsent(true); + trackingManager.refreshSettings(activity); + Notify.create(activity, R.string.snack_analytics_accept, Style.OK, + this::startExperimentalSettingsActivity, R.string.snackbutton_analytics_settings).show(); + }) + .setNegativeButton(R.string.button_analytics_no, (dialog, which) -> { + preferences.setAnalyticsAskedPolitely(); + preferences.setAnalyticsGotUserConsent(false); + trackingManager.refreshSettings(activity); + Notify.create(activity, R.string.snack_analytics_reject, Style.OK, + this::startExperimentalSettingsActivity, R.string.snackbutton_analytics_settings).show(); + }) + .show(); + show.setCanceledOnTouchOutside(false); + } + + private void startExperimentalSettingsActivity() { + Intent resultIntent = new Intent(activity, SettingsActivity.class); + String experimentalPrefsName = ExperimentalPrefsFragment.class.getName(); + resultIntent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, experimentalPrefsName); + activity.startActivity(resultIntent); + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index 20e48b19f..a3afc393d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -20,20 +20,14 @@ package org.sufficientlysecure.keychain.ui; import java.io.IOException; import java.util.List; -import java.util.concurrent.TimeUnit; import android.animation.ObjectAnimator; import android.app.Activity; -import android.app.AlertDialog; -import android.app.AlertDialog.Builder; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.ViewModelProviders; -import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager.NameNotFoundException; import android.os.AsyncTask; import android.os.Bundle; -import android.preference.PreferenceActivity; import android.support.annotation.WorkerThread; import android.support.v4.app.FragmentActivity; import android.support.v4.view.MenuItemCompat; @@ -57,12 +51,10 @@ import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemClickListener; import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemLongClickListener; import eu.davidea.flexibleadapter.SelectableAdapter.Mode; -import org.sufficientlysecure.keychain.BuildConfig; import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.KeychainApplication; import org.sufficientlysecure.keychain.KeychainDatabase; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.TrackingManager; +import org.sufficientlysecure.keychain.TrackingConsentRequester; import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; import org.sufficientlysecure.keychain.daos.DatabaseNotifyManager; import org.sufficientlysecure.keychain.daos.KeyRepository; @@ -74,7 +66,6 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.service.BenchmarkInputParcel; -import org.sufficientlysecure.keychain.ui.SettingsActivity.ExperimentalPrefsFragment; import org.sufficientlysecure.keychain.ui.adapter.FlexibleKeyDetailsItem; import org.sufficientlysecure.keychain.ui.adapter.FlexibleKeyDummyItem; import org.sufficientlysecure.keychain.ui.adapter.FlexibleKeyHeader; @@ -270,7 +261,7 @@ public class KeyListFragment extends RecyclerFragment> liveData = viewModel.getGenericLiveData(requireContext(), this::loadFlexibleKeyItems); liveData.observe(this, this::onLoadKeyItems); - maybeAskForAnalytics(); + TrackingConsentRequester.getInstance(activity).maybeAskForAnalytics(); } @WorkerThread @@ -279,74 +270,6 @@ public class KeyListFragment extends RecyclerFragment threeDaysAgo; - if (!Constants.DEBUG && installedLessThanThreeDaysAgo) { - return; - } - } catch (NameNotFoundException e) { - return; - } - - long twentyFourHoursAgo = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1); - boolean askedLessThan24HoursAgo = preferences.getAnalyticsLastAsked() > twentyFourHoursAgo; - if (!Constants.DEBUG && askedLessThan24HoursAgo) { - return; - } - - preferences.setAnalyticsLastAskedNow(); - - TrackingManager trackingManager = ((KeychainApplication) requireActivity().getApplication()).getTrackingManager(); - AlertDialog show = new Builder(context) - .setMessage(R.string.dialog_analytics_text) - .setPositiveButton(R.string.button_analytics_yes, (dialog, which) -> { - preferences.setAnalyticsAskedPolitely(); - preferences.setAnalyticsGotUserConsent(true); - trackingManager.refreshSettings(context); - Notify.create(requireActivity(), R.string.snack_analytics_accept, Style.OK, - this::startExperimentalSettingsActivity, R.string.snackbutton_analytics_settings).show(); - }) - .setNegativeButton(R.string.button_analytics_no, (dialog, which) -> { - preferences.setAnalyticsAskedPolitely(); - preferences.setAnalyticsGotUserConsent(false); - trackingManager.refreshSettings(context); - Notify.create(requireActivity(), R.string.snack_analytics_reject, Style.OK, - this::startExperimentalSettingsActivity, R.string.snackbutton_analytics_settings).show(); - }) - .show(); - show.setCanceledOnTouchOutside(false); - } - - private void startExperimentalSettingsActivity() { - Activity activity = getActivity(); - if (activity == null) { - return; - } - - Intent resultIntent = new Intent(activity, SettingsActivity.class); - String experimentalPrefsName = ExperimentalPrefsFragment.class.getName(); - resultIntent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, experimentalPrefsName); - startActivity(resultIntent); - } - private void onLoadKeyItems(List flexibleKeyItems) { FlexibleAdapter adapter = getAdapter(); if (adapter == null) {