Skip to content

Instantly share code, notes, and snippets.

@koocbor
Created March 18, 2014 18:41
Show Gist options
  • Save koocbor/9626587 to your computer and use it in GitHub Desktop.
Save koocbor/9626587 to your computer and use it in GitHub Desktop.
Custom Dialog to Choose Sharing Intent with Filtering
Intent emailIntent = new Intent();
emailIntent.setAction(Intent.ACTION_SEND);
// Native email client doesn't currently support HTML, but it doesn't hurt to try in case they fix it
emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(extraText));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, extraSubject);
emailIntent.setType("message/rfc822");
PackageManager pm = getPackageManager();
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, 0);
ArrayList<ResolveInfo> dialogResInfo = new ArrayList<ResolveInfo>();
for (int i=0; i<resInfo.size(); i++) {
ResolveInfo ri = resInfo.get(i);
String packageName = ri.activityInfo.packageName;
if (packageName.contains("android.email") ||
packageName.contains("twitter") ||
packageName.contains("facebook") ||
packageName.contains("android.gm")) {
dialogResInfo.add(ri);
}
}
Collections.sort(dialogResInfo, new ResolveInfo.DisplayNameComparator(pm));
final Dialog dialog = new Dialog(BaseActivity.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
layoutParams.gravity = Gravity.CENTER;
dialog.getWindow().setAttributes(layoutParams);
dialog.setCanceledOnTouchOutside(true);
dialog.setContentView(R.layout.dialog_share_chooser);
dialog.setCancelable(true);
ListView dialogListView = (ListView)dialog.findViewById(R.id.share_list);
final ShareListAdapter adapter = new ShareListAdapter(this, pm, dialogResInfo);
dialogListView.setAdapter(adapter);
dialogListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
ResolveInfo ri = adapter.getItem(position);
String packageName = ri.activityInfo.packageName;
if (packageName.contains("facebook")) {
FacebookDialog fbDialog = new FacebookDialog.ShareDialogBuilder(BaseActivity.this)
.setLink(extraText)
.build();
fbUiHelper.trackPendingDialogCall(fbDialog.present());
finish();
} else {
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
if(packageName.contains("twitter")) {
intent.putExtra(Intent.EXTRA_TEXT, extraText);
} else if(packageName.contains("mms")) {
intent.putExtra(Intent.EXTRA_TEXT, extraText);
} else if(packageName.contains("android.gm")) {
intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(extraText));
intent.putExtra(Intent.EXTRA_SUBJECT, extraSubject);
intent.setType("message/rfc822");
}
startActivity(intent);
}
}
});
dialog.show();
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:oak="http://oak/oak/schema"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<oak.widget.TextViewWithFont
android:id="@+id/share_title"
style="@style/DefaultTextView.H1.Venue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
oak:font="@string/afv_default_font_light"
android:background="?attr/noClickBackgroundSolid"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="?attr/listViewDivider"/>
<uk.co.androidalliance.edgeeffectoverride.EdgeEffectListView
android:id="@+id/share_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:edgeeffect_color="@color/afv_config_action_bar_color"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:oak="http://oak/oak/schema"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/itemBackgroundSolid">
<ImageView
android:id="@+id/share_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/default_padding"
/>
<oak.widget.TextViewWithFont
android:id="@+id/share_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/default_padding"
oak:font="@string/afv_default_font_light" />
</LinearLayout>
package com.appsforvenues.library.android.adapter;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.appsforvenues.library.android.R;
import java.util.ArrayList;
/**
* Created by robcook on 3/18/14.
*/
public class ShareListAdapter extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private ArrayList<ResolveInfo> resInfoList;
private PackageManager pm;
private ViewHolder holder;
class ViewHolder {
public TextView name;
public ImageView icon;
}
public ShareListAdapter(Context context, PackageManager pm, ArrayList<ResolveInfo> resInfo) {
this.context = context;
this.pm = pm;
inflater = LayoutInflater.from(context);
resInfoList = resInfo;
}
@Override
public int getCount() {
return resInfoList.size();
}
@Override
public ResolveInfo getItem(int position) {
return resInfoList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ResolveInfo resInfo = getItem(position);
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.share_chooser_list_item, viewGroup, false);
holder = new ViewHolder();
holder.icon = (ImageView)view.findViewById(R.id.share_icon);
holder.name = (TextView)view.findViewById(R.id.share_name);
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
holder.icon.setImageDrawable(resInfo.loadIcon(pm));
holder.name.setText(resInfo.loadLabel(pm));
return view;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment