From 7154159a3623180570cc4122fd4cb2efacf9e1c5 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 5 Sep 2020 14:14:05 +0200 Subject: [PATCH 1/8] analytics: remove --- OpenKeychain/build.gradle | 3 - .../keychain/Constants.java | 14 -- .../keychain/KeychainApplication.java | 10 - .../analytics/AnalyticsConsentRequester.java | 95 --------- .../keychain/analytics/AnalyticsManager.java | 180 ------------------ .../keychain/remote/OpenPgpService.java | 21 +- .../remote/SshAuthenticationService.java | 14 +- .../keychain/service/KeychainServiceTask.java | 15 +- .../keychain/ui/KeyListFragment.java | 3 - .../keychain/ui/MainActivity.java | 15 +- .../keychain/ui/SettingsActivity.java | 14 +- .../keychain/ui/ViewKeyAdvActivity.java | 26 +-- .../keychain/util/Preferences.java | 24 --- .../src/main/res/values-ar/strings.xml | 2 - .../src/main/res/values-br/strings.xml | 2 - .../src/main/res/values-ca/strings.xml | 4 - .../src/main/res/values-cs/strings.xml | 8 - .../src/main/res/values-da/strings.xml | 1 - .../src/main/res/values-de/strings.xml | 8 - .../src/main/res/values-el/strings.xml | 2 - .../src/main/res/values-eo/strings.xml | 1 - .../src/main/res/values-es-rMX/strings.xml | 1 - .../src/main/res/values-es/strings.xml | 8 - .../src/main/res/values-eu/strings.xml | 6 +- .../src/main/res/values-fa/strings.xml | 2 - .../src/main/res/values-fi/strings.xml | 1 - .../src/main/res/values-fr/strings.xml | 8 - .../src/main/res/values-gl/strings.xml | 3 - .../src/main/res/values-gu/strings.xml | 1 - .../src/main/res/values-hi/strings.xml | 2 - .../src/main/res/values-hu/strings.xml | 5 - .../src/main/res/values-id/strings.xml | 1 - .../src/main/res/values-it/strings.xml | 2 - .../src/main/res/values-ja/strings.xml | 8 - .../src/main/res/values-ko/strings.xml | 9 +- .../src/main/res/values-ml/strings.xml | 1 - .../src/main/res/values-nb/strings.xml | 2 - .../src/main/res/values-nl-rBE/strings.xml | 8 - .../src/main/res/values-nl/strings.xml | 8 - .../src/main/res/values-pl/strings.xml | 8 - .../src/main/res/values-pt-rBR/strings.xml | 8 - .../src/main/res/values-ro/strings.xml | 1 - .../src/main/res/values-ru/strings.xml | 8 - .../src/main/res/values-sl/strings.xml | 3 +- .../src/main/res/values-sr/strings.xml | 1 - .../src/main/res/values-sv/strings.xml | 8 - .../src/main/res/values-te/strings.xml | 1 - .../src/main/res/values-th/strings.xml | 1 - .../src/main/res/values-tr/strings.xml | 2 - .../src/main/res/values-uk/strings.xml | 12 +- .../src/main/res/values-vi/strings.xml | 1 - .../src/main/res/values-zh-rTW/strings.xml | 6 +- .../src/main/res/values-zh/strings.xml | 8 - OpenKeychain/src/main/res/values/strings.xml | 10 - .../main/res/xml/experimental_preferences.xml | 7 - 55 files changed, 35 insertions(+), 588 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 3ea7e058d..9a42b4cc4 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -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') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index c1e83c150..57d2e160f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -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 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); } /** diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 845d0c055..e7bd7d823 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -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(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java deleted file mode 100644 index 15fe9a304..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java +++ /dev/null @@ -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.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); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java deleted file mode 100644 index 0d51a6a99..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsManager.java +++ /dev/null @@ -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(); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index 7e4514fa4..daf5d4fd1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -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); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java index a82f0e5f7..670bda19e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java @@ -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 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); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java index 9dc0a9c37..af82d87f9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java @@ -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); } 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 4c1c30336..4b26c337d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -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> liveData = viewModel.getGenericLiveData(requireContext(), this::loadFlexibleKeyItems); liveData.observe(this, this::onLoadKeyItems); - - AnalyticsConsentRequester.getInstance(activity).maybeAskForAnalytics(); } @WorkerThread diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java index faec8217f..0ce5fe274 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java @@ -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); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java index 2e8a14fae..f5ab1ea69 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java @@ -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) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java index 65295caf7..821ca8e3f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java @@ -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 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 de0c15306..1f5451f97 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -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(); diff --git a/OpenKeychain/src/main/res/values-ar/strings.xml b/OpenKeychain/src/main/res/values-ar/strings.xml index 346eb87c8..7db0b8351 100644 --- a/OpenKeychain/src/main/res/values-ar/strings.xml +++ b/OpenKeychain/src/main/res/values-ar/strings.xml @@ -686,7 +686,5 @@ مفتاح %d / %d مجهول # - لا، شكراً - الإعدادات شارك المفتاح diff --git a/OpenKeychain/src/main/res/values-br/strings.xml b/OpenKeychain/src/main/res/values-br/strings.xml index 0a70d6aa1..b48c8ee0a 100644 --- a/OpenKeychain/src/main/res/values-br/strings.xml +++ b/OpenKeychain/src/main/res/values-br/strings.xml @@ -167,6 +167,4 @@ Kas Emporzhiañ Anonymous - Nann, avat - Arventennoù diff --git a/OpenKeychain/src/main/res/values-ca/strings.xml b/OpenKeychain/src/main/res/values-ca/strings.xml index dbee9d4a5..bf88c38b0 100644 --- a/OpenKeychain/src/main/res/values-ca/strings.xml +++ b/OpenKeychain/src/main/res/values-ca/strings.xml @@ -213,8 +213,6 @@ Proves de Keybase.io Contacta amb keybase.io per proves de clau i mostra-les cada vegada que es mostri una clau (Les icones i moltes pantalles no estan encara ben ajustades per aquest tema fosc) - Permet estadístiques d\'ús anònim - Si està habilitat, envia estadístiques d\'ús anònim per ajudar en la millora de la app Activa Tor Requereix Orbot per a ser instal·lat @@ -822,6 +820,4 @@ Visualitza Actualitzant claus... Anònim - No, gràcies - Configuració diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml index 27806d243..816d4ef61 100644 --- a/OpenKeychain/src/main/res/values-cs/strings.xml +++ b/OpenKeychain/src/main/res/values-cs/strings.xml @@ -218,8 +218,6 @@ Keybase.io Proofs Kontaktovat keybase.io pro proofs klíče a ukázat je pokaždé když je klíč zobrazen (Ikony a mnoho obrazovek ještě nejsou uzpůsobené pro temné téma vzhledu) - Povolit anonymní statistiku využití - Pokud povoleno, odešle anonymní statistiku o využívání za účelem vylepšení applikace Zapnout Tor Vyžaduje instalovaný Orbot @@ -1874,12 +1872,6 @@ Klíč ID: %s Anonymní # - K zlepšení zkušenosti všech uživatelů, smí OpenKeychain sbírat anonymní statistiku o používání?\n\nVíce informací v Ochraně údajů. - Ano, chci pomoci! - Ne, děkuji - Díky za pomoc! Tuto volbu můžete změnit v nastavení. - To je v pořádku, už se nezeptáme. Své rozhodnutí mužete změnit v nastavení. - Nastavení Založím podklíč Podklíč bude zrušen Podklíč bude vyjmut diff --git a/OpenKeychain/src/main/res/values-da/strings.xml b/OpenKeychain/src/main/res/values-da/strings.xml index f9bb3d7fb..3c06729d7 100644 --- a/OpenKeychain/src/main/res/values-da/strings.xml +++ b/OpenKeychain/src/main/res/values-da/strings.xml @@ -227,5 +227,4 @@ Tilbage Afslut Gennemse - Indstillinger diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml index b8b7f9799..d9e9ca0cc 100644 --- a/OpenKeychain/src/main/res/values-de/strings.xml +++ b/OpenKeychain/src/main/res/values-de/strings.xml @@ -218,8 +218,6 @@ Keybase.io-Nachweise Keybase.io für Schlüsselnachweise kontaktieren und diese jedesmal zeigen, wenn ein Schlüssel angezeigt wird (Die Symbole und viele Bildschirme sind noch nicht an das dunkle Design angepasst) - Erlaube anonyme Benutzungsstatistiken - Wenn aktiviert, sendet anonyme Benutzungsstatistiken, um dabei zu helfen, die App zu verbessern Tor aktivieren Orbot muss installiert sein @@ -1807,12 +1805,6 @@ Ein sicherer Schlüssel sollte eine Stärke von 2048 Bits besitzen. Key ID: %s Anonym # - Um die Erfahrung aller Benutzer zu verbessen, soll OpenKeychain anonyme Benutzungsstatistiken sammeln dürfen?\n\nUm mehr zu erfahren, schau in unserePrivatsphärenrichtlinien. - Ja, ich möchte helfen! - Nein, danke - Vielen Dank für die Hilfe! Du kannst deine Entscheidung in den Einstellungen ändern. - Das ist in Ordnung, wir werden nicht erneut fragen. Du kannst deine Entscheidung in den Einstellungen ändern. - Einstellungen Teilschlüssel wird erstellt werden Teilschlüssel wird widerrufen werden Teilschlüssel wird entfernt werden diff --git a/OpenKeychain/src/main/res/values-el/strings.xml b/OpenKeychain/src/main/res/values-el/strings.xml index e9ad368b2..dbf747f7e 100644 --- a/OpenKeychain/src/main/res/values-el/strings.xml +++ b/OpenKeychain/src/main/res/values-el/strings.xml @@ -299,6 +299,4 @@ Δείτε τα αποτελέσματα Ανώνυμος # - Όχι, ευχαριστώ - Ρυθμίσεις diff --git a/OpenKeychain/src/main/res/values-eo/strings.xml b/OpenKeychain/src/main/res/values-eo/strings.xml index 1041b36e2..552910092 100644 --- a/OpenKeychain/src/main/res/values-eo/strings.xml +++ b/OpenKeychain/src/main/res/values-eo/strings.xml @@ -176,5 +176,4 @@ Reen Fini Rigardi - Agordoj diff --git a/OpenKeychain/src/main/res/values-es-rMX/strings.xml b/OpenKeychain/src/main/res/values-es-rMX/strings.xml index 0d9b6e4f6..b65004e8e 100644 --- a/OpenKeychain/src/main/res/values-es-rMX/strings.xml +++ b/OpenKeychain/src/main/res/values-es-rMX/strings.xml @@ -434,5 +434,4 @@ Desactivar Atrás Ve - Ajustes diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml index 625afabe9..fc9d25e3f 100644 --- a/OpenKeychain/src/main/res/values-es/strings.xml +++ b/OpenKeychain/src/main/res/values-es/strings.xml @@ -218,8 +218,6 @@ Comprobantes de Keybase.io Contacta con keybase.io para obtener comprobantes de clave y muestrelos cada vez que se muestra una clave (Los iconos y algunas pantallas todavía no están ajustadas de acuerdo con el tema decorativo oscuro) - Permitir estadísticas de uso anónimas - Si está habilitado, envía estadísticas de uso anónimas para ayudar a mejorar la app Habilitar Tor Requiere que Orbot esté instalado @@ -1804,12 +1802,6 @@ Identificación de la clave: %s Anónimo # - 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 Política de Privacidad. - Si, quiero ayudar! - No, gracias! - Gracias por ayudar! Puede cambiar esta preferencia en la configuración. - Está bien, no volveremos a preguntar. Puedes cambiar de opinión en la configuración. - Configuración La subclave será creada La subclave será revocada La subclave será removida diff --git a/OpenKeychain/src/main/res/values-eu/strings.xml b/OpenKeychain/src/main/res/values-eu/strings.xml index d5b315b3a..0ce526c52 100644 --- a/OpenKeychain/src/main/res/values-eu/strings.xml +++ b/OpenKeychain/src/main/res/values-eu/strings.xml @@ -211,8 +211,7 @@ Ezaugarri hauek ez dute amaitu edo erabiltzaile jarduera/segurtasun emaitzak erdietsita. Honela, ez dira beren segurtasunean ohinarritzen eta mesedez ez jakinarazi aurkitzen dituzun arazoak! Jarri harremanetan keybase.io giltzak probatzeko eta erakutsi hauek giltza bat erakusten den bakoitzean (Ikurrak eta ikusleiho asko oraindik ez daude azalgai ilunarekin zehaztuta) - Ahalbidetu izengabeko estatistika erabilpena - + Gaitu Tor Orbot ezarrita egotea behar du Gaitu beste proxy bat @@ -1552,9 +1551,6 @@ Giltza ID-a: %s Izengabe # - Bai, laguntzea nahi dut! - Ez, mila esker - Ezarpenak Azpigiltza sortuko da Azpigiltza ukatuko da Epemuga inoiz ez-ra aldatuko da diff --git a/OpenKeychain/src/main/res/values-fa/strings.xml b/OpenKeychain/src/main/res/values-fa/strings.xml index 4b4bf09d2..93f96bf4d 100644 --- a/OpenKeychain/src/main/res/values-fa/strings.xml +++ b/OpenKeychain/src/main/res/values-fa/strings.xml @@ -430,6 +430,4 @@ مشاهده درحال آپدیت‌کردن کلیدها... ناشناس - نه، ممنون - تنظیمات diff --git a/OpenKeychain/src/main/res/values-fi/strings.xml b/OpenKeychain/src/main/res/values-fi/strings.xml index 13affc272..d3e54b7a3 100644 --- a/OpenKeychain/src/main/res/values-fi/strings.xml +++ b/OpenKeychain/src/main/res/values-fi/strings.xml @@ -381,5 +381,4 @@ Näkymä Päivitetään avaimia... Anonyymi - Asetukset diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index 483d98600..31c3311f2 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -218,8 +218,6 @@ Preuves keybase.io Contacter keybase.io pour obtenir des preuves de clé et les afficher chaque fois qu’une clé est affichée (Les icônes et de nombreux écrans ne sont pas encore adaptés au thème sombre) - Autoriser les statistiques anonymes d’utilisation - Si cette option est activée, des statistiques anonymes d\'utilisation sont envoyées pour aider à améliorer l’appli Activer Tor Orbot doit être installé @@ -1806,12 +1804,6 @@ ID de clé : %s Anonyme # - Pour améliorer l’expérience de tous les utilisateurs, OpenKeychain peut-elle recueillir des statistiques anonymes d’utilisation ?\n\nPour en apprendre davantage, consultez notre politique de confidentialité. - Oui, je souhaite aider - Non, merci - Nous vous remercions de votre aide. Vous pouvez changer cette préférence dans vos paramètres. - Très bien, nous ne vous le demanderons plus. Vous pouvez changer cette préférence dans les paramètres. - Paramètres Une sous-clé sera créée La sous-clé sera révoquée La sous-clé sera dépouillée diff --git a/OpenKeychain/src/main/res/values-gl/strings.xml b/OpenKeychain/src/main/res/values-gl/strings.xml index 4e5b17d97..35927297c 100644 --- a/OpenKeychain/src/main/res/values-gl/strings.xml +++ b/OpenKeychain/src/main/res/values-gl/strings.xml @@ -217,8 +217,6 @@ probas de Keybase.io Pedirlle probas de chave a keybase.io e expoñelas cada vez que se mostra a chave (As iconas e moitas pantallas non están aínda ben axustadas ao decorado oscuro) - Permitir estátisticas anónimas sobre o uso - Se está habilitado, envía estatísticas anónimas sobre o uso para axudar a mellorar a app. Habilitar Tor Precisa instalar Orbot @@ -1487,5 +1485,4 @@ ID da Chave: %s Anónimo # - Axustes diff --git a/OpenKeychain/src/main/res/values-gu/strings.xml b/OpenKeychain/src/main/res/values-gu/strings.xml index 36d62b6b4..5b26f35ec 100644 --- a/OpenKeychain/src/main/res/values-gu/strings.xml +++ b/OpenKeychain/src/main/res/values-gu/strings.xml @@ -295,5 +295,4 @@ લોક ખોલો નિષ્ક્રિય કરો પહેલાનું - સેટિંગ્સ diff --git a/OpenKeychain/src/main/res/values-hi/strings.xml b/OpenKeychain/src/main/res/values-hi/strings.xml index e018f5033..b3a409f45 100644 --- a/OpenKeychain/src/main/res/values-hi/strings.xml +++ b/OpenKeychain/src/main/res/values-hi/strings.xml @@ -214,6 +214,4 @@ पिछला समाप्त राय - जी नहीं, धन्यवाद - सेटिंग्स diff --git a/OpenKeychain/src/main/res/values-hu/strings.xml b/OpenKeychain/src/main/res/values-hu/strings.xml index b9748de2f..23cdfd3bf 100644 --- a/OpenKeychain/src/main/res/values-hu/strings.xml +++ b/OpenKeychain/src/main/res/values-hu/strings.xml @@ -218,8 +218,6 @@ Keybase.io igazolások Kapcsolatfelvétel a keybase.io-val a kulcsigazolásokért, és megtekintés minden alkalommal, amikor egy kulcs megjelenik (Az ikonok és számos képernyő még nem lett hozzáigazítva a sötét témához) - Névtelen használati statisztikák engedélyezése - Ha engedélyezve van, akkor névtelen használati statisztikákat küld, hogy segítsen az alkalmazás továbbfejlesztésében Tor engedélyezése Az Orbot telepítése szükséges @@ -743,9 +741,6 @@ Kulcsazonosító: %s Anoním / Névtelen # - Igen, szeretnék segíteni! - Köszönöm, nem - Beállítások Az alkulcs létrehozásra kerül Az alkulcs visszavonásra kerül A lejárat sohára változik diff --git a/OpenKeychain/src/main/res/values-id/strings.xml b/OpenKeychain/src/main/res/values-id/strings.xml index d5845d945..7444c20d8 100644 --- a/OpenKeychain/src/main/res/values-id/strings.xml +++ b/OpenKeychain/src/main/res/values-id/strings.xml @@ -249,5 +249,4 @@ Lihat Anonim # - Pengaturan diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml index a9d7ce398..6e8273515 100644 --- a/OpenKeychain/src/main/res/values-it/strings.xml +++ b/OpenKeychain/src/main/res/values-it/strings.xml @@ -1177,6 +1177,4 @@ ID chiave: %s Anonimo # - No, grazie - Impostazioni diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index c3f3ff898..ef9dfbdfa 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -218,8 +218,6 @@ Keybase.io 検証 鍵の検証のためkeybase.ioに連絡し、鍵が表示されるたびに表示します (アイコンおよび多くの画面は、まだダークテーマに応じて調整されていません) - 匿名の使用統計データの送信を許可する - 有効にすると、アプリの改善に役立つ匿名の使用統計データが送信されます Torを有効 Orbotのインストールが要求されます @@ -1776,12 +1774,6 @@ 鍵 ID: %s 匿名 # - すべてのユーザーのエクスペリエンスを改善するために、OpenKeychainの匿名の使用統計データを送信していただけますか?\n\n詳細については、プライバシーポリシーをご覧ください。 - はい、匿名の使用統計データを送信して応援します! - いいえ、使用統計データを送信しません。 - 応援をありがとうございます! この設定は「設定」で変更できます。 - 大丈夫です、今後お尋ねしないようにします。「設定」でこの設定を変更できます。 - 設定 サブキーが作成されます サブキーは取り消されます サブキーは削除されます diff --git a/OpenKeychain/src/main/res/values-ko/strings.xml b/OpenKeychain/src/main/res/values-ko/strings.xml index 3e6f84e3f..f219a4076 100644 --- a/OpenKeychain/src/main/res/values-ko/strings.xml +++ b/OpenKeychain/src/main/res/values-ko/strings.xml @@ -207,8 +207,7 @@ 이 기능들은 아직 완성되지 않았거나 유저 경험/보안 연구의 결과가 아닙니다. 그러니 이 기능의 보안성에 의존하거나 겪는 문제를 보고하지 말아주세요! keybase.io에 연결해서 키가 표시될 때 마다 키 증명을 표시 (아이콘이나 많은 화면이 검은 테마에 알맞게 아직 조정되지 않았습니다) - 익명 사용 통계 허가 - + Tor 활성화 Orbot이 설치되어 있어야 합니다. 다른 프록시 활성화 @@ -896,10 +895,4 @@ 보기 키를 업데이트 중... 익명 - 모든 사용자의 경험을 개선하기 위해서 OpenKeychain가 익명 사용 데이터를 수집하는걸 허가 하시겠습니까?\n\n더 많은 정보는 저희의 개인정보 보호정책을 참고하십시오. - 예, 돕겠습니다! - 아니요 - 도와주셔서 감사합니다! 설정에서 언제든지 변경하실 수 있습니다. - 괜찮습니다. 이제 표시하지 않습니다. 마음이 바뀌신다면 설정에서 변경하실 수 있습니다. - 설정 diff --git a/OpenKeychain/src/main/res/values-ml/strings.xml b/OpenKeychain/src/main/res/values-ml/strings.xml index 4dc5120b6..980b83ef1 100644 --- a/OpenKeychain/src/main/res/values-ml/strings.xml +++ b/OpenKeychain/src/main/res/values-ml/strings.xml @@ -164,5 +164,4 @@ പ്രവർത്തനരഹിതമാക്കു പിന്നോട്ട് കാണുക - സെറ്റിംഗ്സ് diff --git a/OpenKeychain/src/main/res/values-nb/strings.xml b/OpenKeychain/src/main/res/values-nb/strings.xml index f25347683..5911b5878 100644 --- a/OpenKeychain/src/main/res/values-nb/strings.xml +++ b/OpenKeychain/src/main/res/values-nb/strings.xml @@ -869,6 +869,4 @@ oppdaterer nøkler… Nøkkel-ID: %s Anonym - Nei takk - Innstillinger diff --git a/OpenKeychain/src/main/res/values-nl-rBE/strings.xml b/OpenKeychain/src/main/res/values-nl-rBE/strings.xml index a2f489343..d9d3b947f 100644 --- a/OpenKeychain/src/main/res/values-nl-rBE/strings.xml +++ b/OpenKeychain/src/main/res/values-nl-rBE/strings.xml @@ -218,8 +218,6 @@ Keybase.io-bewijzen Maak contact met keybase.io voor bevestigingen van sleutels en toon deze telkens wanneer een sleutel wordt weergegeven (De pictogrammen en veel schermen zijn nog niet geoptimaliseerd voor het donkere thema) - Anonieme gebruikersstatistieken toestaan - Indien ingeschakeld worden er anonieme gebruikersstatistieken verzonden om de app te verbeteren Tor inschakelen Vereist dat Orbot geïnstalleerd is @@ -1804,12 +1802,6 @@ Sleutel-ID: %s Anoniem # - Mag OpenKeychain gebruikersstatistieken verzamelen om de ervaring voor alle gebruikers te verbeteren?\n\nVoor meer informatie, zie ons privacybeleid. - Ja, ik wil helpen! - Nee, bedankt - Bedankt voor de hulp! Je kan deze voorkeur veranderen in de instellingen. - Geen probleem, we zullen het niet opnieuw vragen. Je kan van gedachten veranderen in de instellingen. - Instellingen Subsleutel zal worden aangemaakt Subsleutel zal worden ingetrokken Subsleutel zal worden gestript diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml index 30449a8d1..e3508df85 100644 --- a/OpenKeychain/src/main/res/values-nl/strings.xml +++ b/OpenKeychain/src/main/res/values-nl/strings.xml @@ -218,8 +218,6 @@ Keybase.io-bewijzen Maak contact met keybase.io voor bevestigingen van sleutels en weergeef dit elke keer als een sleutel wordt weer gegeven (De pictogrammen en veel schermen zijn nog niet geoptimaliseerd voor het donkere thema) - Sta anonieme gebruikersstatistieken toe - Indien ingeschakeld worden er anonieme gebruikersstatistieken verzonden om de app te verbeteren Tor inschakelen Vereist dat Orbot geïnstalleerd is @@ -1806,12 +1804,6 @@ Sleutel-ID: %s Anoniem # - Mag OpenKeychain gebruikersstatistieken verzamelen om de ervaring voor alle gebruikers te verbeteren?\n\nVoor meer informatie, zie ons privacybeleid. - Ja, ik wil meehelpen! - Nee, bedankt - Bedankt voor de hulp! Je kan deze voorkeur veranderen in de instellingen. - Geen probleem, we zullen het niet opnieuw vragen. Je kan van gedachten veranderen in de instellingen. - Instellingen Subsleutel zal worden aangemaakt Subsleutel zal worden ingetrokken Subsleutel zal worden gestript diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml index 9f7e0d34d..3b8d6db21 100644 --- a/OpenKeychain/src/main/res/values-pl/strings.xml +++ b/OpenKeychain/src/main/res/values-pl/strings.xml @@ -218,8 +218,6 @@ Dowody keybase.io Sprawdź keybase.io dla dowodów kluczy i pokaż je za każdym razem kiedy klucz jest wyświetlany (Ikony i ekrany nie są jeszcze dostosowane do ciemnego motywu) - Zezwalaj na anonimowe statystyki użycia - Jeśli jest włączone wysyła anonimowe statystyki użycia aby pomóc w ulepszaniu aplikacji Włącz Tora Wymaga Orbota @@ -1872,12 +1870,6 @@ ID Klucza: %s Anonimowy # - Czy aby polepszyć doświadczenia użytkowników, OpenKeychain może zbierać anonimowe dane użytkowania?\n\nAby dowiedzieć się więcej zobacz naszą Politykę Prywatności. - Tak, chcę pomóc! - Nie, dzięki - Dziękujemy za pomoc! Możesz zmienić to ustawienie w opcjach. - Dobrze, nie zapytamy więcej. Możesz zmienić to ustawienie w opcjach. - Ustawienia Podklucz zostanie utworzony Podklucz zostanie unieważniony Podklucz zostanie wyczyszony diff --git a/OpenKeychain/src/main/res/values-pt-rBR/strings.xml b/OpenKeychain/src/main/res/values-pt-rBR/strings.xml index 4b51f02c3..662cba02c 100644 --- a/OpenKeychain/src/main/res/values-pt-rBR/strings.xml +++ b/OpenKeychain/src/main/res/values-pt-rBR/strings.xml @@ -218,8 +218,6 @@ Provas Keybase.io Contate o keybase.io para as provas de chaves e mostre-as toda vez que uma chave for exibida (Os ícones e algumas telas ainda não foram adaptados para o tema escuro) - Permitir estatísticas anônimas de uso - Se habilitado, envia estatísticas anônimas de uso para ajudar a melhorar a aplicação Ativar Tor Requer que o Orbot esteja instalado @@ -1804,12 +1802,6 @@ ID da Chave: %s Anônimo # - Para melhorar a experiência para todos os usuários, o OpenKeychain pode coletar estatísticas anônimas de uso?\n\nPara saber mais, consulte nossa Política de Privacidade. - Sim, eu quero ajudar! - Não, obrigado - Obrigado por nos ajudar! Você pode alterar esta preferência nas configurações. - Sem problema, não iremos pedir de novo. Você pode mudar de ideia nas configurações. - Configurações A subchave será criada A subchave será revogada A subchave será extirpada diff --git a/OpenKeychain/src/main/res/values-ro/strings.xml b/OpenKeychain/src/main/res/values-ro/strings.xml index 82c06e523..0eb37fecd 100644 --- a/OpenKeychain/src/main/res/values-ro/strings.xml +++ b/OpenKeychain/src/main/res/values-ro/strings.xml @@ -417,5 +417,4 @@ Vizualizare Anonim # - Setări diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index de85ba5f6..3937085f5 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -218,8 +218,6 @@ Подтверждение Keybase.io Опрашивать keybase.io для подтверждения ключей и показывать это каждый раз при отображении ключей (Значки и многие экраны ещё не скорректированы для тёмной темы) - Отправлять анонимную статистику - Если данная функция включена, приложение будет отправлять анонимную статистику для помощи разработчикам Использовать Tor Требуется установка Orbot @@ -1875,12 +1873,6 @@ ID ключа: %s Аноним # - Может ли OpenKeychain собирать анонимную статистику для улучшения работы приложения?\n\nЧтобы узнать больше, изучите нашу Политику конфиденциальности. - Да, я хочу помочь! - Нет, спасибо - Спасибо за помощь! Вы можете изменить данную функцию в настройках. - Всё нормально, больше мы не будем спрашивать. Вы можете изменить своё мнение с помощью настроек. - Настройки Доп. ключ будет создан Доп. ключ будет отозван Доп. ключ будет отделён diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml index cbbadbdbd..8aff06054 100644 --- a/OpenKeychain/src/main/res/values-sl/strings.xml +++ b/OpenKeychain/src/main/res/values-sl/strings.xml @@ -831,6 +831,5 @@ Končaj Hranjenje gesla v spominu Posodabljam ključe... - Nastavitve - Deli ključ + Deli ključ diff --git a/OpenKeychain/src/main/res/values-sr/strings.xml b/OpenKeychain/src/main/res/values-sr/strings.xml index a41a920eb..061113704 100644 --- a/OpenKeychain/src/main/res/values-sr/strings.xml +++ b/OpenKeychain/src/main/res/values-sr/strings.xml @@ -1449,5 +1449,4 @@ Кеширај лозинку Ажурирам кључеве… ИД кључа: %s - Podešavanja diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml index e8a36be17..41d397af1 100644 --- a/OpenKeychain/src/main/res/values-sv/strings.xml +++ b/OpenKeychain/src/main/res/values-sv/strings.xml @@ -218,8 +218,6 @@ Keybase.io proofs Kontakta keybase.io för nyckelbevis och visa dem varje gång en nyckel visas (Ikonerna och många skärmar är ännu inte justerade för mörkt tema) - Tillåt anonym användarstatistik - Om den är aktiverad skickar du anonym användarstatistik för att förbättra appen Aktivera Tor Kräver att Orbot är installerad @@ -1670,12 +1668,6 @@ Nyckel-ID: %s Anonym # - För att förbättra upplevelsen för alla användare, kan OpenKeychain samla anonym användningsstatistik?\n\nFör mer information, se vår integritetspolicy. - Ja, jag vill hjälpa till! - Nej tack - Tack för hjälpen! Du kan ändra denna inställning i inställningarna. - Det är okej, vi kommer inte att fråga igen. Du kan ändra dig i inställningarna. - Inställningar Undernyckel kommer att skapas Undernyckel kommer att återkallas Undernyckeln kommer att avskalas diff --git a/OpenKeychain/src/main/res/values-te/strings.xml b/OpenKeychain/src/main/res/values-te/strings.xml index eabe757e5..d0440cd92 100644 --- a/OpenKeychain/src/main/res/values-te/strings.xml +++ b/OpenKeychain/src/main/res/values-te/strings.xml @@ -127,5 +127,4 @@ రద్దు సంబంధిత రద్దు - సెట్టింగులు diff --git a/OpenKeychain/src/main/res/values-th/strings.xml b/OpenKeychain/src/main/res/values-th/strings.xml index 5643a9a2c..3d9ac0d67 100644 --- a/OpenKeychain/src/main/res/values-th/strings.xml +++ b/OpenKeychain/src/main/res/values-th/strings.xml @@ -212,5 +212,4 @@ ย้อนกลับ เสร็จ ดู - การตั้งค่า diff --git a/OpenKeychain/src/main/res/values-tr/strings.xml b/OpenKeychain/src/main/res/values-tr/strings.xml index 3a538a358..eac384bc9 100644 --- a/OpenKeychain/src/main/res/values-tr/strings.xml +++ b/OpenKeychain/src/main/res/values-tr/strings.xml @@ -523,6 +523,4 @@ Göster Parola önbelleği Anonim - Hayır, teşekkürler - Ayarlar diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml index cf889711d..6bbb8702f 100644 --- a/OpenKeychain/src/main/res/values-uk/strings.xml +++ b/OpenKeychain/src/main/res/values-uk/strings.xml @@ -218,9 +218,7 @@ Перевірки Keybase.io Контактувати з keybase.io для підтвердження ключа та показувати дійсності щоразу, коли ключ відображено (Піктограми та більшість екранів не налаштовані для темної теми) - Дозволити анонімну статистику про використання - Якщо увімкнено, надсилає анонімну статистику про використання, щоби допомогти покращити цей застосунок - + Увімкнути Tor Потребує інсталяції Orbot Увімкнути інше проксі @@ -1876,13 +1874,7 @@ Ідентифікатор ключа: %s Анонімно # - Щоб покращити досвід для всіх користувачів, чи може OpenKeychain збирати анонімну статистику про використання?\n\nЩоби дізнатися більше, див. нашу Політику конфіденційності. - Так, я хочу допомогти! - Ні, дякую - Дякуємо за допомогу! Ви можете змінити цей параметр у налаштуваннях. - Усе добре, ми не будемо запитувати вас знову. Ви можете змінити свою думку в налаштуваннях. - Налаштування - Підключ буде створено + Підключ буде створено Підключ буде відкликано Підключ буде відділено Термін дії буде змінено на ніколи diff --git a/OpenKeychain/src/main/res/values-vi/strings.xml b/OpenKeychain/src/main/res/values-vi/strings.xml index 08137ae58..52a57cfd8 100644 --- a/OpenKeychain/src/main/res/values-vi/strings.xml +++ b/OpenKeychain/src/main/res/values-vi/strings.xml @@ -371,5 +371,4 @@ Kết thúc Xem Ẩn danh - Thiết đặt diff --git a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml index 60eefebd0..2d0af733e 100644 --- a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml +++ b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml @@ -216,8 +216,7 @@ 自動金鑰同步 警告 Keybase.io 證明 - 允許匿名的使用資料收集 - + 啟用洋蔥(Tor)網路 必須已安裝 Orbot 啟用其他代理伺服器 @@ -967,9 +966,6 @@ 金鑰 ID: %s 匿名 # - 是的,我想協助! - 不用,謝謝 - 設定 子金鑰將被創建 子金鑰將被撤銷 子金鑰將被分離 diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml index 9ee982cae..d8a0ebd96 100644 --- a/OpenKeychain/src/main/res/values-zh/strings.xml +++ b/OpenKeychain/src/main/res/values-zh/strings.xml @@ -218,8 +218,6 @@ Keybase.io 证明 每次展示密钥时自动从keybase.io获取证明并显示它们 (图标和某些界面还未根据深色主题进行调整) - 允许使用匿名统计数据 - 如果开启,发送匿名的统计数据来帮助我们改进此软件 启用 Tor 代理 必需已安装 Orbot @@ -1772,12 +1770,6 @@ 密钥 ID:%s 匿名 # - 为改善所有用户的使用体验,允许OpenKeychain匿名搜集一些使用统计信息吗?\n\n想知道更多,查阅我们的隐私政策 - 是的,我愿意帮忙! - 不用了,谢谢 - 感谢帮助!你可以在设置中更改这些偏好。 - 没问题,我们不会再次打扰你。如果改变了想法,你可以在设置中更改。 - 设置 将创建子密钥 将吊销子密钥 将剥离子密钥 diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 2894183d4..597ca093c 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -231,9 +231,6 @@ "(The icons and many screens are not yet adjusted accordingly for the dark theme)" - Allow anonymous usage statistics - If enabled, sends anonymous usage statistics to help improve the app - "Enable Tor" "Requires Orbot to be installed" @@ -1908,13 +1905,6 @@ Anonymous # - "To improve the experience for all users, may OpenKeychain collect anonymous usage statistics?\n\nTo find out more, see our Privacy Policy." - "Yes, I want to help!" - "No, thanks" - - "Thanks for helping out! You can change this preference in the settings." - "That's alright, we won't ask again. You can change your mind in the settings." - "Settings" Subkey will be created Subkey will be revoked Subkey will be stripped diff --git a/OpenKeychain/src/main/res/xml/experimental_preferences.xml b/OpenKeychain/src/main/res/xml/experimental_preferences.xml index e88275d88..0050965b6 100644 --- a/OpenKeychain/src/main/res/xml/experimental_preferences.xml +++ b/OpenKeychain/src/main/res/xml/experimental_preferences.xml @@ -5,13 +5,6 @@ android:summary="@string/label_experimental_settings_desc_summary" android:title="@string/label_experimental_settings_desc_title" /> - - Date: Sat, 5 Sep 2020 14:19:10 +0200 Subject: [PATCH 2/8] drop "try autocrypt" link from drawer --- .../keychain/ui/MainActivity.java | 17 +---------------- OpenKeychain/src/main/res/values-ca/strings.xml | 3 +-- OpenKeychain/src/main/res/values-cs/strings.xml | 3 +-- OpenKeychain/src/main/res/values-de/strings.xml | 3 +-- OpenKeychain/src/main/res/values-fr/strings.xml | 3 +-- OpenKeychain/src/main/res/values-ja/strings.xml | 3 +-- OpenKeychain/src/main/res/values-nl/strings.xml | 3 +-- OpenKeychain/src/main/res/values-ru/strings.xml | 3 +-- OpenKeychain/src/main/res/values-sv/strings.xml | 3 +-- OpenKeychain/src/main/res/values-zh/strings.xml | 3 +-- OpenKeychain/src/main/res/values/strings.xml | 1 - 11 files changed, 10 insertions(+), 35 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java index 0ce5fe274..e384897e0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java @@ -20,7 +20,6 @@ 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; @@ -57,7 +56,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai static final int ID_SETTINGS = 6; static final int ID_HELP = 7; static final int ID_SHOP = 8; - static final int ID_AUTOCRYPT = 9; // both of these are used for instrumentation testing only public static final String EXTRA_SKIP_FIRST_TIME = "skip_first_time"; @@ -97,10 +95,7 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai .withIdentifier(ID_TRANSFER).withSelectable(false), new DividerDrawerItem(), new PrimaryDrawerItem().withName(R.string.menu_preferences).withIcon(GoogleMaterial.Icon.gmd_settings).withIdentifier(ID_SETTINGS).withSelectable(false), - new PrimaryDrawerItem().withName(R.string.menu_help).withIcon(CommunityMaterial.Icon.cmd_help_circle).withIdentifier(ID_HELP).withSelectable(false), - new DividerDrawerItem(), - new PrimaryDrawerItem().withName(R.string.nav_autocrypt).withIcon(GoogleMaterial.Icon.gmd_blur_on) - .withTypeface(Typeface.DEFAULT_BOLD).withSelectable(false).withIdentifier(ID_AUTOCRYPT) + new PrimaryDrawerItem().withName(R.string.menu_help).withIcon(CommunityMaterial.Icon.cmd_help_circle).withIdentifier(ID_HELP).withSelectable(false) ) .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { @Override @@ -133,9 +128,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai case ID_SHOP: onShopSelected(); break; - case ID_AUTOCRYPT: - onAutocryptSelected(); - break; } if (intent != null) { MainActivity.this.startActivity(intent); @@ -267,13 +259,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai setFragment(frag); } - private void onAutocryptSelected() { - String url = "https://addons.thunderbird.net/en-US/thunderbird/addon/autocrypt/"; - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(url)); - startActivity(intent); - } - @Override protected void onSaveInstanceState(Bundle outState) { // add the values which need to be saved from the drawer to the bundle diff --git a/OpenKeychain/src/main/res/values-ca/strings.xml b/OpenKeychain/src/main/res/values-ca/strings.xml index bf88c38b0..941a9d845 100644 --- a/OpenKeychain/src/main/res/values-ca/strings.xml +++ b/OpenKeychain/src/main/res/values-ca/strings.xml @@ -699,8 +699,7 @@ Còpia de seguretat/Restaura Transferència Wifi segura Botiga - Proveu Autocrypt amb Thunderbird - + Escriviu text per defecte diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml index 816d4ef61..d6ecf4f37 100644 --- a/OpenKeychain/src/main/res/values-cs/strings.xml +++ b/OpenKeychain/src/main/res/values-cs/strings.xml @@ -815,8 +815,7 @@ Záloha/Obnova Bezpečný přenos přes WiFi Obchod - Vyzkoušejte Autocrypt s Thunderbird - + Napsat text výchozí diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml index d9e9ca0cc..b45742283 100644 --- a/OpenKeychain/src/main/res/values-de/strings.xml +++ b/OpenKeychain/src/main/res/values-de/strings.xml @@ -779,8 +779,7 @@ Backup/Wiederherstellung Sichere WiFi Übertragung Shop - Autocrypt mit Thunderbird probieren - + Text eingeben normal diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index 31c3311f2..7f7839373 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -779,8 +779,7 @@ Sauvegarder/Restaurer Transfert Wi-Fi sécurisé Boutique - Essayer Autocrypt avec Thunderbird - + Saisir le texte valeur par défaut diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index ef9dfbdfa..8d5590187 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -765,8 +765,7 @@ バックアップ/リストア 安全な Wifi 転送 ショップ - Thunderbird と Autocrypt をお試しください - + テキストを入力 デフォルト diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml index e3508df85..b37557207 100644 --- a/OpenKeychain/src/main/res/values-nl/strings.xml +++ b/OpenKeychain/src/main/res/values-nl/strings.xml @@ -779,8 +779,7 @@ Back-up/herstellen Beveiligde wifi-overdracht Winkel - Probeer Autocrypt met Thunderbird - + Voer tekst in standaard diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index 3937085f5..39f2ca095 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -816,8 +816,7 @@ Резервирование/Восстановление Безопасная передача по Wi-Fi Магазин - Попробуйте Autocrypt с Thunderbird - + Напишите текст по умолчанию diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml index 41d397af1..aaf318b67 100644 --- a/OpenKeychain/src/main/res/values-sv/strings.xml +++ b/OpenKeychain/src/main/res/values-sv/strings.xml @@ -775,8 +775,7 @@ Säkerhetskopiera/återställa Säker Wi-Fi-överföring Butik - Prova Autocrypt med Thunderbird - + Skriv text förval diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml index d8a0ebd96..3a9bae2e0 100644 --- a/OpenKeychain/src/main/res/values-zh/strings.xml +++ b/OpenKeychain/src/main/res/values-zh/strings.xml @@ -761,8 +761,7 @@ 备份/恢复 安全 Wifi 传输 商店 - 尝试在 Thunderbird 中自动加密 - + 此处输入要加密的内容 默认 diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 597ca093c..ba619089c 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -818,7 +818,6 @@ "Backup/Restore" "Secure Wifi Transfer" Shop - Try Autocrypt with Thunderbird "Type text" From aa6ff035450684274d976d01954457b653e93f95 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 5 Sep 2020 14:22:42 +0200 Subject: [PATCH 3/8] drop "shop" drawer item --- .../keychain/ui/MainActivity.java | 13 ---- .../keychain/ui/SecurityKeyShopFragment.java | 77 ------------------- .../res/layout/security_key_shop_fragment.xml | 37 --------- .../src/main/res/values-ca/strings.xml | 3 +- .../src/main/res/values-cs/strings.xml | 5 +- .../src/main/res/values-de/strings.xml | 5 +- .../src/main/res/values-fr/strings.xml | 5 +- .../src/main/res/values-hu/strings.xml | 2 - .../src/main/res/values-ja/strings.xml | 5 +- .../src/main/res/values-nl/strings.xml | 5 +- .../src/main/res/values-ru/strings.xml | 5 +- .../src/main/res/values-sv/strings.xml | 3 +- .../src/main/res/values-zh/strings.xml | 5 +- OpenKeychain/src/main/res/values/strings.xml | 3 - 14 files changed, 9 insertions(+), 164 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java delete mode 100644 OpenKeychain/src/main/res/layout/security_key_shop_fragment.xml diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java index e384897e0..35dfd4670 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java @@ -55,7 +55,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai public static final int ID_TRANSFER = 5; static final int ID_SETTINGS = 6; static final int ID_HELP = 7; - static final int ID_SHOP = 8; // both of these are used for instrumentation testing only public static final String EXTRA_SKIP_FIRST_TIME = "skip_first_time"; @@ -78,8 +77,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai .withHeader(R.layout.main_drawer_header) .withToolbar(mToolbar) .addDrawerItems( - new PrimaryDrawerItem().withName(R.string.nav_shop).withIcon(CommunityMaterial.Icon.cmd_shopping) - .withIdentifier(ID_SHOP).withSelectable(false).withTypeface(Typeface.DEFAULT_BOLD), new PrimaryDrawerItem().withName(R.string.nav_keys).withIcon(CommunityMaterial.Icon.cmd_key) .withIdentifier(ID_KEYS).withSelectable(false), new PrimaryDrawerItem().withName(R.string.nav_encrypt_decrypt).withIcon(FontAwesome.Icon.faw_lock) @@ -125,9 +122,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai case ID_HELP: intent = new Intent(MainActivity.this, HelpActivity.class); break; - case ID_SHOP: - onShopSelected(); - break; } if (intent != null) { MainActivity.this.startActivity(intent); @@ -252,13 +246,6 @@ public class MainActivity extends BaseSecurityTokenActivity implements FabContai } } - private void onShopSelected() { - mToolbar.setTitle(R.string.shop_title); - mDrawer.setSelection(ID_SHOP, false); - Fragment frag = new SecurityKeyShopFragment(); - setFragment(frag); - } - @Override protected void onSaveInstanceState(Bundle outState) { // add the values which need to be saved from the drawer to the bundle diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java deleted file mode 100644 index 7c09d8d82..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.ui; - - -import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import android.widget.ProgressBar; -import android.widget.TextView; - -import org.sufficientlysecure.keychain.R; - -import java.util.HashMap; -import java.util.Map; - -public class SecurityKeyShopFragment extends Fragment { - - public static final String webShopURL = "https://shop.cotech.de/"; - public static final String referer = "https://openkeychain.shop.cotech.de"; - - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.security_key_shop_fragment, container, false); - - WebView webView = view.findViewById(R.id.shop_webView); - webView.setWebViewClient(new SecurityKeyShopWebViewClient( - view.findViewById(R.id.shop_progressbar), - view.findViewById(R.id.shop_progressbar_label) - )); - webView.getSettings().setJavaScriptEnabled(true); - Map headers = new HashMap<>(); - headers.put("Referer", referer); - webView.loadUrl(webShopURL, headers); - return view; - } - - class SecurityKeyShopWebViewClient extends WebViewClient { - private ProgressBar progressBar; - private TextView progressBarLabel; - - SecurityKeyShopWebViewClient(ProgressBar progressBar, TextView progressBarLabel) { - this.progressBar = progressBar; - this.progressBarLabel = progressBarLabel; - progressBar.setVisibility(View.VISIBLE); - progressBarLabel.setVisibility(View.VISIBLE); - } - - @Override - public void onPageCommitVisible(WebView view, String url) { - super.onPageCommitVisible(view, url); - progressBar.setVisibility(View.GONE); - progressBarLabel.setVisibility(View.GONE); - } - } - -} diff --git a/OpenKeychain/src/main/res/layout/security_key_shop_fragment.xml b/OpenKeychain/src/main/res/layout/security_key_shop_fragment.xml deleted file mode 100644 index b02d422ec..000000000 --- a/OpenKeychain/src/main/res/layout/security_key_shop_fragment.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/OpenKeychain/src/main/res/values-ca/strings.xml b/OpenKeychain/src/main/res/values-ca/strings.xml index 941a9d845..bc3fa8336 100644 --- a/OpenKeychain/src/main/res/values-ca/strings.xml +++ b/OpenKeychain/src/main/res/values-ca/strings.xml @@ -698,8 +698,7 @@ Les meves claus Còpia de seguretat/Restaura Transferència Wifi segura - Botiga - + Escriviu text per defecte diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml index d6ecf4f37..65edf4848 100644 --- a/OpenKeychain/src/main/res/values-cs/strings.xml +++ b/OpenKeychain/src/main/res/values-cs/strings.xml @@ -814,8 +814,7 @@ Moje Klíče Záloha/Obnova Bezpečný přenos přes WiFi - Obchod - + Napsat text výchozí @@ -1878,6 +1877,4 @@ Doba platnosti se změni do %s Sdílet klíč skrze schránku Sdílet klíč - Otevírám obchod... - COTECH Security Keys diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml index b45742283..4630b660a 100644 --- a/OpenKeychain/src/main/res/values-de/strings.xml +++ b/OpenKeychain/src/main/res/values-de/strings.xml @@ -778,8 +778,7 @@ Meine Schlüssel Backup/Wiederherstellung Sichere WiFi Übertragung - Shop - + Text eingeben normal @@ -1811,6 +1810,4 @@ Ein sicherer Schlüssel sollte eine Stärke von 2048 Bits besitzen. Ablauf wird geändert zu \"%s\" Schlüssel per Zwischenablage teilen Schlüssel teilen - Shop wird geladen... - COTECH Sicherheitsschlüssel diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index 7f7839373..3a023e616 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -778,8 +778,7 @@ Mes clés Sauvegarder/Restaurer Transfert Wi-Fi sécurisé - Boutique - + Saisir le texte valeur par défaut @@ -1810,6 +1809,4 @@ La date d’expiration sera changé à %s Partager la clé avec le presse-papiers Partager la clé - Chargement de la boutique… - Clés de sécurité COTECH diff --git a/OpenKeychain/src/main/res/values-hu/strings.xml b/OpenKeychain/src/main/res/values-hu/strings.xml index 23cdfd3bf..515c3268e 100644 --- a/OpenKeychain/src/main/res/values-hu/strings.xml +++ b/OpenKeychain/src/main/res/values-hu/strings.xml @@ -747,6 +747,4 @@ A lejárat %s értékre változik Kulcs megosztása vágólappal Kulcs megosztása - Shop betöltése... - COTECH biztonsági kulcsok diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index 8d5590187..efe656435 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -764,8 +764,7 @@ 自分の鍵 バックアップ/リストア 安全な Wifi 転送 - ショップ - + テキストを入力 デフォルト @@ -1780,6 +1779,4 @@ 有効期限は%sに変更されます クリップボードでキーを共有する 鍵の共有 - ショップを読み込んでいます… - COTECH セキュリティ鍵 diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml index b37557207..4770a05d1 100644 --- a/OpenKeychain/src/main/res/values-nl/strings.xml +++ b/OpenKeychain/src/main/res/values-nl/strings.xml @@ -778,8 +778,7 @@ Mijn sleutels Back-up/herstellen Beveiligde wifi-overdracht - Winkel - + Voer tekst in standaard @@ -1810,6 +1809,4 @@ Verloopdatum zal wijzigen naar %s Sleutel delen via klembord Sleutel delen - Winkel aan het laden… - COTECH-beveiligingssleutels diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index 39f2ca095..6b657c690 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -815,8 +815,7 @@ Мои ключи Резервирование/Восстановление Безопасная передача по Wi-Fi - Магазин - + Напишите текст по умолчанию @@ -1879,6 +1878,4 @@ Срок годности будет изменён на %s Отправить ключ в буфер обмена Отправить ключ - Загрузка магазина... - Ключи безопасности COTECH diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml index aaf318b67..0908b17b5 100644 --- a/OpenKeychain/src/main/res/values-sv/strings.xml +++ b/OpenKeychain/src/main/res/values-sv/strings.xml @@ -774,8 +774,7 @@ Mina nycklar Säkerhetskopiera/återställa Säker Wi-Fi-överföring - Butik - + Skriv text förval diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml index 3a9bae2e0..40cb2da8f 100644 --- a/OpenKeychain/src/main/res/values-zh/strings.xml +++ b/OpenKeychain/src/main/res/values-zh/strings.xml @@ -760,8 +760,7 @@ 我的密钥 备份/恢复 安全 Wifi 传输 - 商店 - + 此处输入要加密的内容 默认 @@ -1776,6 +1775,4 @@ 过期时间将更改为%s 通过剪贴板共享 共享密钥 - 加载商店 - COTECH 安全密钥 diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index ba619089c..ce2457c16 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -817,7 +817,6 @@ "My Keys" "Backup/Restore" "Secure Wifi Transfer" - Shop "Type text" @@ -1912,6 +1911,4 @@ Share key via clipboard Share key - Loading shop… - COTECH Security Keys From 2d9edf3832e82eee9ca8526c2fe46cf894025b78 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 5 Sep 2020 14:32:59 +0200 Subject: [PATCH 4/8] drop ContactSync feature --- OpenKeychain/src/main/AndroidManifest.xml | 45 ----- .../keychain/KeychainApplication.java | 36 +--- .../keychain/operations/CertifyOperation.java | 4 - .../keychain/operations/DeleteOperation.java | 4 - .../keychain/operations/EditKeyOperation.java | 4 - .../keychain/operations/ImportOperation.java | 15 +- .../service/ContactSyncAdapterService.java | 177 ------------------ .../keychain/service/DummyAccountService.java | 133 ------------- .../keychain/ui/SettingsActivity.java | 140 +------------- .../src/main/res/values-ar/strings.xml | 3 +- .../src/main/res/values-ca/strings.xml | 1 - .../src/main/res/values-cs/strings.xml | 1 - .../src/main/res/values-de/strings.xml | 1 - .../src/main/res/values-es-rMX/strings.xml | 3 +- .../src/main/res/values-es/strings.xml | 3 +- .../src/main/res/values-eu/strings.xml | 3 +- .../src/main/res/values-fr/strings.xml | 1 - .../src/main/res/values-gl/strings.xml | 3 +- .../src/main/res/values-hu/strings.xml | 1 - .../src/main/res/values-it/strings.xml | 3 +- .../src/main/res/values-ja/strings.xml | 1 - .../src/main/res/values-ko/strings.xml | 3 +- .../src/main/res/values-nb/strings.xml | 3 +- .../src/main/res/values-nl-rBE/strings.xml | 3 +- .../src/main/res/values-nl/strings.xml | 1 - .../src/main/res/values-pl/strings.xml | 3 +- .../src/main/res/values-pt-rBR/strings.xml | 3 +- .../src/main/res/values-ru/strings.xml | 1 - .../src/main/res/values-sr/strings.xml | 3 +- .../src/main/res/values-sv/strings.xml | 1 - .../src/main/res/values-uk/strings.xml | 3 +- .../src/main/res/values-vi/strings.xml | 3 +- .../src/main/res/values-zh-rTW/strings.xml | 3 +- .../src/main/res/values-zh/strings.xml | 1 - OpenKeychain/src/main/res/values/strings.xml | 5 - .../src/main/res/xml/account_desc.xml | 6 - .../main/res/xml/sync_adapter_contacts.xml | 8 - .../xml/sync_adapter_contacts_structure.xml | 6 - .../src/main/res/xml/sync_preferences.xml | 9 +- 39 files changed, 23 insertions(+), 624 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java delete mode 100644 OpenKeychain/src/main/res/xml/account_desc.xml delete mode 100644 OpenKeychain/src/main/res/xml/sync_adapter_contacts.xml delete mode 100644 OpenKeychain/src/main/res/xml/sync_adapter_contacts_structure.xml diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml index eb99d3ff6..39d9bea81 100644 --- a/OpenKeychain/src/main/AndroidManifest.xml +++ b/OpenKeychain/src/main/AndroidManifest.xml @@ -54,21 +54,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - qrCodeCache = new HashMap<>(); @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java index cea093a48..e1bafb87c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java @@ -43,7 +43,6 @@ import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.service.CertifyActionsParcel; import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; -import org.sufficientlysecure.keychain.service.ContactSyncAdapterService; import org.sufficientlysecure.keychain.service.UploadKeyringParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; @@ -254,9 +253,6 @@ public class CertifyOperation extends BaseReadWriteOperation int result = DeleteResult.RESULT_OK; if (success > 0) { - // make sure new data is synced into contacts - ContactSyncAdapterService.requestContactsSync(); - log.add(LogType.MSG_DEL_OK, 0, success); } if (fail > 0) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java index 573fba8f2..15b3b9b10 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java @@ -38,7 +38,6 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing; import org.sufficientlysecure.keychain.pgp.PgpKeyOperation; import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; -import org.sufficientlysecure.keychain.service.ContactSyncAdapterService; import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.UploadKeyringParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; @@ -182,9 +181,6 @@ public class EditKeyOperation extends BaseReadWriteOperation updateProgress(R.string.progress_done, 100, 100); - // make sure new data is synced into contacts - ContactSyncAdapterService.requestContactsSync(); - log.add(LogType.MSG_ED_SUCCESS, 0); return new EditKeyResult(EditKeyResult.RESULT_OK, log, ring.getMasterKeyId()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java index 833b40ec8..a55ff6214 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java @@ -32,9 +32,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.daos.KeyMetadataDao; import org.sufficientlysecure.keychain.daos.KeyWritableRepository; @@ -55,7 +55,6 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing; import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; -import org.sufficientlysecure.keychain.service.ContactSyncAdapterService; import org.sufficientlysecure.keychain.service.ImportKeyringParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; @@ -134,9 +133,6 @@ public class ImportOperation extends BaseReadWriteOperation } /** - * Since the introduction of multithreaded import, we expect calling functions to handle the - * contact-to-key sync i.e ContactSyncAdapterService.requestContactsSync() - * * @param entries keys to import * @param numTotalKeys number of keys to import * @param hkpKeyserver contains uri of keyserver to import from, if it is an import from cloud @@ -274,11 +270,6 @@ public class ImportOperation extends BaseReadWriteOperation } } - // Special: make sure new data is synced into contacts - // disabling sync right now since it reduces speed while multi-threading - // so, we expect calling functions to take care of it. KeychainService handles this - // ContactSyncAdapterService.requestContactsSync(); - // convert to long array long[] importedMasterKeyIdsArray = new long[importedMasterKeyIds.size()]; for (int i = 0; i < importedMasterKeyIds.size(); ++i) { @@ -476,10 +467,6 @@ public class ImportOperation extends BaseReadWriteOperation result = multiThreadedKeyImport(keyList, keyServer, proxy, skipSave, forceReinsert); } - - if (!skipSave) { - ContactSyncAdapterService.requestContactsSync(); - } return result; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java deleted file mode 100644 index ea5a43221..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.service; - - -import android.accounts.Account; -import android.app.PendingIntent; -import android.app.Service; -import android.content.AbstractThreadedSyncAdapter; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.SyncResult; -import android.os.Bundle; -import android.os.IBinder; -import android.preference.PreferenceActivity; -import android.provider.ContactsContract; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; -import androidx.core.content.ContextCompat; - -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.KeychainApplication; -import org.sufficientlysecure.keychain.NotificationChannelManager; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.ui.SettingsActivity; -import org.sufficientlysecure.keychain.util.ContactHelper; -import timber.log.Timber; - - -public class ContactSyncAdapterService extends Service { - - private static final int NOTIFICATION_ID_SYNC_SETTINGS = 13; - - private class ContactSyncAdapter extends AbstractThreadedSyncAdapter { - -// private final AtomicBoolean importDone = new AtomicBoolean(false); - - public ContactSyncAdapter() { - super(ContactSyncAdapterService.this, true); - } - - @Override - public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, - final SyncResult syncResult) { - Timber.d("Performing a contact sync!"); - - new ContactHelper(ContactSyncAdapterService.this).writeKeysToContacts(); - -// importKeys(); - } - - @Override - public void onSecurityException(Account account, Bundle extras, String authority, SyncResult syncResult) { - super.onSecurityException(account, extras, authority, syncResult); - - // deactivate sync - ContentResolver.setSyncAutomatically(account, authority, false); - - NotificationChannelManager.getInstance(getContext()).createNotificationChannelsIfNecessary(); - - // show notification linking to sync settings - Intent resultIntent = new Intent(ContactSyncAdapterService.this, SettingsActivity.class); - resultIntent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, - SettingsActivity.SyncPrefsFragment.class.getName()); - PendingIntent resultPendingIntent = - PendingIntent.getActivity( - ContactSyncAdapterService.this, - 0, - resultIntent, - PendingIntent.FLAG_UPDATE_CURRENT - ); - NotificationCompat.Builder mBuilder = - new NotificationCompat.Builder(ContactSyncAdapterService.this, NotificationChannelManager.PERMISSION_REQUESTS) - .setAutoCancel(true) - .setSmallIcon(R.drawable.ic_stat_notify_24dp) - .setColor(getResources().getColor(R.color.primary)) - .setContentTitle(getString(R.string.sync_notification_permission_required_title)) - .setContentText(getString(R.string.sync_notification_permission_required_text)) - .setContentIntent(resultPendingIntent); - NotificationManagerCompat.from(ContactSyncAdapterService.this) - .notify(NOTIFICATION_ID_SYNC_SETTINGS, mBuilder.build()); - } - } - - @Override - public IBinder onBind(Intent intent) { - return new ContactSyncAdapter().getSyncAdapterBinder(); - } - - public static void requestContactsSync() { - // if user has disabled automatic sync, do nothing - boolean isSyncEnabled = ContentResolver.getSyncAutomatically(new Account - (Constants.ACCOUNT_NAME, Constants.ACCOUNT_TYPE), ContactsContract.AUTHORITY); - - if (!isSyncEnabled) { - return; - } - - Bundle extras = new Bundle(); - // no need to wait, do it immediately - extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); - extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); - ContentResolver.requestSync( - new Account(Constants.ACCOUNT_NAME, Constants.ACCOUNT_TYPE), - ContactsContract.AUTHORITY, - extras); - } - - public static void enableContactsSync(Context context) { - Account account = KeychainApplication.createAccountIfNecessary(context); - if (account == null) { - return; - } - - ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 1); - ContentResolver.setSyncAutomatically(account, ContactsContract.AUTHORITY, true); - } - -// TODO: Import is currently disabled, until we implement proper origin management -// private static void importKeys() { -// importDone.set(false); -// KeychainApplication.setupAccountAsNeeded(ContactSyncAdapterService.this); -// EmailKeyHelper.importContacts(getContext(), new Messenger(new Handler(Looper.getMainLooper(), -// new Handler.Callback() { -// @Override -// public boolean handleMessage(Message msg) { -// Bundle data = msg.getInputData(); -// switch (msg.arg1) { -// case KeychainIntentServiceHandler.MESSAGE_OKAY: -// Log.d(Constants.TAG, "Syncing... Done."); -// synchronized (importDone) { -// importDone.set(true); -// importDone.notifyAll(); -// } -// return true; -// case KeychainIntentServiceHandler.MESSAGE_UPDATE_PROGRESS: -// if (data.containsKey(KeychainIntentServiceHandler.DATA_PROGRESS) && -// data.containsKey(KeychainIntentServiceHandler.DATA_PROGRESS_MAX)) { -// Log.d(Constants.TAG, "Syncing... Progress: " + -// data.getInt(KeychainIntentServiceHandler.DATA_PROGRESS) + "/" + -// data.getInt(KeychainIntentServiceHandler.DATA_PROGRESS_MAX)); -// return false; -// } -// default: -// Log.d(Constants.TAG, "Syncing... " + msg.toString()); -// return false; -// } -// } -// }))); -// synchronized (importDone) { -// try { -// if (!importDone.get()) importDone.wait(); -// } catch (InterruptedException e) { -// Log.w(Constants.TAG, e); -// return; -// } -// } -// } - -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java deleted file mode 100644 index 14b0db553..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.service; - -import android.accounts.AbstractAccountAuthenticator; -import android.accounts.Account; -import android.accounts.AccountAuthenticatorResponse; -import android.accounts.NetworkErrorException; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.widget.Toast; - -import org.sufficientlysecure.keychain.R; -import timber.log.Timber; - - -/** - * This service actually does nothing, it's sole task is to show a Toast if the use tries to create an account. - */ -public class DummyAccountService extends Service { - - private class Toaster { - private static final String TOAST_MESSAGE = "toast_message"; - private Context context; - private Handler handler = new Handler(new Handler.Callback() { - @Override - public boolean handleMessage(Message msg) { - Toast.makeText(context, msg.getData().getString(TOAST_MESSAGE), Toast.LENGTH_LONG).show(); - return true; - } - }); - - private Toaster(Context context) { - this.context = context; - } - - public void toast(int resourceId) { - toast(context.getString(resourceId)); - } - - public void toast(String message) { - Message msg = new Message(); - Bundle bundle = new Bundle(); - bundle.putString(TOAST_MESSAGE, message); - msg.setData(bundle); - handler.sendMessage(msg); - } - } - - private class Authenticator extends AbstractAccountAuthenticator { - - public Authenticator() { - super(DummyAccountService.this); - } - - @Override - public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { - Timber.d("DummyAccountService.editProperties"); - return null; - } - - @Override - public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, - String[] requiredFeatures, Bundle options) throws NetworkErrorException { - response.onResult(new Bundle()); - toaster.toast(R.string.account_no_manual_account_creation); - Timber.d("DummyAccountService.addAccount"); - return null; - } - - @Override - public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) - throws NetworkErrorException { - Timber.d("DummyAccountService.confirmCredentials"); - return null; - } - - @Override - public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, - Bundle options) throws NetworkErrorException { - Timber.d("DummyAccountService.getAuthToken"); - return null; - } - - @Override - public String getAuthTokenLabel(String authTokenType) { - Timber.d("DummyAccountService.getAuthTokenLabel"); - return null; - } - - @Override - public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, - Bundle options) throws NetworkErrorException { - Timber.d("DummyAccountService.updateCredentials"); - return null; - } - - @Override - public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) - throws NetworkErrorException { - Timber.d("DummyAccountService.hasFeatures"); - return null; - } - } - - private Toaster toaster; - - @Override - public IBinder onBind(Intent intent) { - toaster = new Toaster(this); - return new Authenticator().getIBinder(); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java index f5ab1ea69..993aa6c97 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java @@ -23,16 +23,9 @@ import java.security.KeyStoreException; import java.util.ArrayList; import java.util.List; -import android.Manifest; -import android.accounts.Account; -import android.accounts.AccountManager; -import android.annotation.TargetApi; import android.app.Activity; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Build; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; @@ -40,17 +33,13 @@ import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.preference.SwitchPreference; -import android.provider.ContactsContract; 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; import org.sufficientlysecure.keychain.compatibility.AppCompatPreferenceActivity; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; @@ -402,11 +391,8 @@ public class SettingsActivity extends AppCompatPreferenceActivity { // Load the preferences from an XML resource addPreferencesFromResource(R.xml.sync_preferences); - findPreference(Constants.Pref.SYNC_KEYSERVER).setOnPreferenceChangeListener( - (preference, newValue) -> { - return true; - }); + (preference, newValue) -> true); } @Override @@ -414,130 +400,6 @@ public class SettingsActivity extends AppCompatPreferenceActivity { super.onStop(); KeyserverSyncManager.updateKeyserverSyncScheduleAsync(getActivity(), true); } - - @Override - public void onResume() { - super.onResume(); - // this needs to be done in onResume since the user can change sync values from Android - // settings and we need to reflect that change when the user navigates back - final Account account = KeychainApplication.createAccountIfNecessary(getActivity()); - // for contacts sync - initializeSyncCheckBox( - (SwitchPreference) findPreference(Constants.Pref.SYNC_CONTACTS), - account, - ContactsContract.AUTHORITY - ); - } - - private void initializeSyncCheckBox(final SwitchPreference syncCheckBox, - final Account account, - final String authority) { - // account is null if it could not be created for some reason - boolean syncEnabled = - account != null - && ContentResolver.getSyncAutomatically(account, authority) - && checkContactsPermission(authority); - syncCheckBox.setChecked(syncEnabled); - setSummary(syncCheckBox, authority, syncEnabled); - - syncCheckBox.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @TargetApi(Build.VERSION_CODES.M) - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - boolean syncEnabled = (Boolean) newValue; - if (syncEnabled) { - if (checkContactsPermission(authority)) { - ContentResolver.setSyncAutomatically(account, authority, true); - setSummary(syncCheckBox, authority, true); - return true; - } else { - requestPermissions( - new String[]{Manifest.permission.READ_CONTACTS}, - REQUEST_PERMISSION_READ_CONTACTS); - // don't update preference - return false; - } - } else { - if (account == null) { - // if account could not be created for some reason, - // we can't have our sync - return false; - } - // disable syncs - ContentResolver.setSyncAutomatically(account, authority, false); - // cancel any ongoing/pending syncs - ContentResolver.cancelSync(account, authority); - setSummary(syncCheckBox, authority, false); - return true; - } - } - }); - } - - private boolean checkContactsPermission(String authority) { - if (!ContactsContract.AUTHORITY.equals(authority)) { - // provides convenience of not using separate checks for keyserver and contact sync - // in initializeSyncCheckBox - return true; - } - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return true; - } - - if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) - == PackageManager.PERMISSION_GRANTED) { - return true; - } - - return false; - } - - @Override - public void onRequestPermissionsResult(int requestCode, - @NonNull String[] permissions, - @NonNull int[] grantResults) { - - if (requestCode != REQUEST_PERMISSION_READ_CONTACTS) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - return; - } - - boolean permissionWasGranted = grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED; - - if (permissionWasGranted) { - // permission granted -> enable contact linking - AccountManager manager = AccountManager.get(getActivity()); - final Account account = manager.getAccountsByType(Constants.ACCOUNT_TYPE)[0]; - SwitchPreference pref = (SwitchPreference) findPreference(Constants.Pref.SYNC_CONTACTS); - ContentResolver.setSyncAutomatically(account, ContactsContract.AUTHORITY, true); - setSummary(pref, ContactsContract.AUTHORITY, true); - pref.setChecked(true); - } - } - - private void setSummary(SwitchPreference syncCheckBox, String authority, - boolean checked) { - switch (authority) { - case Constants.PROVIDER_AUTHORITY: { - if (checked) { - syncCheckBox.setSummary(R.string.label_sync_settings_keyserver_summary_on); - } else { - syncCheckBox.setSummary(R.string.label_sync_settings_keyserver_summary_off); - } - break; - } - case ContactsContract.AUTHORITY: { - if (checked) { - syncCheckBox.setSummary(R.string.label_sync_settings_contacts_summary_on); - } else { - syncCheckBox.setSummary(R.string.label_sync_settings_contacts_summary_off); - } - break; - } - } - } } /** diff --git a/OpenKeychain/src/main/res/values-ar/strings.xml b/OpenKeychain/src/main/res/values-ar/strings.xml index 7db0b8351..720e0aee1 100644 --- a/OpenKeychain/src/main/res/values-ar/strings.xml +++ b/OpenKeychain/src/main/res/values-ar/strings.xml @@ -178,8 +178,7 @@ ربط المفاتيح بجهات الإتصال لن يتم ربط المفاتيح الجديدة بجهات الإتصال - تحديثات تلقائية للمفاتيح - تحذير + تحذير فعّل تور يتطلب نتصيب تطبيق أوربوت diff --git a/OpenKeychain/src/main/res/values-ca/strings.xml b/OpenKeychain/src/main/res/values-ca/strings.xml index bc3fa8336..9de346d1a 100644 --- a/OpenKeychain/src/main/res/values-ca/strings.xml +++ b/OpenKeychain/src/main/res/values-ca/strings.xml @@ -208,7 +208,6 @@ Enllaça claus amb contactes basant-se amb noms i adreces de correu. Això succeeix completament fora de línia en el vostre dispositiu. Les noves claus no s\'enllaçaran amb els contactes - Actualització de claus automàticament Advertència Proves de Keybase.io Contacta amb keybase.io per proves de clau i mostra-les cada vegada que es mostri una clau diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml index 65edf4848..c7ef0cf67 100644 --- a/OpenKeychain/src/main/res/values-cs/strings.xml +++ b/OpenKeychain/src/main/res/values-cs/strings.xml @@ -212,7 +212,6 @@ Protojit klíče s kontakty na základě jmen a emailových adres. Odehrává se kompletně offline na vašem zařízení. Nové klíče nebudou propojeny s kontakty - Automaticky aktualizovat klíč Varovnání Tyto funkce nejsou ještě dokončené nebo neprošli uživatelským testováním/bezpečnostním auditem. Prosím, nespoléhejte na jejich zabezpečení a nehlašte problémy s nimi spojené, pokud na ně narazíte. Keybase.io Proofs diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml index 4630b660a..be9a6813b 100644 --- a/OpenKeychain/src/main/res/values-de/strings.xml +++ b/OpenKeychain/src/main/res/values-de/strings.xml @@ -212,7 +212,6 @@ Schlüssel basierend auf Namen und E-Mail-Adressen mit Kontakten verknüpfen. Das alles findet komplett offline auf deinem Gerät statt. Neue Schlüssel werden nicht mit Kontakten verknüpft - Automatische Schlüsselaktualisierung Warnung Diese Funktionen sind noch nicht final oder das Ergebnis von Benutzererfahrungs-/Sicherheitsuntersuchungen. Verlasse dich daher nicht auf deren Sicherheit und melde uns bitte keine auftretenden Probleme! Keybase.io-Nachweise diff --git a/OpenKeychain/src/main/res/values-es-rMX/strings.xml b/OpenKeychain/src/main/res/values-es-rMX/strings.xml index b65004e8e..f3265642a 100644 --- a/OpenKeychain/src/main/res/values-es-rMX/strings.xml +++ b/OpenKeychain/src/main/res/values-es-rMX/strings.xml @@ -210,8 +210,7 @@ Vincular claves a contactos basándose en nombres y direcciones de correo electrónico. Esto ocurre sin conexión completamente en tu dispositivo. Nuevas claves no serán vinculadas a contactos - Actualizaciones automáticas de claves - Advertencia + Advertencia Activar Tor Requiere Orbot instalado diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml index fc9d25e3f..d9fc6303f 100644 --- a/OpenKeychain/src/main/res/values-es/strings.xml +++ b/OpenKeychain/src/main/res/values-es/strings.xml @@ -212,8 +212,7 @@ Vincula claves con contactos basándose en nombres y direcciones de correo electrónico. Esto sucede con su dispositivo completamente desconectado. Las claves nuevas no se vincularán a contactos - Actualizaciones automáticas de claves - Advertencia + Advertencia Estas características todavía no están finalizadas o no se han obtenido los resultados de experiencia del usuario y la investigación de seguridad. Por tanto, no confíe en su seguridad y, por favor, ¡no informe de los problemas que encuentre! Comprobantes de Keybase.io Contacta con keybase.io para obtener comprobantes de clave y muestrelos cada vez que se muestra una clave diff --git a/OpenKeychain/src/main/res/values-eu/strings.xml b/OpenKeychain/src/main/res/values-eu/strings.xml index 0ce526c52..4876a308f 100644 --- a/OpenKeychain/src/main/res/values-eu/strings.xml +++ b/OpenKeychain/src/main/res/values-eu/strings.xml @@ -206,8 +206,7 @@ Lotu giltzak harremanekin izen eta post@ helbideetan ohinarrituz. Hau erabat lineaz-kanpo gertatzen da zure gailuan. Giltza berriak ez dira harremanekin lotuko - Berezgaitasunez eguneratu giltzak - Kontuz + Kontuz Ezaugarri hauek ez dute amaitu edo erabiltzaile jarduera/segurtasun emaitzak erdietsita. Honela, ez dira beren segurtasunean ohinarritzen eta mesedez ez jakinarazi aurkitzen dituzun arazoak! Jarri harremanetan keybase.io giltzak probatzeko eta erakutsi hauek giltza bat erakusten den bakoitzean (Ikurrak eta ikusleiho asko oraindik ez daude azalgai ilunarekin zehaztuta) diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index 3a023e616..3b54718ac 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -212,7 +212,6 @@ Relier les clés aux contacts d’après les noms et les adresses courriel. Cela se passe entièrement hors ligne sur votre appareil. Les nouvelles clés ne seront pas reliées aux contacts - Mises à jour automatiques des clés Avertissement Ces fonctions ne sont pas encore terminées et n’ont pas fait l’objet de recherche sur leur convivialité ni leur sécurité. Par conséquent, ne vous fiez pas à leur sécurité et veuillez ne pas signaler les problèmes que vous rencontrez. Preuves keybase.io diff --git a/OpenKeychain/src/main/res/values-gl/strings.xml b/OpenKeychain/src/main/res/values-gl/strings.xml index 35927297c..16b220749 100644 --- a/OpenKeychain/src/main/res/values-gl/strings.xml +++ b/OpenKeychain/src/main/res/values-gl/strings.xml @@ -211,8 +211,7 @@ Ligar chaves a contactos baseándose en nomes e enderezos de correo electrónico. Isto acontece sen precisar conexión a rede no seu dispositivo. As novas chaves non se ligarán aos contactos - Actualización automática de chaves - Aviso + Aviso Estas características aínda non están rematadas ou son resultado da investigación da experiencia de usuaria e/ou seguridade. Xa que logo, non confíe na súa seguridade e por favor non informe sobre os fallos que poida atopar! probas de Keybase.io Pedirlle probas de chave a keybase.io e expoñelas cada vez que se mostra a chave diff --git a/OpenKeychain/src/main/res/values-hu/strings.xml b/OpenKeychain/src/main/res/values-hu/strings.xml index 515c3268e..4d438f777 100644 --- a/OpenKeychain/src/main/res/values-hu/strings.xml +++ b/OpenKeychain/src/main/res/values-hu/strings.xml @@ -212,7 +212,6 @@ Kulcsok összekapcsolása partnerekkel a nevük és az e-mail címük alapján. Ez teljesen mértékben hálózati kapcsolat nélkül történik az ön eszközén. Az új kulcsok nem lesznek összekapcsolva partnerekkel - Automatikus kulcsfrissítések Figyelmeztetés Ezek a funkciók még nincsenek befejezve, vagy felhasználói élmény és biztonsági kutatást eredményei. Emiatt ne bízzon a biztonságukban, és ne jelentse a felmerülő hibákat! Keybase.io igazolások diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml index 6e8273515..956f60651 100644 --- a/OpenKeychain/src/main/res/values-it/strings.xml +++ b/OpenKeychain/src/main/res/values-it/strings.xml @@ -194,8 +194,7 @@ Collega le chiavi ai contatti in base ai nomi e indirizzi email. Ciò avviene completamente offline sul tuo dispositivo. Le chiavi nuove non verranno collegate ai contatti - Aggiornamenti automatici delle chiavi - Attenzione + Attenzione Queste funzioni non sono ancora finite o testate da utenti/ricerche di sicurezza. Perciò non contare sulla loro sicurezza e per favore non segnalare i problemi che riscontri! Contatta keybase.io per avere prove e mostrale ogni volta che visualizzo una chiave (Le icone e molte schermate non sono ancora modificate correttamente per il tema scuro) diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index efe656435..a296086fa 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -212,7 +212,6 @@ オフランで完結して、名前とメールアドレスに基づいて、鍵を連絡先にリンク 新しい鍵は連絡先と関連付けしない - 鍵の自動アップデート 注意 これらの機能はまだ完成していないか、ユーザーエクスペリエンス/セキュリティ研究の結果ではありません。そのため、このセキュリティに依存したり、遭遇した問題を報告しないでください! Keybase.io 検証 diff --git a/OpenKeychain/src/main/res/values-ko/strings.xml b/OpenKeychain/src/main/res/values-ko/strings.xml index f219a4076..50c8ca402 100644 --- a/OpenKeychain/src/main/res/values-ko/strings.xml +++ b/OpenKeychain/src/main/res/values-ko/strings.xml @@ -202,8 +202,7 @@ 이름과 이메일 주소에 기초해 키를 연락처에 연결합니다. 이 작업은 완전히 오프라인에서만 수행됩니다. 새 키를 앞으로 연락처에 연결하지 않음 - 자동 키 갱신 - 경고 + 경고 이 기능들은 아직 완성되지 않았거나 유저 경험/보안 연구의 결과가 아닙니다. 그러니 이 기능의 보안성에 의존하거나 겪는 문제를 보고하지 말아주세요! keybase.io에 연결해서 키가 표시될 때 마다 키 증명을 표시 (아이콘이나 많은 화면이 검은 테마에 알맞게 아직 조정되지 않았습니다) diff --git a/OpenKeychain/src/main/res/values-nb/strings.xml b/OpenKeychain/src/main/res/values-nb/strings.xml index 5911b5878..d12329dcb 100644 --- a/OpenKeychain/src/main/res/values-nb/strings.xml +++ b/OpenKeychain/src/main/res/values-nb/strings.xml @@ -202,8 +202,7 @@ Lenk nøkler til kontakter basert på navn og e-postadresser. Dette skjer helt frakoblet på din enhet. Nye nøkler vil ikke lenkes til kontakter - Automatiske nøkkeloppdateringer - Advarsel + Advarsel Disse funksjonene er ikke ferdige enda, eller resultat av brukererfaring/sikkerhetsforskning. Som sådan, bør du ikke stole på at de er sikre, og ikke rapportere feil du kommer over! Keybase.io-bevis Kontakt keybase.io for nøkkelbevis og vis dem hver gang en nøkkel vises diff --git a/OpenKeychain/src/main/res/values-nl-rBE/strings.xml b/OpenKeychain/src/main/res/values-nl-rBE/strings.xml index d9d3b947f..e4042024f 100644 --- a/OpenKeychain/src/main/res/values-nl-rBE/strings.xml +++ b/OpenKeychain/src/main/res/values-nl-rBE/strings.xml @@ -212,8 +212,7 @@ Koppel sleutels aan contacten gebaseerd op namen en e-mailadressen. Dit gebeurt volledig offline op je apparaat. Nieuwe sleutels zullen niet worden gekoppeld aan contacten - Automatische sleutelupdates - Waarschuwing + Waarschuwing Deze functies zijn nog niet afgewerkt of zijn resultaten van gebruikerservaringen/beveiligingsonderzoek. Vertrouw daarom niet op hun beveiliging en rapporteer geen problemen die je ervaart! Keybase.io-bewijzen Maak contact met keybase.io voor bevestigingen van sleutels en toon deze telkens wanneer een sleutel wordt weergegeven diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml index 4770a05d1..cc68f64e1 100644 --- a/OpenKeychain/src/main/res/values-nl/strings.xml +++ b/OpenKeychain/src/main/res/values-nl/strings.xml @@ -212,7 +212,6 @@ Koppel sleutels aan contacten gebaseerd op namen en e-mailadressen. Dit gebeurt volledig offline op je apparaat. Nieuwe sleutels zullen niet worden gekoppeld aan contacten - Automatische sleutelupdates Waarschuwing Deze functies zijn nog niet afgewerkt of zijn resultaten van gebruikerservaringen/beveiligingsonderzoek. Vertrouw daarom niet op hun beveiliging en rapporteer geen problemen die je ervaart! Keybase.io-bewijzen diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml index 3b8d6db21..9d3151aa5 100644 --- a/OpenKeychain/src/main/res/values-pl/strings.xml +++ b/OpenKeychain/src/main/res/values-pl/strings.xml @@ -212,8 +212,7 @@ Połącz klucze z kontaktami używając nazw i adresów e-mail. Ta operacja jest wykonywana offline wyłączenie na tym urządzeniu. Nowe klucze nie będą połączone z kontaktami - Automatyczne aktualizacje kluczy - Ostrzeżenie + Ostrzeżenie Te funkcje nie są jeszcze skończone lub są wynikiem badań bezpieczeństwa / wrażeń użytkownika. Tak więc nie polegaj na ich bezpieczeństwie i nie zgłaszaj problemów z nimi związanych! Dowody keybase.io Sprawdź keybase.io dla dowodów kluczy i pokaż je za każdym razem kiedy klucz jest wyświetlany diff --git a/OpenKeychain/src/main/res/values-pt-rBR/strings.xml b/OpenKeychain/src/main/res/values-pt-rBR/strings.xml index 662cba02c..6735b8a90 100644 --- a/OpenKeychain/src/main/res/values-pt-rBR/strings.xml +++ b/OpenKeychain/src/main/res/values-pt-rBR/strings.xml @@ -212,8 +212,7 @@ Vincula chaves a contatos com base em nomes e endereços de email. Isto acontece completamente off-line em seu dispositivo. Novas chaves não serão vinculadas aos contatos - Atualização automática de chaves - Aviso + Aviso Esses recursos ainda não estão finalizados ou resultam de pesquisas de experiência/segurança do usuário. Dessa forma, não confie em sua segurança e, por favor, não relate problemas que encontre! Provas Keybase.io Contate o keybase.io para as provas de chaves e mostre-as toda vez que uma chave for exibida diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index 6b657c690..18839b039 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -212,7 +212,6 @@ Связывать ключи с контактами основываясь на именах и адресах электронной почты. Это происходит полностью в автономном режиме на вашем устройстве. Новые ключи не будут связаны с контактами - Автообновление ключей Предупреждение Эти новые возможности ещё не закончены и/или пока только изучаются. Проще говоря, не стоит полагаться на их безопасность. Пожалуйста, не сообщайте о связанных с ними проблемах! Подтверждение Keybase.io diff --git a/OpenKeychain/src/main/res/values-sr/strings.xml b/OpenKeychain/src/main/res/values-sr/strings.xml index 061113704..0a1ad4509 100644 --- a/OpenKeychain/src/main/res/values-sr/strings.xml +++ b/OpenKeychain/src/main/res/values-sr/strings.xml @@ -188,8 +188,7 @@ Повезивање кључева са контактима на основу имена и е-адреса. Одвија се у потпуности ван везе на вашем уређају. Нови кључеви неће бити повезани са контактима - Аутоматско ажурирање кључева - Упозорење + Упозорење Ове функције још нису завршене или су резултат истраживања корисничког искуства и безбедности. Стога се не ослањајте на њихову безбедност и молимо вас да не пријављујете грешке на које наиђете! Тражење доказа кључева на keybase.io и њихов приказ приликом приказивања кључа (Иконе и многи екрани још нису прилагођени за тамну тему) diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml index 0908b17b5..11239a983 100644 --- a/OpenKeychain/src/main/res/values-sv/strings.xml +++ b/OpenKeychain/src/main/res/values-sv/strings.xml @@ -212,7 +212,6 @@ Länka nycklar till kontakter baserade på namn och e-postadresser. Detta sker helt offline på enheten. Nya nycklar kommer inte att kopplas till kontakter - Automatiska nyckeluppdateringar Varning Dessa funktioner är ännu inte färdiga eller resultat av användarupplevelse/säkerhetsforskning. Lita därför inte på deras säkerhet och var snäll och rapportera inte problem du stöter på! Keybase.io proofs diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml index 6bbb8702f..1eb39243e 100644 --- a/OpenKeychain/src/main/res/values-uk/strings.xml +++ b/OpenKeychain/src/main/res/values-uk/strings.xml @@ -212,8 +212,7 @@ Прив\'язувати ключі до контактів на основі імен та адрес електронної пошти. Це відбувається повністю локально на Вашому пристрої. Нові ключі не будуть прив\'язані до контактів - Автоматичне оновлення ключів - Попередження + Попередження Ці можливості ще в розробці. Будь ласка, не сподівайтесь на їх безпеку та не повідомляйте про проблеми їхнього використання! Перевірки Keybase.io Контактувати з keybase.io для підтвердження ключа та показувати дійсності щоразу, коли ключ відображено diff --git a/OpenKeychain/src/main/res/values-vi/strings.xml b/OpenKeychain/src/main/res/values-vi/strings.xml index 52a57cfd8..4e7a0cfbb 100644 --- a/OpenKeychain/src/main/res/values-vi/strings.xml +++ b/OpenKeychain/src/main/res/values-vi/strings.xml @@ -189,8 +189,7 @@ Liên kết khóa với danh bạ dựa trên tên và địa chỉ thư. Nó được thực hiện hoàn toàn ngoại tuyến trên thiết bị của bạn. Các khóa mới sẽ không được liên kết với danh bạ - Cập nhật khóa tự động - Cảnh báo + Cảnh báo Tính năng này hiện chưa được hoàn thành hoặc chỉ mới là kết quả nghiên cứu/thử nghiệm. Do vậy, bạn đừng tin cậy vào tính an toàn của chúng cũng như không cần thiết phải thông báo với chúng tôi! Liên hệ với keybase.io để minh chứng khóa và hiển thị chúng mỗi khi khóa được gọi (Các biểu tượng và nhiều màn hình không được thêm vào giao diện dạng tối) diff --git a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml index 2d0af733e..58abf1121 100644 --- a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml +++ b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml @@ -213,8 +213,7 @@ 連接金鑰至聯絡人(基於姓名和電子郵件地址)。這只在您的裝置上離線進行。 新的金鑰將不會與聯絡人連接 - 自動金鑰同步 - 警告 + 警告 Keybase.io 證明 啟用洋蔥(Tor)網路 diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml index 40cb2da8f..67c08e4a5 100644 --- a/OpenKeychain/src/main/res/values-zh/strings.xml +++ b/OpenKeychain/src/main/res/values-zh/strings.xml @@ -212,7 +212,6 @@ 根据名字和邮件地址将密钥关联到联系人。这是本地操作,不需要设备联网。 新密钥将不会与联系人相关联 - 自动更新密钥 警告 这些功能目前尚未完成或者缺少用户经验性/安全性的研究结果。所以,不保证他们是安全的,请不要报告遇到的问题! Keybase.io 证明 diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index ce2457c16..6943f9f9a 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -220,11 +220,6 @@ "Every three days, keys are updated from the preferred keyserver" "Keys are not automatically updated" "Sync only on Wi-Fi" - "Link keys to contacts" - "Link keys to contacts based on names and email addresses. This happens completely offline on your device." - "New keys will not be linked to contacts" - - "Automatic key updates" "Warning" "These features are not yet finished or results of user experience/security research. Thus, don't rely on their security and please don't report issues you encounter!" diff --git a/OpenKeychain/src/main/res/xml/account_desc.xml b/OpenKeychain/src/main/res/xml/account_desc.xml deleted file mode 100644 index 942909dbe..000000000 --- a/OpenKeychain/src/main/res/xml/account_desc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/OpenKeychain/src/main/res/xml/sync_adapter_contacts.xml b/OpenKeychain/src/main/res/xml/sync_adapter_contacts.xml deleted file mode 100644 index a134fdebe..000000000 --- a/OpenKeychain/src/main/res/xml/sync_adapter_contacts.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/OpenKeychain/src/main/res/xml/sync_adapter_contacts_structure.xml b/OpenKeychain/src/main/res/xml/sync_adapter_contacts_structure.xml deleted file mode 100644 index 39dd8bc91..000000000 --- a/OpenKeychain/src/main/res/xml/sync_adapter_contacts_structure.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/OpenKeychain/src/main/res/xml/sync_preferences.xml b/OpenKeychain/src/main/res/xml/sync_preferences.xml index 6e57376e1..6301affbc 100644 --- a/OpenKeychain/src/main/res/xml/sync_preferences.xml +++ b/OpenKeychain/src/main/res/xml/sync_preferences.xml @@ -3,15 +3,14 @@ android:key="syncKeyserver" android:defaultValue="true" android:persistent="true" - android:title="@string/label_sync_settings_keyserver_title"/> + android:title="@string/label_sync_settings_keyserver_title" + android:summaryOn="@string/label_sync_settings_keyserver_summary_on" + android:summaryOff="@string/label_sync_settings_keyserver_summary_off" + /> - From 08445f049a6ccdd55fe68134f1ecf4fe1410caef Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 5 Sep 2020 14:40:02 +0200 Subject: [PATCH 5/8] schedule cleanup work with unique name --- .../keychain/provider/TemporaryFileProvider.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java index 37901984b..bb77aeba3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java @@ -26,7 +26,6 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; -import android.app.Application; import android.content.ClipDescription; import android.content.ContentProvider; import android.content.ContentResolver; @@ -41,6 +40,7 @@ import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import androidx.annotation.NonNull; +import androidx.work.ExistingWorkPolicy; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; import androidx.work.Worker; @@ -77,6 +77,7 @@ public class TemporaryFileProvider extends ContentProvider { public static final String AUTHORITY = Constants.TEMP_FILE_PROVIDER_AUTHORITY; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); private static final int DB_VERSION = 3; + public static final String WORK_NAME_CLEANUP = "cleanup"; interface TemporaryFileColumns { String COLUMN_UUID = "id"; @@ -315,20 +316,22 @@ public class TemporaryFileProvider extends ContentProvider { public static void scheduleCleanupAfterTtl(Context context) { OneTimeWorkRequest cleanupWork = new OneTimeWorkRequest.Builder(CleanupWorker.class) .setInitialDelay(Constants.TEMPFILE_TTL, TimeUnit.MILLISECONDS).build(); - workManagerEnqueue(context, cleanupWork); + workManagerEnqueueCleanup(context, cleanupWork); } public static void scheduleCleanupImmediately(Context context) { OneTimeWorkRequest cleanupWork = new OneTimeWorkRequest.Builder(CleanupWorker.class).build(); - workManagerEnqueue(context, cleanupWork); + workManagerEnqueueCleanup(context, cleanupWork); } - private static void workManagerEnqueue(Context context, OneTimeWorkRequest cleanupWork) { + private static void workManagerEnqueueCleanup(Context context, OneTimeWorkRequest cleanupWork) { // work manager is only available on the main thread if (!BuildConfig.APPLICATION_ID.equals(KeychainApplication.getProcessName())) { return; } - WorkManager.getInstance(context).enqueue(cleanupWork); + WorkManager + .getInstance(context) + .enqueueUniqueWork(TemporaryFileProvider.WORK_NAME_CLEANUP, ExistingWorkPolicy.REPLACE, cleanupWork); } public static class CleanupWorker extends Worker { From 8d1b81a4c9b3c6cc959dc849b5a93e2d0630dca0 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 5 Sep 2020 14:53:05 +0200 Subject: [PATCH 6/8] drop some unused resources --- .../src/main/res/raw/fp_sentence_adjectives | 128 ----- .../src/main/res/raw/fp_sentence_adverbs | 64 --- .../src/main/res/raw/fp_sentence_articles | 8 - .../src/main/res/raw/fp_sentence_nouns | 512 ------------------ .../src/main/res/raw/fp_sentence_prepositions | 32 -- .../src/main/res/raw/fp_sentence_verbs_i | 128 ----- .../src/main/res/raw/fp_sentence_verbs_t | 128 ----- 7 files changed, 1000 deletions(-) delete mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_adjectives delete mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_adverbs delete mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_articles delete mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_nouns delete mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_prepositions delete mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_verbs_i delete mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_verbs_t diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_adjectives b/OpenKeychain/src/main/res/raw/fp_sentence_adjectives deleted file mode 100644 index cf8fa4674..000000000 --- a/OpenKeychain/src/main/res/raw/fp_sentence_adjectives +++ /dev/null @@ -1,128 +0,0 @@ -able -angry -bad -bent -bitter -black -blue -boiling -bright -broken -brown -certain -cheap -clean -clear -cold -common -complex -cruel -dark -dead -dear -deep -dirty -dry -early -elastic -equal -false -fat -feeble -female -fertile -first -fixed -flat -foolish -free -full -future -general -good -great -green -grey -hanging -happy -hard -healthy -high -hollow -kind -last -late -lazy -left -like -living -long -loose -loud -low -male -married -medical -mixed -narrow -natural -new -normal -old -open -past -poor -present -pretty -private -public -quick -quiet -ready -rare -red -regular -right -rough -round -sad -safe -same -second -secret -serious -sharp -short -shut -sick -simple -slow -small -smooth -soft -solid -sour -special -sticky -stiff -strange -strong -sudden -sweet -tall -thick -thin -tight -tired -true -unknown -violent -waiting -warm -wet -white -wide -wise -wrong -yellow -young diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_adverbs b/OpenKeychain/src/main/res/raw/fp_sentence_adverbs deleted file mode 100644 index 1d6002387..000000000 --- a/OpenKeychain/src/main/res/raw/fp_sentence_adverbs +++ /dev/null @@ -1,64 +0,0 @@ -ably -angrily -badly -bitterly -brightly -brokenly -cheaply -clearly -coldly -commonly -cruelly -darkly -dearly -deeply -drily -equally -falsely -feebly -fixedly -flatly -freely -fully -greatly -happily -hardly -kindly -lately -lazily -loosely -loudly -narrowly -newly -normally -openly -poorly -prettily -publicly -quickly -quietly -readily -rarely -roughly -sadly -safely -secretly -sharply -simply -slowly -smoothly -softly -solidly -sourly -stiffly -strongly -suddenly -sweetly -thickly -thinly -tightly -tiredly -truly -warmly -widely -wisely diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_articles b/OpenKeychain/src/main/res/raw/fp_sentence_articles deleted file mode 100644 index 0604b3d07..000000000 --- a/OpenKeychain/src/main/res/raw/fp_sentence_articles +++ /dev/null @@ -1,8 +0,0 @@ -her -his -my -our -that -the -this -your diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_nouns b/OpenKeychain/src/main/res/raw/fp_sentence_nouns deleted file mode 100644 index ed4099c31..000000000 --- a/OpenKeychain/src/main/res/raw/fp_sentence_nouns +++ /dev/null @@ -1,512 +0,0 @@ -account -air -amount -angle -animal -answer -ant -apple -arch -arm -army -attack -attempt -baby -back -bag -ball -band -base -basin -basket -bath -bed -bee -belief -bell -berry -bird -birth -bite -blade -blood -blow -board -boat -body -bone -book -boot -bottle -box -boy -brain -brake -branch -bread -breath -brick -bridge -brother -brush -bucket -bulb -burn -butter -button -cake -camera -canvas -car -card -cat -cause -chain -chalk -chance -change -cheese -chest -chin -church -circle -clock -cloth -cloud -coal -coat -collar -colour -comb -comfort -company -control -cook -copper -copy -cord -cork -cotton -cough -country -cover -cow -crack -credit -crime -crush -cry -cup -current -curtain -curve -cushion -damage -danger -day -debt -degree -design -desire -detail -disease -disgust -dog -door -doubt -drain -drawer -dress -drink -drop -dust -ear -earth -edge -effect -egg -end -engine -error -event -example -expert -eye -face -fact -fall -family -farm -father -fear -feather -feeling -fiction -field -fight -finger -fire -fish -flag -flame -flight -floor -flower -fly -fold -food -foot -force -fork -form -fowl -frame -friend -front -fruit -garden -girl -glass -glove -goat -gold -grain -grass -grip -group -growth -guide -gun -hair -hammer -hand -harbour -harmony -hat -hate -head -heart -heat -history -hole -hook -hope -horn -horse -hour -house -humour -ice -idea -impulse -ink -insect -iron -island -jelly -jewel -join -journey -judge -jump -kettle -key -kick -kiss -knee -knife -knot -land -laugh -law -lead -leaf -leather -leg -letter -level -library -lift -light -limit -line -linen -lip -liquid -list -lock -look -loss -love -machine -man -manager -map -mark -market -mass -match -meal -measure -meat -meeting -memory -metal -middle -milk -mind -mine -minute -mist -money -monkey -month -moon -morning -mother -motion -mouth -move -muscle -music -nail -name -nation -neck -need -needle -nerve -net -news -night -noise -nose -note -number -nut -offer -office -oil -opinion -orange -order -oven -owner -page -pain -paint -paper -parcel -part -paste -payment -peace -pen -pencil -person -picture -pig -pin -pipe -place -plane -plant -plate -play -plough -pocket -point -poison -polish -porter -pot -potato -powder -power -price -print -prison -process -produce -profit -prose -protest -pull -pump -purpose -push -quality -rail -rain -range -rat -rate -ray -reason -receipt -record -regret -request -respect -rest -reward -rhythm -rice -ring -river -road -rod -roll -roof -room -root -rub -rule -run -sail -salt -sand -scale -school -science -screw -sea -seat -seed -self -sense -servant -sex -shade -shake -shame -sheep -shelf -ship -shirt -shock -shoe -side -sign -silk -silver -sister -size -skin -skirt -sky -sleep -slip -slope -smash -smell -smile -smoke -snake -sneeze -snow -soap -society -sock -son -song -sort -sound -soup -space -spade -sponge -spoon -spring -square -stage -stamp -star -start -station -steam -steel -stem -step -stick -stitch -stomach -stone -stop -store -story -street -stretch -sugar -summer -sun -support -swim -system -table -tail -talk -taste -tax -test -theory -thing -thought -thread -throat -thumb -thunder -ticket -time -tin -toe -tongue -tooth -top -touch -town -trade -train -tray -tree -trick -trouble -turn -twist -unit -value -verse -vessel -view -voice -walk -wall -war -wash -waste -watch -water -wave -wax -way -weather -week -weight -wheel -whip -whistle -wind -window -wine -wing -winter -wire -woman -wood -wool -word -work -worm -wound -writing -year diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_prepositions b/OpenKeychain/src/main/res/raw/fp_sentence_prepositions deleted file mode 100644 index fb8206636..000000000 --- a/OpenKeychain/src/main/res/raw/fp_sentence_prepositions +++ /dev/null @@ -1,32 +0,0 @@ -above -across -after -against -along -among -around -at -before -behind -below -beneath -beside -between -beyond -by -from -in -inside -into -near -on -outside -over -past -round -through -to -towards -under -upon -with diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_verbs_i b/OpenKeychain/src/main/res/raw/fp_sentence_verbs_i deleted file mode 100644 index 57602bf17..000000000 --- a/OpenKeychain/src/main/res/raw/fp_sentence_verbs_i +++ /dev/null @@ -1,128 +0,0 @@ -agrees -allows -answers -arrives -asks -is -becomes -begins -believes -brings -burns -buys -calls -changes -chooses -cleans -closes -comes -compares -continues -cooks -costs -counts -cries -cuts -dances -decides -describes -destroys -dies -does -drinks -drives -eats -ends -explains -falls -feels -fights -fills -finds -finishes -forgets -forgives -gets -gives -goes -grows -hates -has -hears -helps -hides -holds -hurts -improves -jumps -keeps -kills -knows -laughs -learns -leaves -lets -lies -listens -lives -looks -loses -loves -makes -meets -moves -needs -occurs -offers -opens -pays -plays -prefers -prepares -presses -promises -pulls -pushes -puts -reads -receives -remembers -repeats -rests -returns -runs -sees -sells -sends -shouts -shows -sings -sits -sleeps -smiles -speaks -starts -stays -stops -studies -suggests -supports -takes -talks -teaches -tells -thinks -throws -touches -travels -treats -tries -turns -uses -visits -walks -wants -washes -wins -works -writes diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_verbs_t b/OpenKeychain/src/main/res/raw/fp_sentence_verbs_t deleted file mode 100644 index 36078bc78..000000000 --- a/OpenKeychain/src/main/res/raw/fp_sentence_verbs_t +++ /dev/null @@ -1,128 +0,0 @@ -agrees with -allows -answers -arrives at -asks -is -becomes -begins -believes -brings -burns -buys -calls -changes -chooses -cleans -closes -comes to -compares -continues -cooks -costs -counts -cries for -cuts -dances with -decides on -describes -destroys -dies for -does -drinks -drives -eats -ends -explains -falls on -feels -fights -fills -finds -finishes -forgets -forgives -gets -gives -goes to -grows -hates -has -hears -helps -hides -holds -hurts -improves -jumps over -keeps -kills -knows -laughs at -learns -leaves -lets -lies to -listens to -lives with -looks at -loses -loves -makes -meets -moves -needs -occurs to -offers -opens -pays -plays -prefers -prepares -presses -promises -pulls -pushes -puts -reads -receives -remembers -repeats -rests by -returns -runs to -sees -sells -sends -shouts at -shows -sings to -sits by -sleeps by -smiles at -speaks to -starts -stays with -stops -studies -suggests -supports -takes -talks to -teaches -tells -thinks of -throws -touches -travels to -treats -tries -turns -uses -visits -walks to -wants -washes -wins -works for -writes to From aa390fadb8d130b3c5090b3132e98d18d21f18aa Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 5 Sep 2020 15:10:34 +0200 Subject: [PATCH 7/8] schedule key sync work with unique name --- .../keysync/KeyserverSyncManager.java | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java index 6cd1fdc11..327174d37 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java @@ -18,7 +18,6 @@ package org.sufficientlysecure.keychain.keysync; -import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -29,11 +28,10 @@ import android.os.Build.VERSION_CODES; import androidx.annotation.WorkerThread; import androidx.work.Constraints.Builder; +import androidx.work.ExistingPeriodicWorkPolicy; import androidx.work.NetworkType; import androidx.work.OneTimeWorkRequest; import androidx.work.PeriodicWorkRequest; -import androidx.work.WorkInfo; -import androidx.work.WorkInfo.State; import androidx.work.WorkManager; import org.sufficientlysecure.keychain.util.Preferences; import timber.log.Timber; @@ -43,7 +41,8 @@ public class KeyserverSyncManager { private static final long SYNC_INTERVAL = 3; private static final TimeUnit SYNC_INTERVAL_UNIT = TimeUnit.DAYS; - private static final String PERIODIC_WORK_TAG = "keyserverSync"; + private static final String LEGACY_PERIODIC_WORK_TAG = "keyserverSync"; + private static final String WORK_UNIQUE_NAME = "periodicKeyserverSync"; public static void updateKeyserverSyncScheduleAsync(Context context, boolean forceReschedule) { new AsyncTask() { @@ -60,27 +59,12 @@ public class KeyserverSyncManager { Preferences prefs = Preferences.getPreferences(context); WorkManager workManager = WorkManager.getInstance(context); - UUID workUuid = prefs.getKeyserverSyncWorkUuid(); - try { - WorkInfo info = workUuid != null ? workManager.getWorkInfoById(workUuid).get() : null; - - boolean workIsScheduled = info != null && info.getState() != State.CANCELLED; - if (workIsScheduled == prefs.isKeyserverSyncEnabled()) { - if (!forceReschedule) { - Timber.d("Key sync already scheduled, no changes necessary"); - return; - } - Timber.d("Key sync already scheduled, but forcing reschedule"); - } - } catch (ExecutionException | InterruptedException e) { - Timber.e(e, "Error getting info for scheduled key sync work?"); - } - - Timber.d("Cancelling sync tasks…"); - workManager.cancelAllWorkByTag(PERIODIC_WORK_TAG); + // Cancel work that was scheduled by tag, as we used to do. + workManager.cancelAllWorkByTag(LEGACY_PERIODIC_WORK_TAG); if (!prefs.isKeyserverSyncEnabled()) { Timber.d("Key sync disabled"); + workManager.cancelUniqueWork(WORK_UNIQUE_NAME); return; } @@ -96,10 +80,12 @@ public class KeyserverSyncManager { PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(KeyserverSyncWorker.class, SYNC_INTERVAL, SYNC_INTERVAL_UNIT) .setConstraints(constraints.build()) - .addTag(PERIODIC_WORK_TAG) .build(); try { - workManager.enqueue(workRequest).getResult().get(); + ExistingPeriodicWorkPolicy policy = forceReschedule + ? ExistingPeriodicWorkPolicy.REPLACE + : ExistingPeriodicWorkPolicy.KEEP; + workManager.enqueueUniquePeriodicWork(WORK_UNIQUE_NAME, policy, workRequest).getResult().get(); Timber.d("Work id: %s", workRequest.getId()); prefs.setKeyserverSyncScheduled(workRequest.getId()); } catch (InterruptedException | ExecutionException e) { From cb111a09c95cea985b17f76c4a181a9c2003164e Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 5 Sep 2020 20:31:03 +0200 Subject: [PATCH 8/8] drop contacts permission and related features --- .../keychain/ui/CreateKeyEmailFragment.java | 21 +- .../keychain/ui/CreateKeyNameFragment.java | 8 +- .../keychain/ui/ImportKeysSearchFragment.java | 65 +- .../ui/dialog/AddEmailDialogFragment.java | 5 +- .../ui/dialog/AddUserIdDialogFragment.java | 12 +- .../ui/keyview/KeyFragmentViewModel.java | 14 - .../keychain/ui/keyview/ViewKeyActivity.java | 66 +- .../keychain/ui/keyview/ViewKeyFragment.java | 62 +- .../ui/keyview/loader/SystemContactDao.java | 137 --- .../keyview/view/SystemContactCardView.java | 67 -- .../keychain/ui/widget/EmailEditText.java | 88 -- .../keychain/ui/widget/NameEditText.java | 65 -- .../keychain/util/ContactHelper.java | 850 ------------------ .../src/main/res/layout/add_email_dialog.xml | 3 +- .../main/res/layout/add_user_id_dialog.xml | 5 +- .../res/layout/create_key_email_fragment.xml | 3 +- .../res/layout/create_key_name_fragment.xml | 2 +- .../src/main/res/layout/view_key_activity.xml | 31 - .../src/main/res/layout/view_key_fragment.xml | 13 - 19 files changed, 65 insertions(+), 1452 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java index 938a3ea62..e997ea701 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java @@ -17,17 +17,16 @@ package org.sufficientlysecure.keychain.ui; + +import java.util.ArrayList; +import java.util.List; + import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,18 +36,20 @@ import android.widget.EditText; import android.widget.ImageButton; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatEditText; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; import org.sufficientlysecure.keychain.ui.dialog.AddEmailDialogFragment; import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.ui.widget.EmailEditText; - -import java.util.ArrayList; -import java.util.List; public class CreateKeyEmailFragment extends Fragment { private CreateKeyActivity mCreateKeyActivity; - private EmailEditText mEmailEdit; + private AppCompatEditText mEmailEdit; private ArrayList mAdditionalEmailModels = new ArrayList<>(); private EmailAdapter mEmailAdapter; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java index f33506f18..d7ba9529a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java @@ -20,20 +20,20 @@ package org.sufficientlysecure.keychain.ui; import android.content.Context; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatEditText; +import androidx.fragment.app.Fragment; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; -import org.sufficientlysecure.keychain.ui.widget.NameEditText; public class CreateKeyNameFragment extends Fragment { CreateKeyActivity mCreateKeyActivity; - NameEditText mNameEdit; + AppCompatEditText mNameEdit; View mBackButton; View mNextButton; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java index 078a54eca..864d3ab3b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java @@ -17,19 +17,13 @@ package org.sufficientlysecure.keychain.ui; + import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.database.MatrixCursor; import android.os.Bundle; import android.preference.PreferenceActivity; -import android.provider.BaseColumns; -import androidx.fragment.app.Fragment; -import androidx.core.view.MenuItemCompat; -import androidx.core.view.MenuItemCompat.OnActionExpandListener; -import androidx.cursoradapter.widget.CursorAdapter; -import androidx.cursoradapter.widget.SimpleCursorAdapter; -import androidx.appcompat.widget.SearchView; +import android.text.InputType; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -38,18 +32,17 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; +import androidx.appcompat.widget.SearchView; +import androidx.core.view.MenuItemCompat; +import androidx.core.view.MenuItemCompat.OnActionExpandListener; +import androidx.fragment.app.Fragment; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState; import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener; -import org.sufficientlysecure.keychain.util.ContactHelper; import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.Preferences.CloudSearchPrefs; -import java.util.ArrayList; -import java.util.List; - import static androidx.appcompat.widget.SearchView.OnQueryTextListener; -import static androidx.appcompat.widget.SearchView.OnSuggestionListener; /** * Consists of the search bar, search button, and search settings button @@ -59,16 +52,9 @@ public class ImportKeysSearchFragment extends Fragment { public static final String ARG_QUERY = "query"; public static final String ARG_CLOUD_SEARCH_PREFS = "cloud_search_prefs"; - private static final String CURSOR_SUGGESTION = "suggestion"; - private Activity mActivity; private ImportKeysListener mCallback; - private List mNamesAndEmails; - private SimpleCursorAdapter mSearchAdapter; - - private List mCurrentSuggestions = new ArrayList<>(); - /** * Creates new instance of this fragment * @@ -92,14 +78,6 @@ public class ImportKeysSearchFragment extends Fragment { @Override public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState) { - ContactHelper contactHelper = new ContactHelper(mActivity); - mNamesAndEmails = contactHelper.getContactNames(); - mNamesAndEmails.addAll(contactHelper.getContactMails()); - - mSearchAdapter = new SimpleCursorAdapter(mActivity, - R.layout.import_keys_cloud_suggestions_item, null, new String[]{CURSOR_SUGGESTION}, - new int[]{android.R.id.text1}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); - setHasOptionsMenu(true); // no view, just search view @@ -126,21 +104,7 @@ public class ImportKeysSearchFragment extends Fragment { MenuItem searchItem = menu.findItem(R.id.menu_import_keys_cloud_search); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); - searchView.setSuggestionsAdapter(mSearchAdapter); - - searchView.setOnSuggestionListener(new OnSuggestionListener() { - @Override - public boolean onSuggestionSelect(int position) { - searchView.setQuery(mCurrentSuggestions.get(position), true); - return true; - } - - @Override - public boolean onSuggestionClick(int position) { - searchView.setQuery(mCurrentSuggestions.get(position), true); - return true; - } - }); + searchView.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override @@ -152,7 +116,6 @@ public class ImportKeysSearchFragment extends Fragment { @Override public boolean onQueryTextChange(String newText) { - updateAdapter(newText); return false; } }); @@ -180,20 +143,6 @@ public class ImportKeysSearchFragment extends Fragment { super.onCreateOptionsMenu(menu, inflater); } - private void updateAdapter(String query) { - mCurrentSuggestions.clear(); - MatrixCursor c = new MatrixCursor(new String[]{BaseColumns._ID, CURSOR_SUGGESTION}); - for (int i = 0; i < mNamesAndEmails.size(); i++) { - String s = mNamesAndEmails.get(i); - if (s.toLowerCase().startsWith(query.toLowerCase())) { - mCurrentSuggestions.add(s); - c.addRow(new Object[]{i, s}); - } - - } - mSearchAdapter.changeCursor(c); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java index 969e840bf..94b2c5379 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java @@ -27,6 +27,8 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; + +import androidx.appcompat.widget.AppCompatEditText; import androidx.fragment.app.DialogFragment; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -38,7 +40,6 @@ import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.ui.widget.EmailEditText; import timber.log.Timber; @@ -51,7 +52,7 @@ public class AddEmailDialogFragment extends DialogFragment implements OnEditorAc public static final String MESSAGE_DATA_EMAIL = "email"; private Messenger mMessenger; - private EmailEditText mEmail; + private AppCompatEditText mEmail; public static AddEmailDialogFragment newInstance(Messenger messenger) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java index be3625f04..37511b2ef 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java @@ -17,8 +17,8 @@ package org.sufficientlysecure.keychain.ui.dialog; + import android.app.Activity; -import androidx.appcompat.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -27,7 +27,6 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import androidx.fragment.app.DialogFragment; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -37,11 +36,12 @@ import android.widget.Button; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.AppCompatEditText; +import androidx.fragment.app.DialogFragment; import org.openintents.openpgp.util.OpenPgpUtils; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.KeyRing; -import org.sufficientlysecure.keychain.ui.widget.EmailEditText; -import org.sufficientlysecure.keychain.ui.widget.NameEditText; import timber.log.Timber; @@ -55,8 +55,8 @@ public class AddUserIdDialogFragment extends DialogFragment implements OnEditorA public static final String MESSAGE_DATA_USER_ID = "user_id"; private Messenger mMessenger; - private NameEditText mName; - private EmailEditText mEmail; + private AppCompatEditText mName; + private AppCompatEditText mEmail; public static AddUserIdDialogFragment newInstance(Messenger messenger, String predefinedName) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java index 80f131b8d..099d87f0b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java @@ -16,14 +16,11 @@ import org.sufficientlysecure.keychain.ui.keyview.loader.IdentityDao; import org.sufficientlysecure.keychain.ui.keyview.loader.IdentityDao.IdentityInfo; import org.sufficientlysecure.keychain.ui.keyview.loader.SubkeyStatusDao; import org.sufficientlysecure.keychain.ui.keyview.loader.SubkeyStatusDao.KeySubkeyStatus; -import org.sufficientlysecure.keychain.ui.keyview.loader.SystemContactDao; -import org.sufficientlysecure.keychain.ui.keyview.loader.SystemContactDao.SystemContactInfo; public class KeyFragmentViewModel extends ViewModel { private LiveData> identityInfo; private LiveData subkeyStatus; - private LiveData systemContactInfo; private LiveData keyserverStatus; LiveData> getIdentityInfo(Context context, LiveData unifiedKeyInfoLiveData) { @@ -46,17 +43,6 @@ public class KeyFragmentViewModel extends ViewModel { return subkeyStatus; } - LiveData getSystemContactInfo(Context context, LiveData unifiedKeyInfoLiveData) { - if (systemContactInfo == null) { - SystemContactDao systemContactDao = SystemContactDao.getInstance(context); - systemContactInfo = Transformations.switchMap(unifiedKeyInfoLiveData, - (unifiedKeyInfo) -> unifiedKeyInfo == null ? null : new GenericLiveData<>(context, - () -> systemContactDao.getSystemContactInfo(unifiedKeyInfo.master_key_id(), - unifiedKeyInfo.has_any_secret()))); - } - return systemContactInfo; - } - LiveData getKeyserverStatus(Context context, LiveData unifiedKeyInfoLiveData) { if (keyserverStatus == null) { KeyMetadataDao keyMetadataDao = KeyMetadataDao.create(context); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java index 5bb3393d9..b3193de09 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java @@ -28,11 +28,9 @@ import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityOptions; -import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; -import android.graphics.PorterDuff; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; @@ -40,17 +38,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.provider.ContactsContract; -import androidx.annotation.IntDef; -import androidx.annotation.NonNull; -import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.appbar.CollapsingToolbarLayout; -import androidx.coordinatorlayout.widget.CoordinatorLayout; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import androidx.core.app.ActivityCompat; -import androidx.fragment.app.FragmentManager; -import androidx.core.content.ContextCompat; -import androidx.cardview.widget.CardView; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -58,13 +45,22 @@ import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; -import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.cardview.widget.CardView; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.ViewModelProviders; +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.appbar.CollapsingToolbarLayout; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.daos.KeyRepository; @@ -102,10 +98,8 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.ui.util.QrCodeUtils; -import org.sufficientlysecure.keychain.util.ContactHelper; import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.ShareKeyHelper; -import timber.log.Timber; public class ViewKeyActivity extends BaseSecurityTokenActivity { @@ -121,7 +115,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { public static final String EXTRA_MASTER_KEY_ID = "master_key_id"; public static final String EXTRA_DISPLAY_RESULT = "display_result"; - public static final String EXTRA_LINKED_TRANSITION = "linked_transition"; KeyRepository keyRepository; @@ -140,8 +133,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { private ImageButton actionShare; private ImageButton actionShareClipboard; private FloatingActionButton floatingActionButton; - private ImageView photoView; - private FrameLayout photoLayout; private ImageView qrCodeView; private CardView qrCodeLayout; @@ -181,8 +172,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { actionShare= findViewById(R.id.view_key_action_share); actionShareClipboard = findViewById(R.id.view_key_action_share_clipboard); floatingActionButton = findViewById(R.id.fab); - photoView = findViewById(R.id.view_key_photo); - photoLayout = findViewById(R.id.view_key_photo_layout); qrCodeView = findViewById(R.id.view_key_qr_code); qrCodeLayout = findViewById(R.id.view_key_qr_code_layout); @@ -243,20 +232,10 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { long masterKeyId; Intent intent = getIntent(); - Uri dataUri = intent.getData(); if (intent.hasExtra(EXTRA_MASTER_KEY_ID)) { masterKeyId = intent.getLongExtra(EXTRA_MASTER_KEY_ID, 0L); - } else if (dataUri != null && dataUri.getHost().equals(ContactsContract.AUTHORITY)) { - Long contactMasterKeyId = new ContactHelper(this).masterKeyIdFromContactsDataUri(dataUri); - if (contactMasterKeyId == null) { - Timber.e("Contact Data missing. Should be uri of key!"); - Toast.makeText(this, R.string.error_contacts_key_id_missing, Toast.LENGTH_LONG).show(); - finish(); - return; - } - masterKeyId = contactMasterKeyId; } else { - throw new IllegalArgumentException("Missing required extra master_key_id or contact uri"); + throw new IllegalArgumentException("Missing required extra master_key_id"); } actionEncryptFile.setOnClickListener(v -> encrypt(false)); @@ -660,25 +639,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { // this is done at the end of the animation otherwise } - AsyncTask photoTask = - new AsyncTask() { - protected Bitmap doInBackground(Long... mMasterKeyId) { - return new ContactHelper(ViewKeyActivity.this) - .loadPhotoByMasterKeyId(mMasterKeyId[0], true); - } - - protected void onPostExecute(Bitmap photo) { - if (photo == null) { - return; - } - - photoView.setImageBitmap(photo); - photoView.setColorFilter(ContextCompat.getColor(ViewKeyActivity.this, R.color.toolbar_photo_tint), - PorterDuff.Mode.SRC_ATOP); - photoLayout.setVisibility(View.VISIBLE); - } - }; - boolean showStatusText = unifiedKeyInfo.is_secure() && !unifiedKeyInfo.is_expired() && !unifiedKeyInfo.is_revoked(); if (showStatusText) { statusText.setVisibility(View.VISIBLE); @@ -733,7 +693,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { if (!Arrays.equals(unifiedKeyInfo.fingerprint(), qrCodeLoaded)) { loadQrCode(unifiedKeyInfo.fingerprint()); } - photoTask.execute(unifiedKeyInfo.master_key_id()); qrCodeLayout.setVisibility(View.VISIBLE); // and place leftOf qr code @@ -775,7 +734,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { KeyFormattingUtils.setStatusImage(this, statusImage, statusText, State.VERIFIED, R.color.icons, true); color = ContextCompat.getColor(this, R.color.key_flag_green); - photoTask.execute(unifiedKeyInfo.master_key_id()); hideFab(); } else { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java index d6e39aeeb..b8d7d1d79 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java @@ -20,25 +20,21 @@ package org.sufficientlysecure.keychain.ui.keyview; import java.util.List; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; -import android.net.Uri; import android.os.Bundle; -import android.os.Handler; -import android.provider.ContactsContract; -import androidx.annotation.NonNull; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentTransaction; -import androidx.appcompat.widget.PopupMenu; -import androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.PopupMenu; +import androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProvider; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround; import org.sufficientlysecure.keychain.daos.AutocryptPeerDao; @@ -55,18 +51,15 @@ import org.sufficientlysecure.keychain.ui.keyview.loader.IdentityDao.UserIdInfo; import org.sufficientlysecure.keychain.ui.keyview.loader.SubkeyStatusDao.KeyHealthStatus; import org.sufficientlysecure.keychain.ui.keyview.loader.SubkeyStatusDao.KeySubkeyStatus; import org.sufficientlysecure.keychain.ui.keyview.loader.SubkeyStatusDao.SubKeyItem; -import org.sufficientlysecure.keychain.ui.keyview.loader.SystemContactDao.SystemContactInfo; import org.sufficientlysecure.keychain.ui.keyview.view.IdentitiesCardView; import org.sufficientlysecure.keychain.ui.keyview.view.KeyHealthView; import org.sufficientlysecure.keychain.ui.keyview.view.KeyStatusList.KeyDisplayStatus; import org.sufficientlysecure.keychain.ui.keyview.view.KeyserverStatusView; -import org.sufficientlysecure.keychain.ui.keyview.view.SystemContactCardView; import timber.log.Timber; public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener { private IdentitiesCardView identitiesCardView; - private SystemContactCardView systemContactCard; private KeyHealthView keyStatusHealth; private KeyserverStatusView keyserverStatusView; private View keyStatusCardView; @@ -87,7 +80,6 @@ public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener View view = inflater.inflate(R.layout.view_key_fragment, viewGroup, false); identitiesCardView = view.findViewById(R.id.card_identities); - systemContactCard = view.findViewById(R.id.linked_system_contact_card); keyStatusCardView = view.findViewById(R.id.subkey_status_card); keyStatusHealth = view.findViewById(R.id.key_status_health); keyserverStatusView = view.findViewById(R.id.key_status_keyserver); @@ -118,17 +110,16 @@ public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener Context context = requireContext(); - UnifiedKeyInfoViewModel viewKeyViewModel = ViewModelProviders.of(requireActivity()).get(UnifiedKeyInfoViewModel.class); + UnifiedKeyInfoViewModel viewKeyViewModel = new ViewModelProvider(requireActivity()).get(UnifiedKeyInfoViewModel.class); LiveData unifiedKeyInfoLiveData = viewKeyViewModel.getUnifiedKeyInfoLiveData(requireContext()); - unifiedKeyInfoLiveData.observe(this, this::onLoadUnifiedKeyInfo); + unifiedKeyInfoLiveData.observe(getViewLifecycleOwner(), this::onLoadUnifiedKeyInfo); - KeyFragmentViewModel model = ViewModelProviders.of(this).get(KeyFragmentViewModel.class); + KeyFragmentViewModel model = new ViewModelProvider(this).get(KeyFragmentViewModel.class); - model.getIdentityInfo(context, unifiedKeyInfoLiveData).observe(this, this::onLoadIdentityInfo); - model.getKeyserverStatus(context, unifiedKeyInfoLiveData).observe(this, this::onLoadKeyMetadata); - model.getSystemContactInfo(context, unifiedKeyInfoLiveData).observe(this, this::onLoadSystemContact); - model.getSubkeyStatus(context, unifiedKeyInfoLiveData).observe(this, this::onLoadSubkeyStatus); + model.getIdentityInfo(context, unifiedKeyInfoLiveData).observe(getViewLifecycleOwner(), this::onLoadIdentityInfo); + model.getKeyserverStatus(context, unifiedKeyInfoLiveData).observe(getViewLifecycleOwner(), this::onLoadKeyMetadata); + model.getSubkeyStatus(context, unifiedKeyInfoLiveData).observe(getViewLifecycleOwner(), this::onLoadSubkeyStatus); } private void onLoadSubkeyStatus(KeySubkeyStatus subkeyStatus) { @@ -274,16 +265,6 @@ public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener identitiesAdapter.setData(identityInfos); } - private void onLoadSystemContact(SystemContactInfo systemContactInfo) { - if (systemContactInfo == null) { - systemContactCard.hideLinkedSystemContact(); - return; - } - - systemContactCard.showLinkedSystemContact(systemContactInfo.contactName, systemContactInfo.contactPicture); - systemContactCard.setSystemContactClickListener((v) -> launchAndroidContactActivity(systemContactInfo.contactId)); - } - private void onLoadKeyMetadata(KeyMetadata keyMetadata) { if (keyMetadata == null) { keyserverStatusView.setDisplayStatusUnknown(); @@ -299,14 +280,6 @@ public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener } } - public void switchToFragment(final Fragment frag, final String backStackName) { - new Handler().post(() -> requireFragmentManager().beginTransaction() - .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) - .replace(R.id.view_key_fragment, frag) - .addToBackStack(backStackName) - .commit()); - } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // if a result has been returned, display a notify @@ -320,7 +293,7 @@ public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener public void showDialogFragment(final DialogFragment dialogFragment, final String tag) { DialogFragmentWorkaround.INTERFACE.runnableRunDelayed( - () -> dialogFragment.show(requireFragmentManager(), tag)); + () -> dialogFragment.show(getParentFragmentManager(), tag)); } public void showContextMenu(int position, View anchor) { @@ -349,11 +322,4 @@ public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener return false; } - - private void launchAndroidContactActivity(long contactId) { - Intent intent = new Intent(Intent.ACTION_VIEW); - Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactId)); - intent.setData(uri); - startActivity(intent); - } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java deleted file mode 100644 index 5b0f59055..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.ui.keyview.loader; - - -import java.util.List; - -import android.Manifest; -import android.content.ContentResolver; -import android.content.Context; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.net.Uri; -import android.provider.ContactsContract; -import androidx.core.content.ContextCompat; - -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.util.ContactHelper; -import timber.log.Timber; - - -public class SystemContactDao { - private static final String[] PROJECTION = { - ContactsContract.RawContacts.CONTACT_ID - }; - private static final int INDEX_CONTACT_ID = 0; - private static final String CONTACT_NOT_DELETED = "0"; - - - private final Context context; - private final ContentResolver contentResolver; - private final ContactHelper contactHelper; - - - public static SystemContactDao getInstance(Context context) { - ContactHelper contactHelper = new ContactHelper(context); - ContentResolver contentResolver = context.getContentResolver(); - return new SystemContactDao(context, contactHelper, contentResolver); - } - - private SystemContactDao(Context context, ContactHelper contactHelper, ContentResolver contentResolver) { - this.context = context; - this.contactHelper = contactHelper; - this.contentResolver = contentResolver; - } - - public SystemContactInfo getSystemContactInfo(long masterKeyId, boolean isSecret) { - if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) - == PackageManager.PERMISSION_DENIED) { - Timber.w(Constants.TAG, "loading linked system contact not possible READ_CONTACTS permission denied!"); - return null; - } - - Uri baseUri = isSecret ? ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI : - ContactsContract.RawContacts.CONTENT_URI; - Cursor cursor = contentResolver.query(baseUri, PROJECTION, - ContactsContract.RawContacts.ACCOUNT_TYPE + " = ? AND " + - ContactsContract.RawContacts.SOURCE_ID + " = ? AND " + - ContactsContract.RawContacts.DELETED + " = ?", - new String[] { - Constants.ACCOUNT_TYPE, - Long.toString(masterKeyId), - CONTACT_NOT_DELETED - }, null); - - if (cursor == null) { - Timber.e("Error loading key items!"); - return null; - } - - try { - if (!cursor.moveToFirst()) { - return null; - } - - long contactId = cursor.getLong(INDEX_CONTACT_ID); - if (contactId == -1) { - return null; - } - - String contactName = null; - if (isSecret) { //all secret keys are linked to "me" profile in contacts - List mainProfileNames = contactHelper.getMainProfileContactName(); - if (mainProfileNames != null && mainProfileNames.size() > 0) { - contactName = mainProfileNames.get(0); - } - } else { - contactName = contactHelper.getContactName(contactId); - } - - if (contactName == null) { - return null; - } - - Bitmap contactPicture; - if (isSecret) { - contactPicture = contactHelper.loadMainProfilePhoto(false); - } else { - contactPicture = contactHelper.loadPhotoByContactId(contactId, false); - } - - return new SystemContactInfo(masterKeyId, contactId, contactName, contactPicture); - } finally { - cursor.close(); - } - } - - public static class SystemContactInfo { - final long masterKeyId; - public final long contactId; - public final String contactName; - public final Bitmap contactPicture; - - SystemContactInfo(long masterKeyId, long contactId, String contactName, Bitmap contactPicture) { - this.masterKeyId = masterKeyId; - this.contactId = contactId; - this.contactName = contactName; - this.contactPicture = contactPicture; - } - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java deleted file mode 100644 index 1d487a8a7..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.ui.keyview.view; - - -import android.content.Context; -import android.graphics.Bitmap; -import androidx.cardview.widget.CardView; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import org.sufficientlysecure.keychain.R; - - -public class SystemContactCardView extends CardView { - private LinearLayout vSystemContactLayout; - private ImageView vSystemContactPicture; - private TextView vSystemContactName; - - public SystemContactCardView(Context context, AttributeSet attrs) { - super(context, attrs); - - View view = LayoutInflater.from(context).inflate(R.layout.system_contact_card, this, true); - - vSystemContactLayout = view.findViewById(R.id.system_contact_layout); - vSystemContactName = view.findViewById(R.id.system_contact_name); - vSystemContactPicture = view.findViewById(R.id.system_contact_picture); - } - - public void setSystemContactClickListener(OnClickListener onClickListener) { - vSystemContactLayout.setOnClickListener(onClickListener); - } - - public void hideLinkedSystemContact() { - setVisibility(View.GONE); - } - - public void showLinkedSystemContact(String contactName, Bitmap picture) { - vSystemContactName.setText(contactName); - if (picture != null) { - vSystemContactPicture.setImageBitmap(picture); - } else { - vSystemContactPicture.setImageResource(R.drawable.ic_person_grey_48dp); - } - - setVisibility(View.VISIBLE); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java deleted file mode 100644 index ad15ef62e..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.ui.widget; - -import android.content.Context; -import androidx.appcompat.widget.AppCompatAutoCompleteTextView; -import android.text.Editable; -import android.text.InputType; -import android.text.TextWatcher; -import android.util.AttributeSet; -import android.view.inputmethod.EditorInfo; -import android.widget.ArrayAdapter; - -import org.sufficientlysecure.keychain.util.ContactHelper; - -public class EmailEditText extends AppCompatAutoCompleteTextView { - - public EmailEditText(Context context) { - super(context); - init(); - } - - public EmailEditText(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public EmailEditText(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - } - - private void init() { - setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); - reenableKeyboardSuggestions(); - - addTextChangedListener(textWatcher); - initAdapter(); - } - - TextWatcher textWatcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable editable) { - - } - }; - - private void initAdapter() { - setThreshold(1); // Start working from first character - setAdapter(new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, - new ContactHelper(getContext()).getPossibleUserEmails())); - } - - /** - * Hack to re-enable keyboard auto correction in AutoCompleteTextView. - * From http://stackoverflow.com/a/22512858 - */ - private void reenableKeyboardSuggestions() { - int inputType = getInputType(); - inputType &= ~EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE; - setRawInputType(inputType); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java deleted file mode 100644 index b9b266f36..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.ui.widget; - -import android.content.Context; -import androidx.appcompat.widget.AppCompatAutoCompleteTextView; -import android.util.AttributeSet; -import android.view.inputmethod.EditorInfo; -import android.widget.ArrayAdapter; - -import org.sufficientlysecure.keychain.util.ContactHelper; - -public class NameEditText extends AppCompatAutoCompleteTextView { - public NameEditText(Context context) { - super(context); - init(); - } - - public NameEditText(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public NameEditText(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - } - - private void init() { - reenableKeyboardSuggestions(); - initAdapter(); - } - - private void initAdapter() { - setThreshold(1); // Start working from first character - setAdapter(new ArrayAdapter<>( - getContext(), android.R.layout.simple_spinner_dropdown_item, - new ContactHelper(getContext()).getPossibleUserNames())); - } - - /** - * Hack to re-enable keyboard suggestions in AutoCompleteTextView. - * From http://stackoverflow.com/a/22512858 - */ - private void reenableKeyboardSuggestions() { - int inputType = getInputType(); - inputType &= ~EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE; - setRawInputType(inputType); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java deleted file mode 100644 index ceca99564..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ /dev/null @@ -1,850 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.util; - - -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.regex.Matcher; - -import android.Manifest; -import android.accounts.Account; -import android.accounts.AccountManager; -import android.content.ContentProviderOperation; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.Context; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.os.Build; -import android.provider.ContactsContract; -import android.provider.ContactsContract.CommonDataKinds.Email; -import android.provider.ContactsContract.CommonDataKinds.Im; -import android.provider.ContactsContract.Data; -import androidx.core.content.ContextCompat; -import android.util.Patterns; - -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; -import org.sufficientlysecure.keychain.model.UserPacket.UserId; -import org.sufficientlysecure.keychain.daos.KeyRepository; -import timber.log.Timber; - -public class ContactHelper { - private final KeyRepository keyRepository; - - private Context mContext; - private ContentResolver mContentResolver; - - public ContactHelper(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); - keyRepository = KeyRepository.create(context); - } - - public List getPossibleUserEmails() { - Set accountMails = getAccountEmails(); - accountMails.addAll(getMainProfileContactEmails()); - - // remove items that are not an email - Iterator it = accountMails.iterator(); - while (it.hasNext()) { - String email = it.next(); - Matcher emailMatcher = Patterns.EMAIL_ADDRESS.matcher(email); - if (!emailMatcher.matches()) { - it.remove(); - } - } - - // now return the Set (without duplicates) as a List - return new ArrayList<>(accountMails); - } - - public List getPossibleUserNames() { - Set accountMails = getAccountEmails(); - Set names = getContactNamesFromEmails(accountMails); - names.addAll(getMainProfileContactName()); - - // remove items that are an email - Iterator it = names.iterator(); - while (it.hasNext()) { - String email = it.next(); - Matcher emailMatcher = Patterns.EMAIL_ADDRESS.matcher(email); - if (emailMatcher.matches()) { - it.remove(); - } - } - - return new ArrayList<>(names); - } - - /** - * Get emails from AccountManager - */ - private Set getAccountEmails() { - final Account[] accounts = AccountManager.get(mContext).getAccounts(); - final Set emailSet = new HashSet<>(); - for (Account account : accounts) { - emailSet.add(account.name); - } - return emailSet; - } - - /** - * Search for contact names based on a list of emails (to find out the names of the - * device owner based on the email addresses from AccountsManager) - */ - private Set getContactNamesFromEmails(Set emails) { - if (!isContactsPermissionGranted()) { - return new HashSet<>(); - } - - Set names = new HashSet<>(); - for (String email : emails) { - Cursor profileCursor = mContentResolver.query( - ContactsContract.CommonDataKinds.Email.CONTENT_URI, - new String[]{ - ContactsContract.CommonDataKinds.Email.ADDRESS, - ContactsContract.Contacts.DISPLAY_NAME - }, - ContactsContract.CommonDataKinds.Email.ADDRESS + "=?", - new String[]{email}, null - ); - if (profileCursor == null) { - return null; - } - - Set currNames = new HashSet<>(); - while (profileCursor.moveToNext()) { - String name = profileCursor.getString(1); - if (name != null) { - currNames.add(name); - } - } - profileCursor.close(); - names.addAll(currNames); - } - return names; - } - - /** - * Retrieves the emails of the primary profile contact - * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html - */ - private Set getMainProfileContactEmails() { - if (!isContactsPermissionGranted()) { - return new HashSet<>(); - } - - Cursor profileCursor = mContentResolver.query( - Uri.withAppendedPath( - ContactsContract.Profile.CONTENT_URI, - ContactsContract.Contacts.Data.CONTENT_DIRECTORY), - new String[]{ - ContactsContract.CommonDataKinds.Email.ADDRESS, - ContactsContract.CommonDataKinds.Email.IS_PRIMARY - }, - // Selects only email addresses - ContactsContract.Contacts.Data.MIMETYPE + "=?", - new String[]{ - ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, - }, - // Show primary rows first. Note that there won't be a primary email address if the - // user hasn't specified one. - ContactsContract.Contacts.Data.IS_PRIMARY + " DESC" - ); - if (profileCursor == null) { - return new HashSet<>(); - } - - Set emails = new HashSet<>(); - while (profileCursor.moveToNext()) { - String email = profileCursor.getString(0); - if (email != null) { - emails.add(email); - } - } - profileCursor.close(); - return emails; - } - - /** - * Retrieves the name of the primary profile contact - * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html - */ - public List getMainProfileContactName() { - if (!isContactsPermissionGranted()) { - return new ArrayList<>(); - } - - Cursor profileCursor = mContentResolver.query( - ContactsContract.Profile.CONTENT_URI, - new String[]{ - ContactsContract.Profile.DISPLAY_NAME - }, - null, null, null); - if (profileCursor == null) { - return new ArrayList<>(); - } - - Set names = new HashSet<>(); - // should only contain one entry! - while (profileCursor.moveToNext()) { - String name = profileCursor.getString(0); - if (name != null) { - names.add(name); - } - } - profileCursor.close(); - return new ArrayList<>(names); - } - - /** - * returns the CONTACT_ID of the main ("me") contact - * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html - */ - private long getMainProfileContactId() { - Cursor profileCursor = mContentResolver.query(ContactsContract.Profile.CONTENT_URI, - new String[]{ContactsContract.Profile._ID}, null, null, null); - - if (profileCursor != null && profileCursor.getCount() != 0 && profileCursor.moveToNext()) { - long contactId = profileCursor.getLong(0); - profileCursor.close(); - return contactId; - } else { - if (profileCursor != null) { - profileCursor.close(); - } - return -1; - } - } - - /** - * loads the profile picture of the main ("me") contact - * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html - * - * @param highRes true for large image if present, false for thumbnail - * @return bitmap of loaded photo - */ - public Bitmap loadMainProfilePhoto(boolean highRes) { - if (!isContactsPermissionGranted()) { - return null; - } - - try { - long mainProfileContactId = getMainProfileContactId(); - - Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, - Long.toString(mainProfileContactId)); - InputStream photoInputStream = ContactsContract.Contacts.openContactPhotoInputStream( - mContentResolver, - contactUri, - highRes - ); - if (photoInputStream == null) { - return null; - } - return BitmapFactory.decodeStream(photoInputStream); - } catch (Throwable ignored) { - return null; - } - } - - public List getContactMails() { - if (!isContactsPermissionGranted()) { - return new ArrayList<>(); - } - - Cursor mailCursor = mContentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, - new String[]{ContactsContract.CommonDataKinds.Email.DATA}, - null, null, null); - if (mailCursor == null) { - return new ArrayList<>(); - } - - Set mails = new HashSet<>(); - while (mailCursor.moveToNext()) { - String email = mailCursor.getString(0); - if (email != null) { - mails.add(email); - } - } - mailCursor.close(); - return new ArrayList<>(mails); - } - - public List getContactNames() { - if (!isContactsPermissionGranted()) { - return new ArrayList<>(); - } - - Cursor cursor = mContentResolver.query(ContactsContract.Contacts.CONTENT_URI, - new String[]{ContactsContract.Contacts.DISPLAY_NAME}, - null, null, null); - if (cursor == null) { - return new ArrayList<>(); - } - - Set names = new HashSet<>(); - while (cursor.moveToNext()) { - String name = cursor.getString(0); - if (name != null) { - names.add(name); - } - } - cursor.close(); - return new ArrayList<>(names); - } - - public Long masterKeyIdFromContactsDataUri(Uri contactUri) { - if (!isContactsPermissionGranted()) { - return null; - } - - Cursor contactMasterKey = mContentResolver.query(contactUri, - new String[]{ContactsContract.Data.DATA2}, null, null, null); - if (contactMasterKey != null) { - try { - if (contactMasterKey.moveToNext()) { - return contactMasterKey.getLong(0); - } - } finally { - contactMasterKey.close(); - } - } - return null; - } - - /** - * returns the CONTACT_ID of the raw contact to which a masterKeyId is associated, if the - * raw contact has not been marked for deletion. - * - * @return CONTACT_ID (id of aggregated contact) linked to masterKeyId - */ - private long findContactId(long masterKeyId) { - long contactId = -1; - Cursor raw = mContentResolver.query(ContactsContract.RawContacts.CONTENT_URI, - new String[]{ - ContactsContract.RawContacts.CONTACT_ID - }, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + - ContactsContract.RawContacts.SOURCE_ID + "=? AND " + - ContactsContract.RawContacts.DELETED + "=?", - new String[]{//"0" for "not deleted" - Constants.ACCOUNT_TYPE, - Long.toString(masterKeyId), - "0" - }, null); - if (raw != null) { - if (raw.moveToNext()) { - contactId = raw.getLong(0); - } - raw.close(); - } - return contactId; - } - - /** - * Returns the display name of the system contact associated with contactId, null if the - * contact does not exist - * - * @return primary display name of system contact associated with contactId, null if it does - * not exist - */ - public String getContactName(long contactId) { - String contactName = null; - Cursor raw = mContentResolver.query(ContactsContract.Contacts.CONTENT_URI, - new String[]{ - ContactsContract.Contacts.DISPLAY_NAME_PRIMARY - }, - ContactsContract.Contacts._ID + "=?", - new String[]{//"0" for "not deleted" - Long.toString(contactId) - }, null); - if (raw != null) { - if (raw.moveToNext()) { - contactName = raw.getString(0); - } - raw.close(); - } - return contactName; - } - - public Bitmap loadPhotoByMasterKeyId(long masterKeyId, boolean highRes) { - if (!isContactsPermissionGranted()) { - return null; - } - - if (masterKeyId == -1) { - return null; - } - try { - long contactId = findContactId(masterKeyId); - return loadPhotoByContactId(contactId, highRes); - - } catch (Throwable ignored) { - return null; - } - } - - public Bitmap loadPhotoByContactId(long contactId, boolean highRes) { - if (!isContactsPermissionGranted()) { - return null; - } - - if (contactId == -1) { - return null; - } - Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); - // older android versions (tested on API level 15) fail on lookupuris being passed to - // openContactPhotoInputStream - // http://stackoverflow.com/a/21214524/3000919 - // Uri lookupUri = ContactsContract.Contacts.getLookupUri(contentResolver, contactUri); - // Also, we don't need a permanent shortcut to the contact since we load it afresh each time - - InputStream photoInputStream = ContactsContract.Contacts.openContactPhotoInputStream( - mContentResolver, - contactUri, - highRes); - - if (photoInputStream == null) { - return null; - } - return BitmapFactory.decodeStream(photoInputStream); - } - - /** - * Write/Update the current OpenKeychain keys to the contact db - */ - public void writeKeysToContacts() { - if (Constants.DEBUG_SYNC_REMOVE_CONTACTS) { - deleteAllContacts(); - } - - writeKeysToMainProfileContact(); - - writeKeysToNormalContacts(); - } - - private boolean isContactsPermissionGranted() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return true; - } - - if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_CONTACTS) - == PackageManager.PERMISSION_GRANTED) { - return true; - } - - Timber.w("READ_CONTACTS permission denied!"); - return false; - } - - private void writeKeysToNormalContacts() { - // delete raw contacts flagged for deletion by user so they can be reinserted - deleteFlaggedNormalRawContacts(); - - Set deletedKeys = getRawContactMasterKeyIds(); - - // Load all public Keys from OK - for (UnifiedKeyInfo keyInfo : keyRepository.getAllUnifiedKeyInfo()) { - if (keyInfo.has_any_secret()) { - continue; - } - - long masterKeyId = keyInfo.master_key_id(); - String name = keyInfo.name(); - - deletedKeys.remove(masterKeyId); - - ArrayList ops = new ArrayList<>(); - - // Do not store expired or revoked or unverified keys in contact db - and - // remove them if they already exist. Secret keys do not reach this point - if (keyInfo.is_expired() || keyInfo.is_revoked() || !keyInfo.is_verified()) { - Timber.d("Expired or revoked or unverified: Deleting masterKeyId " - + masterKeyId); - if (masterKeyId != -1) { - deleteRawContactByMasterKeyId(masterKeyId); - } - } else { - if (name != null) { - - // get raw contact to this master key id - long rawContactId = findRawContactId(masterKeyId); - Timber.d("rawContactId: " + rawContactId); - - // Create a new rawcontact with corresponding key if it does not exist yet - if (rawContactId == -1) { - Timber.d("Insert new raw contact with masterKeyId " + masterKeyId); - - insertContact(ops, masterKeyId); - writeContactKey(ops, rawContactId, masterKeyId, name); - } - - // We always update the display name (which is derived from primary user id) - // and email addresses from user id - writeContactDisplayName(ops, rawContactId, name); - writeContactEmail(ops, rawContactId, masterKeyId); - try { - mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops); - } catch (Exception e) { - Timber.w(e); - } - } - } - } - - // Delete master key ids that are no longer present in OK - for (Long masterKeyId : deletedKeys) { - Timber.d("Delete raw contact with masterKeyId " + masterKeyId); - deleteRawContactByMasterKeyId(masterKeyId); - } - } - - /** - * Links all keys with secrets to the main ("me") contact - * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html - */ - private void writeKeysToMainProfileContact() { - // deletes contacts hidden by the user so they can be reinserted if necessary - deleteFlaggedMainProfileRawContacts(); - - Set keysToDelete = getMainProfileMasterKeyIds(); - - // get all keys which have associated secret keys - // TODO: figure out why using selectionArgs does not work in this case - for (UnifiedKeyInfo keyInfo : keyRepository.getAllUnifiedKeyInfoWithSecret()) { - long masterKeyId = keyInfo.master_key_id(); - - if (!keyInfo.is_expired() && !keyInfo.is_revoked() && keyInfo.name() != null) { - // if expired or revoked will not be removed from keysToDelete or inserted - // into main profile ("me" contact) - boolean existsInMainProfile = keysToDelete.remove(masterKeyId); - if (!existsInMainProfile) { - long rawContactId = -1;//new raw contact - - Timber.d("masterKeyId with secret " + masterKeyId); - - ArrayList ops = new ArrayList<>(); - insertMainProfileRawContact(ops, masterKeyId); - writeContactKey(ops, rawContactId, masterKeyId, keyInfo.name()); - - try { - mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops); - } catch (Exception e) { - Timber.w(e); - } - } - } - } - - for (long masterKeyId : keysToDelete) { - deleteMainProfileRawContactByMasterKeyId(masterKeyId); - Timber.d("Delete main profile raw contact with masterKeyId " + masterKeyId); - } - } - - /** - * Inserts a raw contact into the table defined by ContactsContract.Profile - * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html - */ - private void insertMainProfileRawContact(ArrayList ops, - long masterKeyId) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI) - .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, Constants.ACCOUNT_NAME) - .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, Constants.ACCOUNT_TYPE) - .withValue(ContactsContract.RawContacts.SOURCE_ID, Long.toString(masterKeyId)) - .build()); - } - - /** - * deletes a raw contact from the main profile table ("me" contact) - * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html - * - * @return number of rows deleted - */ - private int deleteMainProfileRawContactByMasterKeyId(long masterKeyId) { - // CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise - // would be just flagged for deletion - Uri deleteUri = ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI.buildUpon(). - appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - - return mContentResolver.delete(deleteUri, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + - ContactsContract.RawContacts.SOURCE_ID + "=?", - new String[]{ - Constants.ACCOUNT_TYPE, Long.toString(masterKeyId) - }); - } - - /** - * deletes all raw contact entries in the "me" contact flagged for deletion ('hidden'), - * presumably by the user - * - * @return number of raw contacts deleted - */ - private int deleteFlaggedMainProfileRawContacts() { - // CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise - // would be just flagged for deletion - Uri deleteUri = ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI.buildUpon(). - appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - - return mContentResolver.delete(deleteUri, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + - ContactsContract.RawContacts.DELETED + "=?", - new String[]{ - Constants.ACCOUNT_TYPE, - "1" - }); - } - - /** - * Delete all raw contacts associated to OpenKeychain, including those from "me" contact - * defined by ContactsContract.Profile - * - * @return number of rows deleted - */ - public int deleteAllContacts() { - // CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise - // would be just flagged for deletion - Uri deleteUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon(). - appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - - Timber.d("Deleting all raw contacts associated to OK..."); - int delete = mContentResolver.delete(deleteUri, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", - new String[]{ - Constants.ACCOUNT_TYPE - }); - - Uri mainProfileDeleteUri = ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI.buildUpon() - .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - - delete += mContentResolver.delete(mainProfileDeleteUri, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", - new String[]{ - Constants.ACCOUNT_TYPE - }); - - return delete; - } - - /** - * Deletes raw contacts from ContactsContract.RawContacts based on masterKeyId. Does not - * delete contacts from the "me" contact defined in ContactsContract.Profile - * - * @return number of rows deleted - */ - private int deleteRawContactByMasterKeyId(long masterKeyId) { - // CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise - // would be just flagged for deletion - Uri deleteUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon(). - appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - - return mContentResolver.delete(deleteUri, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + - ContactsContract.RawContacts.SOURCE_ID + "=?", - new String[]{ - Constants.ACCOUNT_TYPE, Long.toString(masterKeyId) - }); - } - - private int deleteFlaggedNormalRawContacts() { - // CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise - // would be just flagged for deletion - Uri deleteUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon(). - appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - - return mContentResolver.delete(deleteUri, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + - ContactsContract.RawContacts.DELETED + "=?", - new String[]{ - Constants.ACCOUNT_TYPE, - "1" - }); - } - - /** - * @return a set of all key master key ids currently present in the contact db - */ - private Set getRawContactMasterKeyIds() { - HashSet result = new HashSet<>(); - Cursor masterKeyIds = mContentResolver.query(ContactsContract.RawContacts.CONTENT_URI, - new String[]{ - ContactsContract.RawContacts.SOURCE_ID - }, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", - new String[]{ - Constants.ACCOUNT_TYPE - }, null); - if (masterKeyIds != null) { - while (masterKeyIds.moveToNext()) { - result.add(masterKeyIds.getLong(0)); - } - masterKeyIds.close(); - } - return result; - } - - /** - * @return a set of all key master key ids currently present in the contact db - */ - private Set getMainProfileMasterKeyIds() { - HashSet result = new HashSet<>(); - Cursor masterKeyIds = mContentResolver.query(ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI, - new String[]{ - ContactsContract.RawContacts.SOURCE_ID - }, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", - new String[]{ - Constants.ACCOUNT_TYPE - }, null); - if (masterKeyIds != null) { - while (masterKeyIds.moveToNext()) { - result.add(masterKeyIds.getLong(0)); - } - masterKeyIds.close(); - } - return result; - } - - /** - * This will search the contact db for a raw contact with a given master key id - * - * @return raw contact id or -1 if not found - */ - private long findRawContactId(long masterKeyId) { - long rawContactId = -1; - Cursor raw = mContentResolver.query(ContactsContract.RawContacts.CONTENT_URI, - new String[]{ - ContactsContract.RawContacts._ID - }, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?", - new String[]{ - Constants.ACCOUNT_TYPE, Long.toString(masterKeyId) - }, null); - if (raw != null) { - if (raw.moveToNext()) { - rawContactId = raw.getLong(0); - } - raw.close(); - } - return rawContactId; - } - - /** - * Creates a empty raw contact with a given masterKeyId - */ - private void insertContact(ArrayList ops, long masterKeyId) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) - .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, Constants.ACCOUNT_NAME) - .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, Constants.ACCOUNT_TYPE) - .withValue(ContactsContract.RawContacts.SOURCE_ID, Long.toString(masterKeyId)) - .build()); - } - - /** - * Adds a key id to the given raw contact. - *

- * This creates the link to OK in contact details - */ - private void writeContactKey(ArrayList ops, long rawContactId, - long masterKeyId, String keyName) { - ops.add(referenceRawContact(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI), rawContactId) - .withValue(ContactsContract.Data.MIMETYPE, Constants.CUSTOM_CONTACT_DATA_MIME_TYPE) - .withValue(ContactsContract.Data.DATA1, mContext.getString(R.string.contact_show_key, keyName)) - .withValue(ContactsContract.Data.DATA2, masterKeyId) - .build()); - } - - /** - * Write all known email addresses of a key (derived from user ids) to a given raw contact - */ - private void writeContactEmail(ArrayList ops, - long rawContactId, long masterKeyId) { - ContentProviderOperation deleteEmailOp = selectByRawContactAndItemType( - ContentProviderOperation.newDelete(Data.CONTENT_URI), rawContactId, Email.CONTENT_ITEM_TYPE).build(); - ops.add(deleteEmailOp); - - ContentProviderOperation deleteJabberOp = selectByRawContactAndItemType( - ContentProviderOperation.newDelete(Data.CONTENT_URI), rawContactId, Im.CONTENT_ITEM_TYPE).build(); - ops.add(deleteJabberOp); - - for (UserId userId : keyRepository.getUserIds(masterKeyId)) { - if (userId.email() != null) { - ContentProviderOperation.Builder builder = referenceRawContact( - ContentProviderOperation.newInsert(Data.CONTENT_URI), rawContactId); - - if (userId.email().startsWith("xmpp:")) { - builder = builder.withValue(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE) - .withValue(Im.PROTOCOL, Im.PROTOCOL_JABBER) - .withValue(Im.DATA, userId.email().substring(5)); - } else { - builder = builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) - .withValue(Email.DATA, userId.email()); - } - ops.add(builder.build()); - } - } - } - - private void writeContactDisplayName(ArrayList ops, long rawContactId, - String displayName) { - if (displayName != null) { - ops.add(insertOrUpdateForRawContact(ContactsContract.Data.CONTENT_URI, rawContactId, - ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) - .build()); - } - } - - private ContentProviderOperation.Builder referenceRawContact(ContentProviderOperation.Builder builder, - long rawContactId) { - return rawContactId == -1 ? - builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) : - builder.withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - } - - private ContentProviderOperation.Builder insertOrUpdateForRawContact(Uri uri, long rawContactId, - String itemType) { - if (rawContactId == -1) { - return referenceRawContact(ContentProviderOperation.newInsert(uri), rawContactId).withValue( - ContactsContract.Data.MIMETYPE, itemType); - } else { - return selectByRawContactAndItemType(ContentProviderOperation.newUpdate(uri), rawContactId, itemType); - } - } - - private ContentProviderOperation.Builder selectByRawContactAndItemType( - ContentProviderOperation.Builder builder, long rawContactId, String itemType) { - return builder.withSelection( - ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?", - new String[]{ - Long.toString(rawContactId), itemType - }); - } -} diff --git a/OpenKeychain/src/main/res/layout/add_email_dialog.xml b/OpenKeychain/src/main/res/layout/add_email_dialog.xml index 68d895145..5937e9dba 100644 --- a/OpenKeychain/src/main/res/layout/add_email_dialog.xml +++ b/OpenKeychain/src/main/res/layout/add_email_dialog.xml @@ -14,13 +14,14 @@ android:text="@string/create_key_add_email_text" android:textAppearance="?android:textAppearanceMedium" /> - diff --git a/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml b/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml index 64d2934c5..5a130fd0d 100644 --- a/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml +++ b/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml @@ -8,15 +8,16 @@ android:paddingLeft="24dp" android:paddingRight="24dp"> - - - diff --git a/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml index 4e37dd713..b5b39725d 100644 --- a/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml @@ -24,7 +24,7 @@ android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/create_key_name_text" /> - - - - - - - - - - - -