diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index 0cc871a3a..317d9f5cd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -28,6 +28,9 @@ import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyAdd; import java.io.File; import java.net.Proxy; +import java.util.Arrays; +import java.util.List; + public final class Constants { @@ -172,6 +175,14 @@ public final class Constants { public static final String TYPE_HTTP = "proxyHttp"; public static final String TYPE_SOCKS = "proxySocks"; } + + // we generally only track booleans. never snoop around in the user's string settings!! + public static final List ANALYTICS_PREFS = Arrays.asList(USE_NORMAL_PROXY, USE_TOR_PROXY, THEME, + SYNC_CONTACTS, SYNC_KEYSERVER, ENABLE_WIFI_SYNC_ONLY, EXPERIMENTAL_ENABLE_KEYBASE, + EXPERIMENTAL_ENABLE_LINKED_IDENTITIES, EXPERIMENTAL_USB_ALLOW_UNTESTED, + PASSPHRASE_CACHE_SUBS, SEARCH_KEYSERVER, SEARCH_KEYBASE, SEARCH_WEB_KEY_DIRECTORY, + TEXT_USE_COMPRESSION, TEXT_SELF_ENCRYPT, FILE_USE_COMPRESSION, FILE_SELF_ENCRYPT, USE_ARMOR, + USE_NUMKEYPAD_FOR_SECURITY_TOKEN_PIN, ENCRYPT_FILENAMES); } /** diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java index f47f6c12a..bb3574d56 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java @@ -5,6 +5,8 @@ import android.app.Activity; import android.app.Application; import android.app.Application.ActivityLifecycleCallbacks; import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import org.piwik.sdk.Piwik; @@ -12,10 +14,13 @@ import org.piwik.sdk.Tracker; import org.piwik.sdk.TrackerConfig; import org.piwik.sdk.extra.DownloadTracker.Extra.ApkChecksum; import org.piwik.sdk.extra.TrackHelper; +import org.sufficientlysecure.keychain.Constants.Defaults; +import org.sufficientlysecure.keychain.Constants.Pref; import org.sufficientlysecure.keychain.util.Preferences; +import timber.log.Timber; -public class AnalyticsManager { +public class AnalyticsManager implements OnSharedPreferenceChangeListener { private Tracker piwikTracker; public static AnalyticsManager getInstance(Context context) { @@ -69,6 +74,42 @@ public class AnalyticsManager { } }); + + Preferences preferences = Preferences.getPreferences(application); + preferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + } + + // we generally only track booleans. never snoop around in the user's string settings!! + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + // small exception: check if the user uses a custom keyserver, or one of the well-known ones + if (Pref.KEY_SERVERS.equals(key)) { + Timber.d("Tracking pref %s", key); + String keyServers = sharedPreferences.getString(Pref.KEY_SERVERS, Defaults.KEY_SERVERS); + String current = keyServers.substring(keyServers.indexOf(',')); + + String coarseGranularityKeyserver; + if (current.contains("keyserver.ubuntu.com")) { + coarseGranularityKeyserver = "ubuntu"; + } else if (current.contains("pgp.mit.edu")) { + coarseGranularityKeyserver = "mit"; + } else if (current.contains("pool.sks-keyservers.net")) { + coarseGranularityKeyserver = "pool"; + } else { + coarseGranularityKeyserver = "custom"; + } + TrackHelper.track().interaction("pref_" + Pref.KEY_SERVERS, coarseGranularityKeyserver).with(piwikTracker); + return; + } + if (Pref.ANALYTICS_PREFS.contains(key)) { + Timber.d("Tracking pref %s", key); + if (!sharedPreferences.contains(key)) { + TrackHelper.track().interaction("pref_" + key, "empty").with(piwikTracker); + return; + } + boolean value = sharedPreferences.getBoolean(key, false); + TrackHelper.track().interaction("pref_" + key, value ? "true" : "false").with(piwikTracker); + } } public void trackFragmentImpression(String opClassName, String fragmentName) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java index 26a8d05d7..790f0e845 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -20,7 +20,6 @@ package org.sufficientlysecure.keychain.util; import java.net.Proxy; import java.util.ArrayList; -import java.util.Date; import java.util.ListIterator; import android.annotation.SuppressLint; @@ -34,6 +33,7 @@ import android.support.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants.Pref; +import org.sufficientlysecure.keychain.analytics.AnalyticsManager; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; import timber.log.Timber; @@ -82,6 +82,10 @@ public class Preferences { mSharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, PREF_FILE_MODE); } + public SharedPreferences getSharedPreferences() { + return mSharedPreferences; + } + public String getLanguage() { return mSharedPreferences.getString(Constants.Pref.LANGUAGE, ""); }