display apg in list of choices, show warning dialog when selected

This commit is contained in:
Vincent Breitmoser 2017-01-16 15:55:53 +01:00
parent 152d1cd2c1
commit 164f38c5b0
3 changed files with 73 additions and 33 deletions

View file

@ -10,6 +10,8 @@ import java.util.Map;
import android.app.Dialog;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
@ -706,12 +708,21 @@ public class AccountSettings extends K9PreferenceActivity {
mCryptoSupportSignOnly = (CheckBoxPreference) findPreference(PREFERENCE_CRYPTO_SUPPORT_SIGN_ONLY);
mCryptoApp.setValue(String.valueOf(mAccount.getCryptoApp()));
if (OpenPgpAppPreference.isApgInstalled(getApplicationContext())) {
mCryptoApp.addLegacyProvider("apg-placeholder", "APG", R.drawable.ic_apg_small);
}
mCryptoApp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
String value = newValue.toString();
mCryptoApp.setValue(value);
if ("apg-placeholder".equals(value)) {
mCryptoApp.setValue("");
mCryptoKey.setOpenPgpProvider("");
showApgDeprecationDialog();
} else {
mCryptoApp.setValue(value);
mCryptoKey.setOpenPgpProvider(value);
}
mCryptoKey.setOpenPgpProvider(value);
return false;
}
});
@ -734,16 +745,17 @@ public class AccountSettings extends K9PreferenceActivity {
mCryptoMenu.setEnabled(false);
mCryptoMenu.setSummary(R.string.account_settings_no_openpgp_provider_installed);
}
if (mAccount.isCryptoAppDeprecatedApg()) {
showApgDeprecationDialog();
mAccount.setCryptoApp("");
saveSettings();
}
}
private void showApgDeprecationDialog() {
ApgDeprecationWarningDialog fragment = ApgDeprecationWarningDialog.newInstance();
fragment.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
mCryptoApp.show();
}
});
FragmentTransaction ta = getFragmentManager().beginTransaction();
ta.add(fragment, APG_DEPRECATION_DIALOG_TAG);
ta.commitAllowingStateLoss();

View file

@ -7,6 +7,7 @@ import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
@ -18,6 +19,8 @@ import com.fsck.k9.R;
public class ApgDeprecationWarningDialog extends DialogFragment {
private OnDismissListener onDismissListener;
public static ApgDeprecationWarningDialog newInstance() {
return new ApgDeprecationWarningDialog();
}
@ -54,4 +57,16 @@ public class ApgDeprecationWarningDialog extends DialogFragment {
private void makeTextViewLinksClickable(TextView textView) {
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
public void setOnDismissListener(OnDismissListener onDismissListener) {
this.onDismissListener = onDismissListener;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (onDismissListener != null) {
onDismissListener.onDismiss(dialog);
}
}
}

View file

@ -16,6 +16,10 @@
package org.openintents.openpgp.util;
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
@ -25,9 +29,7 @@ import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.preference.DialogPreference;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
@ -36,9 +38,6 @@ import android.widget.TextView;
import org.openintents.openpgp.R;
import java.util.ArrayList;
import java.util.List;
/**
* Does not extend ListPreference, but is very similar to it!
* http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/preference/ListPreference.java/?v=source
@ -49,11 +48,12 @@ public class OpenPgpAppPreference extends DialogPreference {
private static final Intent MARKET_INTENT = new Intent(Intent.ACTION_VIEW, Uri.parse(
String.format(MARKET_INTENT_URI_BASE, OPENKEYCHAIN_PACKAGE)));
private static final ArrayList<String> PROVIDER_BLACKLIST = new ArrayList<String>();
private static final String PACKAGE_NAME_APG = "org.thialfihar.android.apg";
private static final ArrayList<String> PROVIDER_BLACKLIST = new ArrayList<>();
static {
// Unfortunately, the current released version of APG includes a broken version of the API
PROVIDER_BLACKLIST.add("org.thialfihar.android.apg");
PROVIDER_BLACKLIST.add(PACKAGE_NAME_APG);
}
private ArrayList<OpenPgpProviderEntry> mLegacyList = new ArrayList<>();
@ -81,6 +81,11 @@ public class OpenPgpAppPreference extends DialogPreference {
mLegacyList.add(position, new OpenPgpProviderEntry(packageName, simpleName, icon));
}
public void addLegacyProvider(String packageName, String simpleName, int iconRes) {
Drawable icon = getContext().getResources().getDrawable(iconRes);
mLegacyList.add(new OpenPgpProviderEntry(packageName, simpleName, icon));
}
@Override
protected void onPrepareDialogBuilder(Builder builder) {
@ -262,26 +267,26 @@ public class OpenPgpAppPreference extends DialogPreference {
mList.addAll(mLegacyList);
// search for OpenPGP providers...
ArrayList<OpenPgpProviderEntry> providerList = new ArrayList<>();
Intent intent = new Intent(OpenPgpApi.SERVICE_INTENT_2);
List<ResolveInfo> resInfo = getContext().getPackageManager().queryIntentServices(intent, 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo resolveInfo : resInfo) {
if (resolveInfo.serviceInfo == null)
continue;
boolean hasNonBlacklistedChoices = false;
for (ResolveInfo resolveInfo : resInfo) {
if (resolveInfo.serviceInfo == null) {
continue;
}
String packageName = resolveInfo.serviceInfo.packageName;
String simpleName = String.valueOf(resolveInfo.serviceInfo.loadLabel(getContext()
.getPackageManager()));
Drawable icon = resolveInfo.serviceInfo.loadIcon(getContext().getPackageManager());
String packageName = resolveInfo.serviceInfo.packageName;
String simpleName = String.valueOf(resolveInfo.serviceInfo.loadLabel(getContext()
.getPackageManager()));
Drawable icon = resolveInfo.serviceInfo.loadIcon(getContext().getPackageManager());
if (!PROVIDER_BLACKLIST.contains(packageName)) {
providerList.add(new OpenPgpProviderEntry(packageName, simpleName, icon));
}
if (!PROVIDER_BLACKLIST.contains(packageName)) {
mList.add(new OpenPgpProviderEntry(packageName, simpleName, icon));
hasNonBlacklistedChoices = true;
}
}
if (providerList.isEmpty()) {
if (!hasNonBlacklistedChoices) {
// add install links if provider list is empty
resInfo = getContext().getPackageManager().queryIntentActivities
(MARKET_INTENT, 0);
@ -296,25 +301,26 @@ public class OpenPgpAppPreference extends DialogPreference {
mList.add(new OpenPgpProviderEntry(OPENKEYCHAIN_PACKAGE, simpleName,
icon, marketIntent));
}
} else {
// add provider
mList.addAll(providerList);
}
}
public void show() {
showDialog(null);
}
private static class OpenPgpProviderEntry {
private String packageName;
private String simpleName;
private Drawable icon;
private Intent intent;
public OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon) {
OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon) {
this.packageName = packageName;
this.simpleName = simpleName;
this.icon = icon;
}
public OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon, Intent intent) {
OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon, Intent intent) {
this(packageName, simpleName, icon);
this.intent = intent;
}
@ -324,4 +330,11 @@ public class OpenPgpAppPreference extends DialogPreference {
return simpleName;
}
}
public static boolean isApgInstalled(Context context) {
Intent intent = new Intent("org.openintents.openpgp.IOpenPgpService");
intent.setPackage(PACKAGE_NAME_APG);
List<ResolveInfo> resInfo = context.getPackageManager().queryIntentServices(intent, 0);
return !resInfo.isEmpty();
}
}