Remove ShareHelper: Not compat with Android >= 5, reduce code complexity
This commit is contained in:
parent
2b735102f7
commit
1328309009
|
@ -36,7 +36,6 @@ import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
|
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
|
||||||
import org.sufficientlysecure.keychain.ui.util.Notify;
|
import org.sufficientlysecure.keychain.ui.util.Notify;
|
||||||
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
|
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
|
||||||
import org.sufficientlysecure.keychain.util.ShareHelper;
|
|
||||||
|
|
||||||
public class DisplayTextFragment extends DecryptFragment {
|
public class DisplayTextFragment extends DecryptFragment {
|
||||||
|
|
||||||
|
@ -60,22 +59,6 @@ public class DisplayTextFragment extends DecryptFragment {
|
||||||
return frag;
|
return frag;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Intent Chooser but exclude decrypt activites
|
|
||||||
*/
|
|
||||||
private Intent sendWithChooserExcludingDecrypt(String text) {
|
|
||||||
Intent prototype = createSendIntent(text);
|
|
||||||
String title = getString(R.string.title_share_message);
|
|
||||||
|
|
||||||
// we don't want to decrypt the decrypted, no inception ;)
|
|
||||||
String[] blacklist = new String[]{
|
|
||||||
Constants.PACKAGE_NAME + ".ui.DecryptActivity",
|
|
||||||
"org.thialfihar.android.apg.ui.DecryptActivity"
|
|
||||||
};
|
|
||||||
|
|
||||||
return new ShareHelper(getActivity()).createChooserExcluding(prototype, title, blacklist);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Intent createSendIntent(String text) {
|
private Intent createSendIntent(String text) {
|
||||||
Intent sendIntent = new Intent(Intent.ACTION_SEND);
|
Intent sendIntent = new Intent(Intent.ACTION_SEND);
|
||||||
sendIntent.putExtra(Intent.EXTRA_TEXT, text);
|
sendIntent.putExtra(Intent.EXTRA_TEXT, text);
|
||||||
|
@ -146,7 +129,8 @@ public class DisplayTextFragment extends DecryptFragment {
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case R.id.decrypt_share: {
|
case R.id.decrypt_share: {
|
||||||
startActivity(sendWithChooserExcludingDecrypt(mText.getText().toString()));
|
startActivity(Intent.createChooser(createSendIntent(mText.getText().toString()),
|
||||||
|
getString(R.string.title_share_message)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case R.id.decrypt_copy: {
|
case R.id.decrypt_copy: {
|
||||||
|
|
|
@ -69,7 +69,6 @@ import org.sufficientlysecure.keychain.util.FileHelper;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
import org.sufficientlysecure.keychain.util.Passphrase;
|
import org.sufficientlysecure.keychain.util.Passphrase;
|
||||||
import org.sufficientlysecure.keychain.util.Preferences;
|
import org.sufficientlysecure.keychain.util.Preferences;
|
||||||
import org.sufficientlysecure.keychain.util.ShareHelper;
|
|
||||||
|
|
||||||
public class EncryptFilesFragment
|
public class EncryptFilesFragment
|
||||||
extends CachingCryptoOperationFragment<SignEncryptParcel, SignEncryptResult> {
|
extends CachingCryptoOperationFragment<SignEncryptParcel, SignEncryptResult> {
|
||||||
|
@ -404,7 +403,7 @@ public class EncryptFilesFragment
|
||||||
public void onDeleted() {
|
public void onDeleted() {
|
||||||
if (mAfterEncryptAction == AfterEncryptAction.SHARE) {
|
if (mAfterEncryptAction == AfterEncryptAction.SHARE) {
|
||||||
// Share encrypted message/file
|
// Share encrypted message/file
|
||||||
startActivity(sendWithChooserExcludingEncrypt());
|
startActivity(Intent.createChooser(createSendIntent(), getString(R.string.title_share_file)));
|
||||||
} else {
|
} else {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity == null) {
|
if (activity == null) {
|
||||||
|
@ -424,7 +423,7 @@ public class EncryptFilesFragment
|
||||||
|
|
||||||
case SHARE:
|
case SHARE:
|
||||||
// Share encrypted message/file
|
// Share encrypted message/file
|
||||||
startActivity(sendWithChooserExcludingEncrypt());
|
startActivity(Intent.createChooser(createSendIntent(), getString(R.string.title_share_file)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COPY:
|
case COPY:
|
||||||
|
@ -620,22 +619,6 @@ public class EncryptFilesFragment
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Intent Chooser but exclude OK's EncryptActivity.
|
|
||||||
*/
|
|
||||||
private Intent sendWithChooserExcludingEncrypt() {
|
|
||||||
Intent prototype = createSendIntent();
|
|
||||||
String title = getString(R.string.title_share_file);
|
|
||||||
|
|
||||||
// we don't want to encrypt the encrypted, no inception ;)
|
|
||||||
String[] blacklist = new String[]{
|
|
||||||
Constants.PACKAGE_NAME + ".ui.EncryptFilesActivity",
|
|
||||||
"org.thialfihar.android.apg.ui.EncryptActivity"
|
|
||||||
};
|
|
||||||
|
|
||||||
return new ShareHelper(getActivity()).createChooserExcluding(prototype, title, blacklist);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Intent createSendIntent() {
|
private Intent createSendIntent() {
|
||||||
Intent sendIntent;
|
Intent sendIntent;
|
||||||
// file
|
// file
|
||||||
|
|
|
@ -46,7 +46,6 @@ import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
|
||||||
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
|
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
|
||||||
import org.sufficientlysecure.keychain.util.Passphrase;
|
import org.sufficientlysecure.keychain.util.Passphrase;
|
||||||
import org.sufficientlysecure.keychain.util.Preferences;
|
import org.sufficientlysecure.keychain.util.Preferences;
|
||||||
import org.sufficientlysecure.keychain.util.ShareHelper;
|
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -289,22 +288,6 @@ public class EncryptTextFragment
|
||||||
result.createNotify(activity).show();
|
result.createNotify(activity).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Intent Chooser but exclude OK's EncryptActivity.
|
|
||||||
*/
|
|
||||||
private Intent sendWithChooserExcludingEncrypt(byte[] resultBytes) {
|
|
||||||
Intent prototype = createSendIntent(resultBytes);
|
|
||||||
String title = getString(R.string.title_share_message);
|
|
||||||
|
|
||||||
// we don't want to encrypt the encrypted, no inception ;)
|
|
||||||
String[] blacklist = new String[]{
|
|
||||||
Constants.PACKAGE_NAME + ".ui.EncryptTextActivity",
|
|
||||||
"org.thialfihar.android.apg.ui.EncryptActivity"
|
|
||||||
};
|
|
||||||
|
|
||||||
return new ShareHelper(getActivity()).createChooserExcluding(prototype, title, blacklist);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Intent createSendIntent(byte[] resultBytes) {
|
private Intent createSendIntent(byte[] resultBytes) {
|
||||||
Intent sendIntent;
|
Intent sendIntent;
|
||||||
sendIntent = new Intent(Intent.ACTION_SEND);
|
sendIntent = new Intent(Intent.ACTION_SEND);
|
||||||
|
@ -343,7 +326,8 @@ public class EncryptTextFragment
|
||||||
|
|
||||||
if (mShareAfterEncrypt) {
|
if (mShareAfterEncrypt) {
|
||||||
// Share encrypted message/file
|
// Share encrypted message/file
|
||||||
startActivity(sendWithChooserExcludingEncrypt(result.getResultBytes()));
|
startActivity(Intent.createChooser(createSendIntent(result.getResultBytes()),
|
||||||
|
getString(R.string.title_share_message)));
|
||||||
} else {
|
} else {
|
||||||
// Copy to clipboard
|
// Copy to clipboard
|
||||||
copyToClipboard(result);
|
copyToClipboard(result);
|
||||||
|
|
|
@ -1,104 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.sufficientlysecure.keychain.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.LabeledIntent;
|
|
||||||
import android.content.pm.ResolveInfo;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class ShareHelper {
|
|
||||||
Context mContext;
|
|
||||||
|
|
||||||
public ShareHelper(Context context) {
|
|
||||||
mContext = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Intent Chooser but exclude specific activites, e.g., EncryptActivity to prevent encrypting again
|
|
||||||
* <p/>
|
|
||||||
* Put together from some stackoverflow posts...
|
|
||||||
*/
|
|
||||||
public Intent createChooserExcluding(Intent prototype, String title, String[] activityBlacklist) {
|
|
||||||
// Produced an empty list on Huawei U8860 with Android Version 4.0.3
|
|
||||||
// TODO: test on 4.1, 4.2, 4.3, only tested on 4.4
|
|
||||||
// Disabled on 5.0 because using EXTRA_INITIAL_INTENTS prevents the usage based sorting
|
|
||||||
// introduced in 5.0: https://medium.com/@xXxXxXxXxXam/how-lollipops-share-menu-is-organized-d204888f606d
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
return Intent.createChooser(prototype, title);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<LabeledIntent> targetedShareIntents = new ArrayList<>();
|
|
||||||
|
|
||||||
List<ResolveInfo> resInfoList = mContext.getPackageManager().queryIntentActivities(prototype, 0);
|
|
||||||
List<ResolveInfo> resInfoListFiltered = new ArrayList<>();
|
|
||||||
if (!resInfoList.isEmpty()) {
|
|
||||||
for (ResolveInfo resolveInfo : resInfoList) {
|
|
||||||
// do not add blacklisted ones
|
|
||||||
if (resolveInfo.activityInfo == null || Arrays.asList(activityBlacklist).contains(resolveInfo.activityInfo.name))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
resInfoListFiltered.add(resolveInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!resInfoListFiltered.isEmpty()) {
|
|
||||||
// sorting for nice readability
|
|
||||||
Collections.sort(resInfoListFiltered, new Comparator<ResolveInfo>() {
|
|
||||||
@Override
|
|
||||||
public int compare(ResolveInfo first, ResolveInfo second) {
|
|
||||||
String firstName = first.loadLabel(mContext.getPackageManager()).toString();
|
|
||||||
String secondName = second.loadLabel(mContext.getPackageManager()).toString();
|
|
||||||
return firstName.compareToIgnoreCase(secondName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// create the custom intent list
|
|
||||||
for (ResolveInfo resolveInfo : resInfoListFiltered) {
|
|
||||||
Intent targetedShareIntent = (Intent) prototype.clone();
|
|
||||||
targetedShareIntent.setPackage(resolveInfo.activityInfo.packageName);
|
|
||||||
targetedShareIntent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
|
|
||||||
|
|
||||||
LabeledIntent lIntent = new LabeledIntent(targetedShareIntent,
|
|
||||||
resolveInfo.activityInfo.packageName,
|
|
||||||
resolveInfo.loadLabel(mContext.getPackageManager()),
|
|
||||||
resolveInfo.activityInfo.icon);
|
|
||||||
targetedShareIntents.add(lIntent);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create chooser with only one Intent in it
|
|
||||||
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(targetedShareIntents.size() - 1), title);
|
|
||||||
// append all other Intents
|
|
||||||
// TODO this line looks wrong?!
|
|
||||||
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
|
|
||||||
return chooserIntent;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// fallback to Android's default chooser
|
|
||||||
return Intent.createChooser(prototype, title);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue