analytics: remove

This commit is contained in:
Vincent Breitmoser 2020-09-05 14:14:05 +02:00
parent 61892a6570
commit 7154159a36
55 changed files with 35 additions and 588 deletions

View file

@ -49,9 +49,6 @@ dependencies {
// Nordpol
implementation 'com.fidesmo:nordpol-android:0.1.22'
// piwik
implementation 'org.piwik.sdk:piwik-sdk:3.0.3'
// libs as submodules
implementation project(':openpgp-api-lib')
implementation project(':nfcsweetspot')

View file

@ -20,8 +20,6 @@ package org.sufficientlysecure.keychain;
import java.io.File;
import java.net.Proxy;
import java.util.Arrays;
import java.util.List;
import android.os.Environment;
@ -159,10 +157,6 @@ public final class Constants {
public static final String KEY_SIGNATURES_TABLE_INITIALIZED = "key_signatures_table_initialized";
public static final String KEY_ANALYTICS_ASKED_POLITELY = "analytics_asked";
public static final String KEY_ANALYTICS_CONSENT = "analytics_consent";
public static final String KEY_ANALYTICS_LAST_ASKED = "analytics_last_asked";
public static final class Theme {
public static final String LIGHT = "light";
public static final String DARK = "dark";
@ -173,14 +167,6 @@ 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<String> ANALYTICS_PREFS = Arrays.asList(USE_NORMAL_PROXY, USE_TOR_PROXY,
SYNC_CONTACTS, SYNC_KEYSERVER, ENABLE_WIFI_SYNC_ONLY,
EXPERIMENTAL_USB_ALLOW_UNTESTED,
PASSPHRASE_CACHE_SUBS, SEARCH_KEYSERVER, 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);
}
/**

View file

@ -34,7 +34,6 @@ import android.widget.Toast;
import androidx.annotation.Nullable;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.sufficientlysecure.keychain.analytics.AnalyticsManager;
import org.sufficientlysecure.keychain.keysync.KeyserverSyncManager;
import org.sufficientlysecure.keychain.network.TlsCertificatePinning;
import org.sufficientlysecure.keychain.provider.TemporaryFileProvider;
@ -46,8 +45,6 @@ import timber.log.Timber.DebugTree;
public class KeychainApplication extends Application {
AnalyticsManager analyticsManager;
/**
* Called when the application is starting, before any activity, service, or receiver objects
* (excluding content providers) have been created.
@ -116,9 +113,6 @@ public class KeychainApplication extends Application {
KeyserverSyncManager.updateKeyserverSyncScheduleAsync(this, false);
TemporaryFileProvider.scheduleCleanupImmediately(getApplicationContext());
analyticsManager = AnalyticsManager.getInstance(getApplicationContext());
analyticsManager.initialize(this);
}
/**
@ -167,10 +161,6 @@ public class KeychainApplication extends Application {
}
}
public AnalyticsManager getAnalyticsManager() {
return analyticsManager;
}
public static String getProcessName() {
if (Build.VERSION.SDK_INT >= 28)
return Application.getProcessName();

View file

@ -1,95 +0,0 @@
package org.sufficientlysecure.keychain.analytics;
import java.util.concurrent.TimeUnit;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.preference.PreferenceActivity;
import android.text.method.LinkMovementMethod;
import android.widget.TextView;
import org.sufficientlysecure.keychain.BuildConfig;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.R;
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 AnalyticsConsentRequester {
private final Activity activity;
public static AnalyticsConsentRequester getInstance(Activity activity) {
return new AnalyticsConsentRequester(activity);
}
private AnalyticsConsentRequester(Activity activity) {
this.activity = activity;
}
public void maybeAskForAnalytics() {
Preferences preferences = Preferences.getPreferences(activity);
if (preferences.isAnalyticsHasConsent()) {
return;
}
boolean askedBeforeAndWasRejected =
preferences.isAnalyticsAskedPolitely() && !preferences.isAnalyticsHasConsent();
if (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 (installedLessThanThreeDaysAgo) {
return;
}
} catch (NameNotFoundException e) {
return;
}
long twentyFourHoursAgo = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1);
boolean askedLessThan24HoursAgo = preferences.getAnalyticsLastAsked() > twentyFourHoursAgo;
if (askedLessThan24HoursAgo) {
return;
}
preferences.setAnalyticsLastAskedNow();
AnalyticsManager analyticsManager = ((KeychainApplication) activity.getApplication()).getAnalyticsManager();
AlertDialog alertDialog = new Builder(activity)
.setMessage(R.string.dialog_analytics_consent)
.setPositiveButton(R.string.button_analytics_yes, (dialog, which) -> {
preferences.setAnalyticsAskedPolitely();
preferences.setAnalyticsGotUserConsent(true);
analyticsManager.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);
analyticsManager.refreshSettings(activity);
Notify.create(activity, R.string.snack_analytics_reject, Style.OK,
this::startExperimentalSettingsActivity, R.string.snackbutton_analytics_settings).show();
})
.show();
alertDialog.<TextView>findViewById(android.R.id.message).setMovementMethod(LinkMovementMethod.getInstance());
}
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);
}
}

View file

@ -1,180 +0,0 @@
package org.sufficientlysecure.keychain.analytics;
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;
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;
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 implements OnSharedPreferenceChangeListener {
private Tracker piwikTracker;
public static AnalyticsManager getInstance(Context context) {
return new AnalyticsManager(context);
}
private AnalyticsManager(Context context) {
refreshSettings(context);
}
public void initialize(Application application) {
if (piwikTracker != null) {
TrackHelper.track().download().identifier(new ApkChecksum(application)).with(piwikTracker);
}
application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
if (piwikTracker == null) {
return;
}
TrackHelper.track().screen(activity.getClass().getSimpleName()).with(piwikTracker);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
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) {
if (piwikTracker == null) {
return;
}
// 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;
}
// unpack an enum
if (Pref.THEME.equals(key)) {
String value = sharedPreferences.getString(Pref.THEME, "empty");
TrackHelper.track().interaction("pref_" + Pref.THEME, value).with(piwikTracker);
return;
}
// all other values we track are individual booleans
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) {
if (piwikTracker == null) {
return;
}
TrackHelper.track().screen(opClassName + "/" + fragmentName).with(piwikTracker);
}
public void trackInternalServiceCall(String opClassName) {
if (piwikTracker == null) {
return;
}
TrackHelper.track()
.interaction("internalApiCall", opClassName)
.with(piwikTracker);
}
public void trackApiServiceCall(String opClassName, String currentCallingPackage) {
if (piwikTracker == null) {
return;
}
TrackHelper.track()
.interaction("externalApiCall", opClassName)
.piece(currentCallingPackage.replace(".", "/"))
.with(piwikTracker);
}
public synchronized void refreshSettings(Context context) {
boolean shouldEnableAnalytics = shouldEnableAnalytics(context);
boolean analyticsEnabled = piwikTracker != null;
if (shouldEnableAnalytics != analyticsEnabled) {
if (shouldEnableAnalytics) {
TrackerConfig trackerConfig;
if (Constants.DEBUG) {
trackerConfig = new TrackerConfig("https://piwik.openkeychain.org/", 3, "OpenKeychainDebug");
} else {
trackerConfig = new TrackerConfig("https://piwik.openkeychain.org/", 2, "OpenKeychain");
}
piwikTracker = Piwik.getInstance(context).newTracker(trackerConfig);
piwikTracker.setDispatchInterval(60000);
piwikTracker.setOptOut(false);
} else {
piwikTracker.setOptOut(true);
piwikTracker = null;
}
}
}
private boolean shouldEnableAnalytics(Context context) {
Preferences preferences = Preferences.getPreferences(context);
return preferences.isAnalyticsHasConsent() && !preferences.getUseTorProxy();
}
}

View file

@ -38,10 +38,10 @@ import android.os.Messenger;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.SystemClock;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.openintents.openpgp.AutocryptPeerUpdate;
import org.openintents.openpgp.IOpenPgpService;
@ -52,9 +52,12 @@ import org.openintents.openpgp.OpenPgpSignatureResult;
import org.openintents.openpgp.OpenPgpSignatureResult.AutocryptPeerResult;
import org.openintents.openpgp.util.OpenPgpApi;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.daos.ApiAppDao;
import org.sufficientlysecure.keychain.daos.AutocryptPeerDao;
import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
import org.sufficientlysecure.keychain.daos.OverriddenWarningsDao;
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.analytics.AnalyticsManager;
import org.sufficientlysecure.keychain.operations.BackupOperation;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.ExportResult;
@ -69,12 +72,7 @@ import org.sufficientlysecure.keychain.pgp.PgpSignEncryptData;
import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.SecurityProblem;
import org.sufficientlysecure.keychain.daos.ApiAppDao;
import org.sufficientlysecure.keychain.daos.AutocryptPeerDao;
import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainExternalContract.AutocryptStatus;
import org.sufficientlysecure.keychain.daos.OverriddenWarningsDao;
import org.sufficientlysecure.keychain.remote.OpenPgpServiceKeyIdExtractor.KeyIdResult;
import org.sufficientlysecure.keychain.remote.OpenPgpServiceKeyIdExtractor.KeyIdResultStatus;
import org.sufficientlysecure.keychain.service.BackupKeyringParcel;
@ -101,7 +99,6 @@ public class OpenPgpService extends Service {
private ApiAppDao mApiAppDao;
private OpenPgpServiceKeyIdExtractor mKeyIdExtractor;
private ApiPendingIntentFactory mApiPendingIntentFactory;
private AnalyticsManager analyticsManager;
@Override
public void onCreate() {
@ -111,8 +108,6 @@ public class OpenPgpService extends Service {
mApiPermissionHelper = new ApiPermissionHelper(this, mApiAppDao);
mApiPendingIntentFactory = new ApiPendingIntentFactory(getBaseContext());
mKeyIdExtractor = OpenPgpServiceKeyIdExtractor.getInstance(getContentResolver(), mApiPendingIntentFactory);
analyticsManager = ((KeychainApplication) getApplication()).getAnalyticsManager();
}
private Intent signImpl(Intent data, InputStream inputStream,
@ -1032,8 +1027,6 @@ public class OpenPgpService extends Service {
return errorResult;
}
analyticsManager.trackApiServiceCall(data.getAction(), mApiPermissionHelper.getCurrentCallingPackage());
Progressable progressable = null;
if (data.hasExtra(OpenPgpApi.EXTRA_PROGRESS_MESSENGER)) {
Messenger messenger = data.getParcelableExtra(OpenPgpApi.EXTRA_PROGRESS_MESSENGER);

View file

@ -40,17 +40,15 @@ import org.openintents.ssh.authentication.response.PublicKeyResponse;
import org.openintents.ssh.authentication.response.SigningResponse;
import org.openintents.ssh.authentication.response.SshPublicKeyResponse;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.analytics.AnalyticsManager;
import org.sufficientlysecure.keychain.daos.ApiAppDao;
import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey;
import org.sufficientlysecure.keychain.pgp.SshPublicKey;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.daos.ApiAppDao;
import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
import org.sufficientlysecure.keychain.ssh.AuthenticationData;
@ -67,8 +65,6 @@ public class SshAuthenticationService extends Service {
private ApiAppDao mApiAppDao;
private ApiPendingIntentFactory mApiPendingIntentFactory;
private AnalyticsManager analyticsManager;
private static final List<Integer> SUPPORTED_VERSIONS = Collections.unmodifiableList(Collections.singletonList(1));
private static final int INVALID_API_VERSION = -1;
@ -82,8 +78,6 @@ public class SshAuthenticationService extends Service {
mApiAppDao = ApiAppDao.getInstance(this);
mApiPendingIntentFactory = new ApiPendingIntentFactory(getBaseContext());
analyticsManager = ((KeychainApplication) getApplication()).getAnalyticsManager();
}
private final ISshAuthenticationService.Stub mSSHAgent = new ISshAuthenticationService.Stub() {
@ -109,8 +103,6 @@ public class SshAuthenticationService extends Service {
}
private Intent executeInternal(Intent intent) {
analyticsManager.trackApiServiceCall(intent.getAction(), mApiPermissionHelper.getCurrentCallingPackage());
switch (intent.getAction()) {
case SshAuthenticationApi.ACTION_SIGN:
return authenticate(intent);

View file

@ -25,10 +25,8 @@ import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Parcelable;
import androidx.core.os.CancellationSignal;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.analytics.AnalyticsManager;
import androidx.core.os.CancellationSignal;
import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.operations.BackupOperation;
import org.sufficientlysecure.keychain.operations.BaseOperation;
@ -54,20 +52,15 @@ import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
public class KeychainServiceTask {
private final AnalyticsManager analyticsManager;
public static KeychainServiceTask create(Activity activity) {
Context context = activity.getApplicationContext();
KeyWritableRepository keyRepository = KeyWritableRepository.create(context);
AnalyticsManager analyticsManager = ((KeychainApplication) activity.getApplication()).getAnalyticsManager();
return new KeychainServiceTask(context, keyRepository, analyticsManager);
return new KeychainServiceTask(context, keyRepository);
}
private KeychainServiceTask(Context context, KeyWritableRepository keyRepository, AnalyticsManager analyticsManager) {
private KeychainServiceTask(Context context, KeyWritableRepository keyRepository) {
this.context = context;
this.keyRepository = keyRepository;
this.analyticsManager = analyticsManager;
}
private final Context context;
@ -128,8 +121,6 @@ public class KeychainServiceTask {
return null;
}
analyticsManager.trackInternalServiceCall(op.getClass().getSimpleName());
// noinspection unchecked, we make sure it's the correct op above
return op.execute(inputParcel, cryptoInput);
}

View file

@ -54,7 +54,6 @@ import eu.davidea.flexibleadapter.SelectableAdapter.Mode;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.KeychainDatabase;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.analytics.AnalyticsConsentRequester;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
import org.sufficientlysecure.keychain.daos.DatabaseNotifyManager;
import org.sufficientlysecure.keychain.daos.KeyRepository;
@ -254,8 +253,6 @@ public class KeyListFragment extends RecyclerFragment<FlexibleAdapter<FlexibleKe
GenericViewModel viewModel = ViewModelProviders.of(this).get(GenericViewModel.class);
LiveData<List<FlexibleKeyItem>> liveData = viewModel.getGenericLiveData(requireContext(), this::loadFlexibleKeyItems);
liveData.observe(this, this::onLoadKeyItems);
AnalyticsConsentRequester.getInstance(activity).maybeAskForAnalytics();
}
@WorkerThread

View file

@ -17,18 +17,19 @@
package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import com.mikepenz.community_material_typeface_library.CommunityMaterial;
import com.mikepenz.fontawesome_typeface_library.FontAwesome;
import com.mikepenz.google_material_typeface_library.GoogleMaterial;
@ -37,10 +38,7 @@ import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.model.DividerDrawerItem;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.analytics.AnalyticsManager;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.remote.ui.AppsListFragment;
import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenActivity;
@ -67,7 +65,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai
public Drawer mDrawer;
private Toolbar mToolbar;
private AnalyticsManager analyticsManager;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -78,8 +75,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai
mToolbar.setTitle(R.string.app_name);
setSupportActionBar(mToolbar);
analyticsManager = ((KeychainApplication) getApplication()).getAnalyticsManager();
mDrawer = new DrawerBuilder()
.withActivity(this)
.withHeader(R.layout.main_drawer_header)
@ -219,8 +214,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai
private void setFragment(Fragment frag) {
FragmentManager fragmentManager = getSupportFragmentManager();
analyticsManager.trackFragmentImpression(getClass().getSimpleName(), frag.getClass().getSimpleName());
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.main_fragment_container, frag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

View file

@ -41,14 +41,14 @@ import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.provider.ContactsContract;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.appcompat.widget.Toolbar;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.R;
@ -579,14 +579,6 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
});
}
@Override
public void onPause() {
super.onPause();
Activity activity = getActivity();
((KeychainApplication) activity.getApplication()).getAnalyticsManager().refreshSettings(activity);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {

View file

@ -22,17 +22,9 @@ import java.util.List;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProviders;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
@ -41,16 +33,22 @@ import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.animation.OvershootInterpolator;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProviders;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
import com.astuetz.PagerSlidingTabStrip;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
import org.sufficientlysecure.keychain.model.SubKey;
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
import org.sufficientlysecure.keychain.model.UserPacket.UserId;
import org.sufficientlysecure.keychain.analytics.AnalyticsManager;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
import org.sufficientlysecure.keychain.ui.keyview.ViewKeyActivity;
@ -89,8 +87,6 @@ public class ViewKeyAdvActivity extends BaseActivity implements OnPageChangeList
}
}
private AnalyticsManager analyticsManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -98,7 +94,6 @@ public class ViewKeyAdvActivity extends BaseActivity implements OnPageChangeList
setFullScreenDialogClose(v -> finish());
keyRepository = KeyRepository.create(this);
analyticsManager = ((KeychainApplication) getApplication()).getAnalyticsManager();
viewPager = findViewById(R.id.pager);
slidingTabLayout = findViewById(R.id.sliding_tab_layout);
@ -300,9 +295,6 @@ public class ViewKeyAdvActivity extends BaseActivity implements OnPageChangeList
actionMode = null;
}
invalidateOptionsMenu();
String fragmentName = tabAdapter.getItem(position).getClass().getSimpleName();
analyticsManager.trackFragmentImpression(getClass().getSimpleName(), fragmentName);
}
@Override

View file

@ -359,30 +359,6 @@ public class Preferences {
mSharedPreferences.edit().putString(Pref.SYNC_WORK_UUID, value).apply();
}
public boolean isAnalyticsAskedPolitely() {
return mSharedPreferences.getBoolean(Pref.KEY_ANALYTICS_ASKED_POLITELY, false);
}
public void setAnalyticsAskedPolitely() {
mSharedPreferences.edit().putBoolean(Pref.KEY_ANALYTICS_ASKED_POLITELY, true).apply();
}
public boolean isAnalyticsHasConsent() {
return mSharedPreferences.getBoolean(Pref.KEY_ANALYTICS_CONSENT, false);
}
public void setAnalyticsGotUserConsent(boolean hasUserConsent) {
mSharedPreferences.edit().putBoolean(Pref.KEY_ANALYTICS_CONSENT, hasUserConsent).apply();
}
public void setAnalyticsLastAskedNow() {
mSharedPreferences.edit().putLong(Pref.KEY_ANALYTICS_LAST_ASKED, System.currentTimeMillis()).apply();
}
public long getAnalyticsLastAsked() {
return mSharedPreferences.getLong(Pref.KEY_ANALYTICS_LAST_ASKED, 0);
}
@AutoValue
public static abstract class CloudSearchPrefs implements Parcelable {
public abstract boolean isKeyserverEnabled();

View file

@ -686,7 +686,5 @@
<string name="notify_content_keysync">مفتاح %d / %d</string>
<string name="keylist_header_anonymous">مجهول</string>
<string name="keylist_header_special">#</string>
<string name="button_analytics_no">لا، شكراً</string>
<string name="snackbutton_analytics_settings">الإعدادات</string>
<string name="share_key">شارك المفتاح</string>
</resources>

View file

@ -167,6 +167,4 @@
<string name="transfer_confirm_ok">Kas</string>
<string name="token_action_import">Emporzhiañ</string>
<string name="keylist_header_anonymous">Anonymous</string>
<string name="button_analytics_no">Nann, avat</string>
<string name="snackbutton_analytics_settings">Arventennoù</string>
</resources>

View file

@ -213,8 +213,6 @@
<string name="label_experimental_settings_keybase_title">Proves de Keybase.io</string>
<string name="label_experimental_settings_keybase_summary">Contacta amb keybase.io per proves de clau i mostra-les cada vegada que es mostri una clau</string>
<string name="label_experimental_settings_theme_summary">(Les icones i moltes pantalles no estan encara ben ajustades per aquest tema fosc)</string>
<string name="label_settings_analytics_title">Permet estadístiques d\'ús anònim</string>
<string name="label_settings_analytics_summary">Si està habilitat, envia estadístiques d\'ús anònim per ajudar en la millora de la app</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Activa Tor</string>
<string name="pref_proxy_tor_summary">Requereix Orbot per a ser instal·lat</string>
@ -822,6 +820,4 @@
<string name="snack_keylist_clipboard_action">Visualitza</string>
<string name="notify_title_keysync">Actualitzant claus...</string>
<string name="keylist_header_anonymous">Anònim </string>
<string name="button_analytics_no">No, gràcies</string>
<string name="snackbutton_analytics_settings">Configuració</string>
</resources>

View file

@ -218,8 +218,6 @@
<string name="label_experimental_settings_keybase_title">Keybase.io Proofs</string>
<string name="label_experimental_settings_keybase_summary">Kontaktovat keybase.io pro proofs klíče a ukázat je pokaždé když je klíč zobrazen</string>
<string name="label_experimental_settings_theme_summary">(Ikony a mnoho obrazovek ještě nejsou uzpůsobené pro temné téma vzhledu)</string>
<string name="label_settings_analytics_title">Povolit anonymní statistiku využití</string>
<string name="label_settings_analytics_summary">Pokud povoleno, odešle anonymní statistiku o využívání za účelem vylepšení applikace</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Zapnout Tor</string>
<string name="pref_proxy_tor_summary">Vyžaduje instalovaný Orbot </string>
@ -1874,12 +1872,6 @@
<string name="keylist_item_key_id">Klíč ID: %s</string>
<string name="keylist_header_anonymous">Anonymní</string>
<string name="keylist_header_special">#</string>
<string name="dialog_analytics_consent">K zlepšení zkušenosti všech uživatelů, smí OpenKeychain sbírat anonymní statistiku o používání?\n\nVíce informací v <a href="https://openkeychain.org/help/privacy-policy">Ochraně údajů</a>.</string>
<string name="button_analytics_yes">Ano, chci pomoci!</string>
<string name="button_analytics_no">Ne, děkuji</string>
<string name="snack_analytics_accept">Díky za pomoc! Tuto volbu můžete změnit v nastavení.</string>
<string name="snack_analytics_reject">To je v pořádku, už se nezeptáme. Své rozhodnutí mužete změnit v nastavení.</string>
<string name="snackbutton_analytics_settings">Nastavení</string>
<string name="subkey_action_create">Založím podklíč</string>
<string name="subkey_action_revoke">Podklíč bude zrušen</string>
<string name="subkey_action_strip">Podklíč bude vyjmut</string>

View file

@ -227,5 +227,4 @@
<string name="key_gen_back">Tilbage</string>
<string name="key_gen_finish">Afslut</string>
<string name="snack_keylist_clipboard_action">Gennemse</string>
<string name="snackbutton_analytics_settings">Indstillinger</string>
</resources>

View file

@ -218,8 +218,6 @@
<string name="label_experimental_settings_keybase_title">Keybase.io-Nachweise</string>
<string name="label_experimental_settings_keybase_summary">Keybase.io für Schlüsselnachweise kontaktieren und diese jedesmal zeigen, wenn ein Schlüssel angezeigt wird</string>
<string name="label_experimental_settings_theme_summary">(Die Symbole und viele Bildschirme sind noch nicht an das dunkle Design angepasst)</string>
<string name="label_settings_analytics_title">Erlaube anonyme Benutzungsstatistiken</string>
<string name="label_settings_analytics_summary">Wenn aktiviert, sendet anonyme Benutzungsstatistiken, um dabei zu helfen, die App zu verbessern</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Tor aktivieren</string>
<string name="pref_proxy_tor_summary">Orbot muss installiert sein</string>
@ -1807,12 +1805,6 @@ Ein sicherer Schlüssel sollte eine Stärke von 2048 Bits besitzen.</string>
<string name="keylist_item_key_id">Key ID: %s</string>
<string name="keylist_header_anonymous">Anonym</string>
<string name="keylist_header_special">#</string>
<string name="dialog_analytics_consent">Um die Erfahrung aller Benutzer zu verbessen, soll OpenKeychain anonyme Benutzungsstatistiken sammeln dürfen?\n\nUm mehr zu erfahren, schau in unsere<a href="https://openkeychain.org/help/privacy-policy">Privatsphärenrichtlinien</a>.</string>
<string name="button_analytics_yes">Ja, ich möchte helfen!</string>
<string name="button_analytics_no">Nein, danke</string>
<string name="snack_analytics_accept">Vielen Dank für die Hilfe! Du kannst deine Entscheidung in den Einstellungen ändern.</string>
<string name="snack_analytics_reject">Das ist in Ordnung, wir werden nicht erneut fragen. Du kannst deine Entscheidung in den Einstellungen ändern.</string>
<string name="snackbutton_analytics_settings">Einstellungen</string>
<string name="subkey_action_create">Teilschlüssel wird erstellt werden</string>
<string name="subkey_action_revoke">Teilschlüssel wird widerrufen werden</string>
<string name="subkey_action_strip">Teilschlüssel wird entfernt werden</string>

View file

@ -299,6 +299,4 @@
<string name="snack_keylist_clipboard_action">Δείτε τα αποτελέσματα</string>
<string name="keylist_header_anonymous">Ανώνυμος</string>
<string name="keylist_header_special">#</string>
<string name="button_analytics_no">Όχι, ευχαριστώ</string>
<string name="snackbutton_analytics_settings">Ρυθμίσεις</string>
</resources>

View file

@ -176,5 +176,4 @@
<string name="key_gen_back">Reen</string>
<string name="key_gen_finish">Fini</string>
<string name="snack_keylist_clipboard_action">Rigardi</string>
<string name="snackbutton_analytics_settings">Agordoj</string>
</resources>

View file

@ -434,5 +434,4 @@
<string name="select_identity_cancel">Desactivar</string>
<string name="key_gen_back">Atrás</string>
<string name="snack_keylist_clipboard_action">Ve</string>
<string name="snackbutton_analytics_settings">Ajustes</string>
</resources>

View file

@ -218,8 +218,6 @@
<string name="label_experimental_settings_keybase_title">Comprobantes de Keybase.io</string>
<string name="label_experimental_settings_keybase_summary">Contacta con keybase.io para obtener comprobantes de clave y muestrelos cada vez que se muestra una clave</string>
<string name="label_experimental_settings_theme_summary">(Los iconos y algunas pantallas todavía no están ajustadas de acuerdo con el tema decorativo oscuro)</string>
<string name="label_settings_analytics_title">Permitir estadísticas de uso anónimas</string>
<string name="label_settings_analytics_summary">Si está habilitado, envía estadísticas de uso anónimas para ayudar a mejorar la app</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Habilitar Tor</string>
<string name="pref_proxy_tor_summary">Requiere que Orbot esté instalado</string>
@ -1804,12 +1802,6 @@
<string name="keylist_item_key_id">Identificación de la clave: %s</string>
<string name="keylist_header_anonymous">Anónimo</string>
<string name="keylist_header_special">#</string>
<string name="dialog_analytics_consent">Para mejorar la experiencia de todos los usuarios, ¿puede OpenKeychain recopilar estadísticas de uso anónimas? \n\n Para saber más, mira nuestra <a href="https://openkeychain.org/help/privacy-policy">Política de Privacidad</a>.</string>
<string name="button_analytics_yes">Si, quiero ayudar!</string>
<string name="button_analytics_no">No, gracias!</string>
<string name="snack_analytics_accept">Gracias por ayudar! Puede cambiar esta preferencia en la configuración.</string>
<string name="snack_analytics_reject">Está bien, no volveremos a preguntar. Puedes cambiar de opinión en la configuración.</string>
<string name="snackbutton_analytics_settings">Configuración</string>
<string name="subkey_action_create">La subclave será creada</string>
<string name="subkey_action_revoke">La subclave será revocada</string>
<string name="subkey_action_strip">La subclave será removida</string>

View file

@ -211,8 +211,7 @@
<string name="label_experimental_settings_desc_summary">Ezaugarri hauek ez dute amaitu edo erabiltzaile jarduera/segurtasun emaitzak erdietsita. Honela, ez dira beren segurtasunean ohinarritzen eta mesedez ez jakinarazi aurkitzen dituzun arazoak!</string>
<string name="label_experimental_settings_keybase_summary">Jarri harremanetan keybase.io giltzak probatzeko eta erakutsi hauek giltza bat erakusten den bakoitzean</string>
<string name="label_experimental_settings_theme_summary">(Ikurrak eta ikusleiho asko oraindik ez daude azalgai ilunarekin zehaztuta)</string>
<string name="label_settings_analytics_title">Ahalbidetu izengabeko estatistika erabilpena</string>
<!--Proxy Preferences-->
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Gaitu Tor</string>
<string name="pref_proxy_tor_summary">Orbot ezarrita egotea behar du</string>
<string name="pref_proxy_normal_title">Gaitu beste proxy bat</string>
@ -1552,9 +1551,6 @@
<string name="keylist_item_key_id">Giltza ID-a: %s</string>
<string name="keylist_header_anonymous">Izengabe</string>
<string name="keylist_header_special">#</string>
<string name="button_analytics_yes">Bai, laguntzea nahi dut!</string>
<string name="button_analytics_no">Ez, mila esker</string>
<string name="snackbutton_analytics_settings">Ezarpenak</string>
<string name="subkey_action_create">Azpigiltza sortuko da</string>
<string name="subkey_action_revoke">Azpigiltza ukatuko da</string>
<string name="subkey_action_expiry_never">Epemuga inoiz ez-ra aldatuko da</string>

View file

@ -430,6 +430,4 @@
<string name="snack_keylist_clipboard_action">مشاهده</string>
<string name="notify_title_keysync">درحال آپدیت‌کردن کلیدها...</string>
<string name="keylist_header_anonymous">ناشناس</string>
<string name="button_analytics_no">نه، ممنون</string>
<string name="snackbutton_analytics_settings">تنظیمات</string>
</resources>

View file

@ -381,5 +381,4 @@
<string name="snack_keylist_clipboard_action">Näkymä</string>
<string name="notify_title_keysync">Päivitetään avaimia...</string>
<string name="keylist_header_anonymous">Anonyymi</string>
<string name="snackbutton_analytics_settings">Asetukset</string>
</resources>

View file

@ -218,8 +218,6 @@
<string name="label_experimental_settings_keybase_title">Preuves keybase.io</string>
<string name="label_experimental_settings_keybase_summary">Contacter keybase.io pour obtenir des preuves de clé et les afficher chaque fois quune clé est affichée</string>
<string name="label_experimental_settings_theme_summary">(Les icônes et de nombreux écrans ne sont pas encore adaptés au thème sombre)</string>
<string name="label_settings_analytics_title">Autoriser les statistiques anonymes dutilisation</string>
<string name="label_settings_analytics_summary">Si cette option est activée, des statistiques anonymes d\'utilisation sont envoyées pour aider à améliorer lappli</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Activer Tor</string>
<string name="pref_proxy_tor_summary">Orbot doit être installé</string>
@ -1806,12 +1804,6 @@
<string name="keylist_item_key_id">ID de clé : %s</string>
<string name="keylist_header_anonymous">Anonyme</string>
<string name="keylist_header_special">#</string>
<string name="dialog_analytics_consent">Pour améliorer lexpérience de tous les utilisateurs, OpenKeychain peut-elle recueillir des statistiques anonymes dutilisation?\n\nPour en apprendre davantage, consultez notre <a href="https://openkeychain.org/help/privacy-policy">politique de confidentialité</a>.</string>
<string name="button_analytics_yes">Oui, je souhaite aider</string>
<string name="button_analytics_no">Non, merci</string>
<string name="snack_analytics_accept">Nous vous remercions de votre aide. Vous pouvez changer cette préférence dans vos paramètres.</string>
<string name="snack_analytics_reject">Très bien, nous ne vous le demanderons plus. Vous pouvez changer cette préférence dans les paramètres.</string>
<string name="snackbutton_analytics_settings">Paramètres</string>
<string name="subkey_action_create">Une sous-clé sera créée</string>
<string name="subkey_action_revoke">La sous-clé sera révoquée</string>
<string name="subkey_action_strip">La sous-clé sera dépouillée</string>

View file

@ -217,8 +217,6 @@
<string name="label_experimental_settings_keybase_title">probas de Keybase.io</string>
<string name="label_experimental_settings_keybase_summary">Pedirlle probas de chave a keybase.io e expoñelas cada vez que se mostra a chave</string>
<string name="label_experimental_settings_theme_summary">(As iconas e moitas pantallas non están aínda ben axustadas ao decorado oscuro)</string>
<string name="label_settings_analytics_title">Permitir estátisticas anónimas sobre o uso</string>
<string name="label_settings_analytics_summary">Se está habilitado, envía estatísticas anónimas sobre o uso para axudar a mellorar a app.</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Habilitar Tor</string>
<string name="pref_proxy_tor_summary">Precisa instalar Orbot</string>
@ -1487,5 +1485,4 @@
<string name="keylist_item_key_id">ID da Chave: %s</string>
<string name="keylist_header_anonymous">Anónimo</string>
<string name="keylist_header_special">#</string>
<string name="snackbutton_analytics_settings">Axustes</string>
</resources>

View file

@ -295,5 +295,4 @@
<string name="token_unlock_ok">લોક ખોલો</string>
<string name="select_identity_cancel">નિષ્ક્રિય કરો</string>
<string name="key_gen_back">પહેલાનું</string>
<string name="snackbutton_analytics_settings">સેટિંગ્સ</string>
</resources>

View file

@ -214,6 +214,4 @@
<string name="key_gen_back">पिछला</string>
<string name="key_gen_finish">समाप्त</string>
<string name="snack_keylist_clipboard_action">राय</string>
<string name="button_analytics_no">जी नहीं, धन्यवाद</string>
<string name="snackbutton_analytics_settings">सेटिंग्स</string>
</resources>

View file

@ -218,8 +218,6 @@
<string name="label_experimental_settings_keybase_title">Keybase.io igazolások</string>
<string name="label_experimental_settings_keybase_summary">Kapcsolatfelvétel a keybase.io-val a kulcsigazolásokért, és megtekintés minden alkalommal, amikor egy kulcs megjelenik</string>
<string name="label_experimental_settings_theme_summary">(Az ikonok és számos képernyő még nem lett hozzáigazítva a sötét témához)</string>
<string name="label_settings_analytics_title">Névtelen használati statisztikák engedélyezése</string>
<string name="label_settings_analytics_summary">Ha engedélyezve van, akkor névtelen használati statisztikákat küld, hogy segítsen az alkalmazás továbbfejlesztésében </string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Tor engedélyezése</string>
<string name="pref_proxy_tor_summary">Az Orbot telepítése szükséges</string>
@ -743,9 +741,6 @@
<string name="keylist_item_key_id">Kulcsazonosító: %s</string>
<string name="keylist_header_anonymous">Anoním / Névtelen</string>
<string name="keylist_header_special">#</string>
<string name="button_analytics_yes">Igen, szeretnék segíteni!</string>
<string name="button_analytics_no">Köszönöm, nem</string>
<string name="snackbutton_analytics_settings">Beállítások</string>
<string name="subkey_action_create">Az alkulcs létrehozásra kerül</string>
<string name="subkey_action_revoke">Az alkulcs visszavonásra kerül</string>
<string name="subkey_action_expiry_never">A lejárat sohára változik</string>

View file

@ -249,5 +249,4 @@
<string name="snack_keylist_clipboard_action">Lihat</string>
<string name="keylist_header_anonymous">Anonim</string>
<string name="keylist_header_special"># </string>
<string name="snackbutton_analytics_settings">Pengaturan</string>
</resources>

View file

@ -1177,6 +1177,4 @@
<string name="keylist_item_key_id">ID chiave: %s</string>
<string name="keylist_header_anonymous">Anonimo</string>
<string name="keylist_header_special">#</string>
<string name="button_analytics_no">No, grazie</string>
<string name="snackbutton_analytics_settings">Impostazioni</string>
</resources>

View file

@ -218,8 +218,6 @@
<string name="label_experimental_settings_keybase_title">Keybase.io 検証</string>
<string name="label_experimental_settings_keybase_summary">鍵の検証のためkeybase.ioに連絡し、鍵が表示されるたびに表示します</string>
<string name="label_experimental_settings_theme_summary">(アイコンおよび多くの画面は、まだダークテーマに応じて調整されていません)</string>
<string name="label_settings_analytics_title">匿名の使用統計データの送信を許可する</string>
<string name="label_settings_analytics_summary">有効にすると、アプリの改善に役立つ匿名の使用統計データが送信されます</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Torを有効</string>
<string name="pref_proxy_tor_summary">Orbotのインストールが要求されます</string>
@ -1776,12 +1774,6 @@
<string name="keylist_item_key_id">鍵 ID: %s</string>
<string name="keylist_header_anonymous">匿名</string>
<string name="keylist_header_special">#</string>
<string name="dialog_analytics_consent">すべてのユーザーのエクスペリエンスを改善するために、OpenKeychainの匿名の使用統計データを送信していただけますか\n\n詳細については、<a href="https://openkeychain.org/help/privacy-policy">プライバシーポリシー</a>をご覧ください。</string>
<string name="button_analytics_yes">はい、匿名の使用統計データを送信して応援します!</string>
<string name="button_analytics_no">いいえ、使用統計データを送信しません。</string>
<string name="snack_analytics_accept">応援をありがとうございます! この設定は「設定」で変更できます。</string>
<string name="snack_analytics_reject">大丈夫です、今後お尋ねしないようにします。「設定」でこの設定を変更できます。</string>
<string name="snackbutton_analytics_settings">設定</string>
<string name="subkey_action_create">サブキーが作成されます</string>
<string name="subkey_action_revoke">サブキーは取り消されます</string>
<string name="subkey_action_strip">サブキーは削除されます</string>

View file

@ -207,8 +207,7 @@
<string name="label_experimental_settings_desc_summary">이 기능들은 아직 완성되지 않았거나 유저 경험/보안 연구의 결과가 아닙니다. 그러니 이 기능의 보안성에 의존하거나 겪는 문제를 보고하지 말아주세요!</string>
<string name="label_experimental_settings_keybase_summary">keybase.io에 연결해서 키가 표시될 때 마다 키 증명을 표시</string>
<string name="label_experimental_settings_theme_summary">(아이콘이나 많은 화면이 검은 테마에 알맞게 아직 조정되지 않았습니다)</string>
<string name="label_settings_analytics_title">익명 사용 통계 허가</string>
<!--Proxy Preferences-->
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Tor 활성화</string>
<string name="pref_proxy_tor_summary">Orbot이 설치되어 있어야 합니다.</string>
<string name="pref_proxy_normal_title">다른 프록시 활성화</string>
@ -896,10 +895,4 @@
<string name="snack_keylist_clipboard_action">보기</string>
<string name="notify_title_keysync">키를 업데이트 중...</string>
<string name="keylist_header_anonymous">익명</string>
<string name="dialog_analytics_consent">모든 사용자의 경험을 개선하기 위해서 OpenKeychain가 익명 사용 데이터를 수집하는걸 허가 하시겠습니까?\n\n더 많은 정보는 저희의 <a href="https://openkeychain.org/help/privacy-policy">개인정보 보호정책</a>을 참고하십시오.</string>
<string name="button_analytics_yes">예, 돕겠습니다!</string>
<string name="button_analytics_no">아니요</string>
<string name="snack_analytics_accept">도와주셔서 감사합니다! 설정에서 언제든지 변경하실 수 있습니다.</string>
<string name="snack_analytics_reject">괜찮습니다. 이제 표시하지 않습니다. 마음이 바뀌신다면 설정에서 변경하실 수 있습니다.</string>
<string name="snackbutton_analytics_settings">설정</string>
</resources>

View file

@ -164,5 +164,4 @@
<string name="select_identity_cancel">പ്രവർത്തനരഹിതമാക്കു </string>
<string name="key_gen_back">പിന്നോട്ട്</string>
<string name="snack_keylist_clipboard_action">കാണുക</string>
<string name="snackbutton_analytics_settings">സെറ്റിംഗ്സ് </string>
</resources>

View file

@ -869,6 +869,4 @@
<string name="notify_title_keysync">oppdaterer nøkler…</string>
<string name="keylist_item_key_id">Nøkkel-ID: %s</string>
<string name="keylist_header_anonymous">Anonym</string>
<string name="button_analytics_no">Nei takk</string>
<string name="snackbutton_analytics_settings">Innstillinger</string>
</resources>

View file

@ -218,8 +218,6 @@
<string name="label_experimental_settings_keybase_title">Keybase.io-bewijzen</string>
<string name="label_experimental_settings_keybase_summary">Maak contact met keybase.io voor bevestigingen van sleutels en toon deze telkens wanneer een sleutel wordt weergegeven</string>
<string name="label_experimental_settings_theme_summary">(De pictogrammen en veel schermen zijn nog niet geoptimaliseerd voor het donkere thema)</string>
<string name="label_settings_analytics_title">Anonieme gebruikersstatistieken toestaan</string>
<string name="label_settings_analytics_summary">Indien ingeschakeld worden er anonieme gebruikersstatistieken verzonden om de app te verbeteren</string>
<!--Proxy Preferences-->
<string name="pref_proxy_tor_title">Tor inschakelen</string>
<string name="pref_proxy_tor_summary">Vereist dat Orbot geïnstalleerd is</string>
@ -1804,12 +1802,6 @@
<string name="keylist_item_key_id">Sleutel-ID: %s</string>