Share helper

This commit is contained in:
Dominik Schürmann 2014-09-06 17:39:00 +02:00
parent 59f32c4fca
commit f2f1a9516d
3 changed files with 113 additions and 129 deletions

View File

@ -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);
}
}

View File

@ -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));

View File

@ -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();
}