diff --git a/k9mail/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt b/k9mail/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt
index 935c48d20b..114f64dceb 100644
--- a/k9mail/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt
+++ b/k9mail/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt
@@ -25,7 +25,7 @@ import com.fsck.k9.ui.observe
import org.koin.android.architecture.ext.sharedViewModel
import org.koin.android.ext.android.inject
import org.openintents.openpgp.OpenPgpApiManager
-import org.openintents.openpgp.util.OpenPgpKeyPreferenceCompat
+import org.openintents.openpgp.util.OpenPgpKeyPreference
import org.openintents.openpgp.util.OpenPgpProviderUtil
class AccountSettingsFragment : PreferenceFragmentCompat() {
@@ -201,7 +201,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() {
}
private fun configurePgpKey(account: Account, pgpProvider: String?) {
- (findPreference(PREFERENCE_OPENPGP_KEY) as OpenPgpKeyPreferenceCompat).apply {
+ (findPreference(PREFERENCE_OPENPGP_KEY) as OpenPgpKeyPreference).apply {
setOpenPgpProvider(openPgpApiManager, pgpProvider)
setIntentSenderFragment(this@AccountSettingsFragment)
setDefaultUserId(OpenPgpApiHelper.buildUserId(account.getIdentity(0)))
@@ -241,7 +241,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() {
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- val openPgpKeyPreference = findPreference(PREFERENCE_OPENPGP_KEY) as? OpenPgpKeyPreferenceCompat
+ val openPgpKeyPreference = findPreference(PREFERENCE_OPENPGP_KEY) as? OpenPgpKeyPreference
if (openPgpKeyPreference?.handleOnActivityResult(requestCode, resultCode, data) == true) {
return
}
diff --git a/k9mail/src/main/res/xml/account_settings.xml b/k9mail/src/main/res/xml/account_settings.xml
index 606c97d626..0349dfee67 100644
--- a/k9mail/src/main/res/xml/account_settings.xml
+++ b/k9mail/src/main/res/xml/account_settings.xml
@@ -416,7 +416,7 @@
android:key="openpgp_provider"
android:title="@string/account_settings_crypto_app" />
-
diff --git a/plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpKeyPreference.java b/plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpKeyPreference.java
index 106f1b0761..c89ab6f6a1 100644
--- a/plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpKeyPreference.java
+++ b/plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpKeyPreference.java
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2018 The K-9 Dog Walkers
* Copyright (C) 2015 Dominik Schürmann
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +24,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.res.TypedArray;
-import android.preference.Preference;
+import android.support.v4.app.Fragment;
+import android.support.v7.preference.Preference;
import android.text.format.DateUtils;
import android.util.AttributeSet;
@@ -44,6 +46,7 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
private boolean showAutocryptHint;
private OpenPgpApiManager openPgpApiManager;
private Intent cachedActivityResultData;
+ private Fragment intentSenderFragment;
private PendingIntent pendingIntentSelectKey;
private boolean pendingIntentRunImmediately;
@@ -66,6 +69,10 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
refreshTitleAndSummary();
}
+ public void setIntentSenderFragment(Fragment fragment) {
+ intentSenderFragment = fragment;
+ }
+
public void setDefaultUserId(String userId) {
defaultUserId = userId;
}
@@ -132,7 +139,7 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
api.executeApiAsync(data, null, null, openPgpCallback);
}
- private IOpenPgpCallback openPgpCallback = new OpenPgpApi.IOpenPgpCallback() {
+ private IOpenPgpCallback openPgpCallback = new IOpenPgpCallback() {
@Override
public void onReturn(Intent result) {
int resultCode = result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
@@ -180,9 +187,9 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
}
try {
- Activity act = (Activity) getContext();
- act.startIntentSenderFromChild(act, pendingIntentSelectKey.getIntentSender(),
- REQUEST_CODE_KEY_PREFERENCE, null, 0, 0, 0);
+ intentSenderFragment
+ .startIntentSenderForResult(pendingIntentSelectKey.getIntentSender(), REQUEST_CODE_KEY_PREFERENCE,
+ null, 0, 0, 0, null);
} catch (IntentSender.SendIntentException e) {
Timber.e(e,"Error launching pending intent");
} finally {
@@ -271,6 +278,7 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
private void setAndPersist(long newValue) {
keyId = newValue;
+ notifyDependencyChange(shouldDisableDependents());
// Save to persistent storage (this method will make sure this
// preference should be persistent, along with other useful checks)
@@ -289,6 +297,7 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
if (restoreValue) {
// Restore state
keyId = getPersistedLong(keyId);
+ notifyDependencyChange(shouldDisableDependents());
} else {
// Set state
long value = (Long) defaultValue;
@@ -296,6 +305,11 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
}
}
+ @Override
+ public boolean shouldDisableDependents() {
+ return keyId == NO_KEY || super.shouldDisableDependents();
+ }
+
public boolean handleOnActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_API_MANAGER:
@@ -317,4 +331,4 @@ public class OpenPgpKeyPreference extends Preference implements OpenPgpApiManage
return false;
}
-}
\ No newline at end of file
+}
diff --git a/plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpKeyPreferenceCompat.java b/plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpKeyPreferenceCompat.java
deleted file mode 100644
index 457991f951..0000000000
--- a/plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/util/OpenPgpKeyPreferenceCompat.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2018 The K-9 Dog Walkers
- * Copyright (C) 2015 Dominik Schürmann
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.openintents.openpgp.util;
-
-
-import android.app.Activity;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.content.res.TypedArray;
-import android.support.v4.app.Fragment;
-import android.support.v7.preference.Preference;
-import android.text.format.DateUtils;
-import android.util.AttributeSet;
-
-import org.openintents.openpgp.OpenPgpApiManager;
-import org.openintents.openpgp.OpenPgpApiManager.OpenPgpApiManagerCallback;
-import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderError;
-import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderState;
-import org.openintents.openpgp.OpenPgpError;
-import org.openintents.openpgp.R;
-import org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback;
-import org.openintents.openpgp.util.OpenPgpUtils.UserId;
-import timber.log.Timber;
-
-
-public class OpenPgpKeyPreferenceCompat extends Preference implements OpenPgpApiManagerCallback {
- private long keyId;
- private String defaultUserId;
- private boolean showAutocryptHint;
- private OpenPgpApiManager openPgpApiManager;
- private Intent cachedActivityResultData;
- private Fragment intentSenderFragment;
-
- private PendingIntent pendingIntentSelectKey;
- private boolean pendingIntentRunImmediately;
-
- private String keyPrimaryUserId;
- private long keyCreationTime;
-
- private static final int REQUEST_CODE_API_MANAGER = 9998;
- private static final int REQUEST_CODE_KEY_PREFERENCE = 9999;
-
- private static final int NO_KEY = 0;
-
- public OpenPgpKeyPreferenceCompat(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public void setOpenPgpProvider(OpenPgpApiManager openPgpApiManager, String openPgpProvider) {
- this.openPgpApiManager = openPgpApiManager;
- this.openPgpApiManager.setOpenPgpProvider(openPgpProvider, this);
- refreshTitleAndSummary();
- }
-
- public void setIntentSenderFragment(Fragment fragment) {
- intentSenderFragment = fragment;
- }
-
- public void setDefaultUserId(String userId) {
- defaultUserId = userId;
- }
-
- public void setShowAutocryptHint(boolean showAutocryptHint) {
- this.showAutocryptHint = showAutocryptHint;
- }
-
- @Override
- protected void onClick() {
- switch (openPgpApiManager.getOpenPgpProviderState()) {
- // The GET_SIGN_KEY action is special, in that it can be used as an implicit registration
- // to the API. Therefore, we can ignore the UI_REQUIRED here. If it comes up regardless,
- // it will also work as a regular pending intent.
- case UI_REQUIRED:
- case OK: {
- apiGetOrStartPendingIntent();
- break;
- }
- default: {
- refreshTitleAndSummary();
- openPgpApiManager.refreshConnection();
- break;
- }
- }
- }
-
- @Override
- public void onOpenPgpProviderStatusChanged() {
- if (openPgpApiManager.getOpenPgpProviderState() == OpenPgpProviderState.OK) {
- apiRetrievePendingIntentAndKeyInfo();
- } else {
- pendingIntentSelectKey = null;
- pendingIntentRunImmediately = false;
- cachedActivityResultData = null;
- refreshTitleAndSummary();
- }
- }
-
- @Override
- public void onOpenPgpProviderError(OpenPgpProviderError error) {
- if (error == OpenPgpProviderError.ConnectionLost) {
- openPgpApiManager.refreshConnection();
- }
- }
-
- private void apiRetrievePendingIntentAndKeyInfo() {
- Intent data;
- if (cachedActivityResultData != null) {
- data = cachedActivityResultData;
- cachedActivityResultData = null;
- } else {
- data = new Intent();
- }
- apiRetrievePendingIntentAndKeyInfo(data);
- }
-
- private void apiRetrievePendingIntentAndKeyInfo(Intent data) {
- data.setAction(OpenPgpApi.ACTION_GET_SIGN_KEY_ID);
- data.putExtra(OpenPgpApi.EXTRA_USER_ID, defaultUserId);
- data.putExtra(OpenPgpApi.EXTRA_PRESELECT_KEY_ID, keyId);
- data.putExtra(OpenPgpApi.EXTRA_SHOW_AUTOCRYPT_HINT, showAutocryptHint);
- OpenPgpApi api = openPgpApiManager.getOpenPgpApi();
- api.executeApiAsync(data, null, null, openPgpCallback);
- }
-
- private IOpenPgpCallback openPgpCallback = new IOpenPgpCallback() {
- @Override
- public void onReturn(Intent result) {
- int resultCode = result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
- switch (resultCode) {
- case OpenPgpApi.RESULT_CODE_SUCCESS:
- case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED: {
- PendingIntent pendingIntentSelectKey = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
-
- if (result.hasExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID)) {
- long keyId = result.getLongExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, NO_KEY);
- long keyCreationTime = result.getLongExtra("key_creation_time", 0);
- String primaryUserId = result.getStringExtra("primary_user_id");
-
- updateWidgetData(keyId, primaryUserId, keyCreationTime, pendingIntentSelectKey);
- } else {
- updateWidgetData(pendingIntentSelectKey);
- }
-
- break;
- }
- case OpenPgpApi.RESULT_CODE_ERROR: {
- OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR);
- Timber.e("RESULT_CODE_ERROR: %s", error.getMessage());
-
- break;
- }
- }
- }
- };
-
- private void apiGetOrStartPendingIntent() {
- if (pendingIntentSelectKey != null) {
- apiStartPendingIntent();
- return;
- }
-
- pendingIntentRunImmediately = true;
- apiRetrievePendingIntentAndKeyInfo();
- }
-
- private void apiStartPendingIntent() {
- if (pendingIntentSelectKey == null) {
- Timber.e("Tried to launch pending intent but didn't have any?");
- return;
- }
-
- try {
- intentSenderFragment
- .startIntentSenderForResult(pendingIntentSelectKey.getIntentSender(), REQUEST_CODE_KEY_PREFERENCE,
- null, 0, 0, 0, null);
- } catch (IntentSender.SendIntentException e) {
- Timber.e(e,"Error launching pending intent");
- } finally {
- pendingIntentSelectKey = null;
- }
- }
-
- private void updateWidgetData(PendingIntent pendingIntentSelectKey) {
- this.keyPrimaryUserId = null;
- this.keyCreationTime = 0;
- this.pendingIntentSelectKey = pendingIntentSelectKey;
-
- maybeRunPendingIntentImmediately();
- refreshTitleAndSummary();
- }
-
- private void updateWidgetData(long keyId, String primaryUserId, long keyCreationTime,
- PendingIntent pendingIntentSelectKey) {
- setAndPersist(keyId);
- this.keyPrimaryUserId = primaryUserId;
- this.keyCreationTime = keyCreationTime;
- this.pendingIntentSelectKey = pendingIntentSelectKey;
-
- callChangeListener(keyId);
- maybeRunPendingIntentImmediately();
- refreshTitleAndSummary();
- }
-
- private void maybeRunPendingIntentImmediately() {
- if (!pendingIntentRunImmediately) {
- return;
- }
-
- pendingIntentRunImmediately = false;
- apiStartPendingIntent();
- }
-
- private void refreshTitleAndSummary() {
- boolean isConfigured = openPgpApiManager != null &&
- openPgpApiManager.getOpenPgpProviderState() != OpenPgpProviderState.UNCONFIGURED;
- setEnabled(isConfigured);
-
- if (this.keyId == NO_KEY) {
- setTitle(R.string.openpgp_key_title);
- setSummary(R.string.openpgp_no_key_selected);
-
- return;
- }
-
- if (this.keyPrimaryUserId != null && this.keyCreationTime != 0) {
- Context context = getContext();
-
- UserId userId = OpenPgpUtils.splitUserId(keyPrimaryUserId);
- if (userId.email != null) {
- setTitle(context.getString(R.string.openpgp_key_using, userId.email));
- } else if (userId.name != null) {
- setTitle(context.getString(R.string.openpgp_key_using, userId.name));
- } else {
- setTitle(R.string.openpgp_key_using_no_name);
- }
-
- String creationTimeStr = DateUtils.formatDateTime(context, keyCreationTime,
- DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME |
- DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_ABBREV_MONTH);
- setSummary(context.getString(R.string.openpgp_key_created, creationTimeStr));
- } else {
- setTitle(R.string.openpgp_key_title);
- setSummary(R.string.openpgp_key_selected);
- }
- }
-
- /**
- * Public API
- */
- public void setValue(long keyId) {
- setAndPersist(keyId);
- refreshTitleAndSummary();
- }
-
- /**
- * Public API
- */
- public long getValue() {
- return keyId;
- }
-
- private void setAndPersist(long newValue) {
- keyId = newValue;
- notifyDependencyChange(shouldDisableDependents());
-
- // Save to persistent storage (this method will make sure this
- // preference should be persistent, along with other useful checks)
- persistLong(keyId);
- }
-
- @Override
- protected Object onGetDefaultValue(TypedArray a, int index) {
- // This preference type's value type is Long, so we read the default
- // value from the attributes as an Integer.
- return (long) a.getInteger(index, NO_KEY);
- }
-
- @Override
- protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
- if (restoreValue) {
- // Restore state
- keyId = getPersistedLong(keyId);
- notifyDependencyChange(shouldDisableDependents());
- } else {
- // Set state
- long value = (Long) defaultValue;
- setAndPersist(value);
- }
- }
-
- @Override
- public boolean shouldDisableDependents() {
- return keyId == NO_KEY || super.shouldDisableDependents();
- }
-
- public boolean handleOnActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case REQUEST_CODE_API_MANAGER:
- openPgpApiManager.onUserInteractionResult();
- return true;
- case REQUEST_CODE_KEY_PREFERENCE:
- if (resultCode == Activity.RESULT_OK) {
- cachedActivityResultData = data;
- // this might happen early in the lifecycle (e.g. before onResume). if the provider isn't connected
- // here, apiRetrievePendingIntentAndKeyInfo() will be called as soon as it is.
- OpenPgpProviderState openPgpProviderState = openPgpApiManager.getOpenPgpProviderState();
- if (openPgpProviderState == OpenPgpProviderState.OK ||
- openPgpProviderState == OpenPgpProviderState.UI_REQUIRED) {
- apiRetrievePendingIntentAndKeyInfo();
- }
- }
- return true;
- }
- return false;
- }
-
-}