mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-05 08:45:08 -05:00
Share helper
This commit is contained in:
parent
59f32c4fca
commit
f2f1a9516d
@ -0,0 +1,101 @@
|
||||
package org.sufficientlysecure.keychain.helper;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.LabeledIntent;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.Build;
|
||||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
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 OK's EncryptActivity.
|
||||
* <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 and weird results on 2.3
|
||||
// TODO: test on 4.1, 4.2, 4.3, only tested on 4.4
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
|
||||
return Intent.createChooser(prototype, title);
|
||||
}
|
||||
|
||||
List<LabeledIntent> targetedShareIntents = new ArrayList<LabeledIntent>();
|
||||
|
||||
List<ResolveInfo> resInfoList = mContext.getPackageManager().queryIntentActivities(prototype, 0);
|
||||
List<ResolveInfo> resInfoListFiltered = new ArrayList<ResolveInfo>();
|
||||
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
|
||||
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
|
||||
return chooserIntent;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// fallback to Android's default chooser
|
||||
return Intent.createChooser(prototype, title);
|
||||
}
|
||||
}
|
@ -33,6 +33,7 @@ import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
|
||||
import org.sufficientlysecure.keychain.helper.Preferences;
|
||||
import org.sufficientlysecure.keychain.helper.ShareHelper;
|
||||
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||
import org.sufficientlysecure.keychain.service.KeychainIntentService;
|
||||
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
|
||||
@ -262,74 +263,13 @@ public class EncryptFileActivity extends DrawerActivity implements EncryptActivi
|
||||
|
||||
/**
|
||||
* Create Intent Chooser but exclude OK's EncryptActivity.
|
||||
* <p/>
|
||||
* Put together from some stackoverflow posts...
|
||||
*
|
||||
* @param message
|
||||
* @return
|
||||
*/
|
||||
private Intent sendWithChooserExcludingEncrypt(Message message) {
|
||||
Intent prototype = createSendIntent(message);
|
||||
|
||||
String title = getString(R.string.title_share_file);
|
||||
String[] blacklist = new String[]{Constants.PACKAGE_NAME + ".ui.EncryptActivity"};
|
||||
|
||||
// Disabled, produced an empty list on Huawei U8860 with Android Version 4.0.3
|
||||
// // fallback on Android 2.3, otherwise we would get weird results
|
||||
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||
// return Intent.createChooser(prototype, title);
|
||||
// }
|
||||
//
|
||||
// // prevent recursion aka Inception :P
|
||||
// String[] blacklist = new String[]{Constants.PACKAGE_NAME + ".ui.EncryptActivity"};
|
||||
//
|
||||
// List<LabeledIntent> targetedShareIntents = new ArrayList<LabeledIntent>();
|
||||
//
|
||||
// List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(prototype, 0);
|
||||
// List<ResolveInfo> resInfoListFiltered = new ArrayList<ResolveInfo>();
|
||||
// if (!resInfoList.isEmpty()) {
|
||||
// for (ResolveInfo resolveInfo : resInfoList) {
|
||||
// // do not add blacklisted ones
|
||||
// if (resolveInfo.activityInfo == null || Arrays.asList(blacklist).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(getPackageManager()).toString();
|
||||
// String secondName = second.loadLabel(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(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
|
||||
// chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
|
||||
// return chooserIntent;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
// fallback to Android's default chooser
|
||||
return Intent.createChooser(prototype, title);
|
||||
return new ShareHelper(this).createChooserExcluding(prototype, title, blacklist);
|
||||
}
|
||||
|
||||
private Intent createSendIntent(Message message) {
|
||||
@ -452,7 +392,8 @@ public class EncryptFileActivity extends DrawerActivity implements EncryptActivi
|
||||
.replace(R.id.encrypt_pager_mode,
|
||||
mCurrentMode == MODE_SYMMETRIC
|
||||
? new EncryptSymmetricFragment()
|
||||
: new EncryptAsymmetricFragment())
|
||||
: new EncryptAsymmetricFragment()
|
||||
)
|
||||
.commitAllowingStateLoss();
|
||||
getSupportFragmentManager().executePendingTransactions();
|
||||
}
|
||||
@ -520,7 +461,8 @@ public class EncryptFileActivity extends DrawerActivity implements EncryptActivi
|
||||
action = ACTION_ENCRYPT_FILE;
|
||||
}
|
||||
|
||||
} else */ {
|
||||
} else */
|
||||
{
|
||||
// Files via content provider, override uri and action
|
||||
uris.clear();
|
||||
uris.add(intent.<Uri>getParcelableExtra(Intent.EXTRA_STREAM));
|
||||
|
@ -33,6 +33,7 @@ import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
|
||||
import org.sufficientlysecure.keychain.helper.Preferences;
|
||||
import org.sufficientlysecure.keychain.helper.ShareHelper;
|
||||
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||
import org.sufficientlysecure.keychain.service.KeychainIntentService;
|
||||
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
|
||||
@ -245,74 +246,13 @@ public class EncryptTextActivity extends DrawerActivity implements EncryptActivi
|
||||
|
||||
/**
|
||||
* Create Intent Chooser but exclude OK's EncryptActivity.
|
||||
* <p/>
|
||||
* Put together from some stackoverflow posts...
|
||||
*
|
||||
* @param message
|
||||
* @return
|
||||
*/
|
||||
private Intent sendWithChooserExcludingEncrypt(Message message) {
|
||||
Intent prototype = createSendIntent(message);
|
||||
|
||||
String title = getString(R.string.title_share_message);
|
||||
String[] blacklist = new String[]{Constants.PACKAGE_NAME + ".ui.EncryptActivity"};
|
||||
|
||||
// Disabled, produced an empty list on Huawei U8860 with Android Version 4.0.3
|
||||
// // fallback on Android 2.3, otherwise we would get weird results
|
||||
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||
// return Intent.createChooser(prototype, title);
|
||||
// }
|
||||
//
|
||||
// // prevent recursion aka Inception :P
|
||||
// String[] blacklist = new String[]{Constants.PACKAGE_NAME + ".ui.EncryptActivity"};
|
||||
//
|
||||
// List<LabeledIntent> targetedShareIntents = new ArrayList<LabeledIntent>();
|
||||
//
|
||||
// List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(prototype, 0);
|
||||
// List<ResolveInfo> resInfoListFiltered = new ArrayList<ResolveInfo>();
|
||||
// if (!resInfoList.isEmpty()) {
|
||||
// for (ResolveInfo resolveInfo : resInfoList) {
|
||||
// // do not add blacklisted ones
|
||||
// if (resolveInfo.activityInfo == null || Arrays.asList(blacklist).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(getPackageManager()).toString();
|
||||
// String secondName = second.loadLabel(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(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
|
||||
// chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
|
||||
// return chooserIntent;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
// fallback to Android's default chooser
|
||||
return Intent.createChooser(prototype, title);
|
||||
return new ShareHelper(this).createChooserExcluding(prototype, title, blacklist);
|
||||
}
|
||||
|
||||
private Intent createSendIntent(Message message) {
|
||||
@ -418,7 +358,8 @@ public class EncryptTextActivity extends DrawerActivity implements EncryptActivi
|
||||
.replace(R.id.encrypt_pager_mode,
|
||||
mCurrentMode == MODE_SYMMETRIC
|
||||
? new EncryptSymmetricFragment()
|
||||
: new EncryptAsymmetricFragment())
|
||||
: new EncryptAsymmetricFragment()
|
||||
)
|
||||
.commitAllowingStateLoss();
|
||||
getSupportFragmentManager().executePendingTransactions();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user