Android Open Source - Music-Share-Android Intent Resolver






From Project

Back to project page Music-Share-Android.

License

The source code is released under:

GNU General Public License

If you think the Android project Music-Share-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.paperairplane.music.share.utils;
/*from   w  w  w  .  j  a v  a 2 s  .c  o  m*/
import java.util.Iterator;
import java.util.List;

import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources.NotFoundException;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.paperairplane.music.share.Consts;
import com.paperairplane.music.share.R;
import com.paperairplane.music.share.utils.MyLogger;

/**
 * ?????ActivityChooser
 * 
 * @author Harry Chen (<a href="mailto:chenshengqi1@gmail.com">Harry Chen</a>)
 * @author Xavier Yao (<a href="mailto:xavieryao@me.com">Xavier Yao</a>)
 * @see <a
 *      href="http://www.github.com/PaperAirPlane-Dev-Team/Music-Share-Android">Our
 *      GitHub</a>
 */
public class IntentResolver {
  private Context mCtx;
  private PackageManager mPm;
  private Handler mHandler;
  private AlertDialog intentDialog;

  /**
   * ???????Intent??ResolveInfo???????????????
   * 
   * @param ctx
   *            ???Context
   * @param i
   *            ??????Intent
   * @param handler
   *            ????UI?????Handler
   */
  public void handleIntent(Context ctx, Intent i, Handler handler) {
    mCtx = ctx;
    mHandler = handler;
    boolean isShare = i.hasExtra("artworkUrl");
    mPm = ctx.getPackageManager();
    List<ResolveInfo> info = mPm.queryIntentActivities(i,
        PackageManager.MATCH_DEFAULT_ONLY);
    MyLogger.d(Consts.DEBUG_TAG, "handleIntent");
    // ??????
    Iterator<ResolveInfo> it = info.listIterator();
    String myPackageName = mCtx.getPackageName();
    while (it.hasNext()) {
      ResolveInfo ri = it.next();
      if (ri.activityInfo.packageName.equals(myPackageName)) {
        info.remove(ri);
        break;
        /*
         * ??????????,??List????,Iterator????????
         * ????????,??????????,"?"????????? ????????????????????
         * ???????"M"?????? ???????????? ??????break???????
         */
      }
    }
    if (isShare) {
      // ??SEND???????????????
      ResolveInfo share2weibo = new ResolveInfo();
      share2weibo.icon = R.drawable.weibo_logo;
      share2weibo.labelRes = R.string.share2weibo;
      share2weibo.activityInfo = new ActivityInfo();
      share2weibo.activityInfo.flags = Consts.ShareMeans.INTERNAL;
      info.add(0, share2weibo);
    }
    // ??Intent??
    showDialog(info, i);
  }

  /**
   * ??"???"?????ListView?Adapter
   */
  private class IntentListAdapter extends BaseAdapter {

    List<ResolveInfo> info;

    public IntentListAdapter(List<ResolveInfo> info) {
      this.info = info;
    }

    @Override
    public int getCount() {

      return info.size();
    }

    @Override
    public Object getItem(int position) {

      return info.get(position);
    }

    @Override
    public long getItemId(int position) {

      return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      View vwItem = LayoutInflater.from(mCtx).inflate(
          R.layout.resolve_list_item, null);
      ImageView ivItemIcon = (ImageView) vwItem.findViewById(R.id.icon);
      TextView tvItemLabel = (TextView) vwItem
          .findViewById(android.R.id.text1);
      TextView tvItemExtended = (TextView) vwItem
          .findViewById(android.R.id.text2);
      // ????????
      Drawable icon;
      String label;
      ResolveInfo ri = info.get(position);
      if (ri.activityInfo.flags != Consts.ShareMeans.INTERNAL) {
        // ??????PackageManager???????

        icon = ri.activityInfo.loadIcon(mPm);
        label = ri.activityInfo.loadLabel(mPm).toString().trim();

      } else {
        // ????????????????
        // ?????????,????????App??????
        // XXX ?????
        try {
          icon = mCtx.getResources().getDrawable(ri.icon);
          label = mCtx.getString(ri.labelRes);
        } catch (NotFoundException e) {
          icon = mCtx.getResources().getDrawable(
              R.drawable.ic_launcher);
          label = mCtx.getString(R.string.app_name);
        }
      }
      ivItemIcon.setImageDrawable(icon);
      tvItemLabel.setText(label);
      tvItemExtended.setVisibility(View.GONE);
      if (Build.VERSION.SDK_INT < 11) {
        tvItemLabel.setTextColor(mCtx.getResources().getColor(
            android.R.color.primary_text_light));
      } else {
        tvItemLabel.setTextColor(mCtx.getResources().getColor(
            android.R.color.primary_text_dark));
      }
      return vwItem;
    }

  }

  /**
   * ??ResolveInfo?List
   * 
   * @param info
   *            ??App????
   * @param i
   *            ????Intent
   */
  private void showDialog(final List<ResolveInfo> info, final Intent i) {
    if (info.size() == 0) {
      new AlertDialog.Builder(mCtx)
          .setMessage(mCtx.getString(R.string.no_app_found))
          .setPositiveButton(mCtx.getString(android.R.string.ok),
              new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog,
                    int which) {
                }
              }).show();
      return;
    } else if (info.size() == 1) {
      Intent intent = generateIntent(i, info.get(0));
      mCtx.startActivity(intent);
      return;
    }

    OnItemClickListener listener = new OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> parent, View view,
          int position, long id) {
        ResolveInfo ri = info.get(position);
        boolean isInternal = (ri.activityInfo.flags == Consts.ShareMeans.INTERNAL);
        if (!isInternal) {
          // ?????????
          Intent intent = generateIntent(i, ri);
          if (ri.activityInfo.packageName.contains("mms")
              || ri.activityInfo.packageName.contains("sms")) {
            intent.putExtra("sms_body",
                intent.getStringExtra(Intent.EXTRA_TEXT));
          }
          mCtx.startActivity(intent);
        } else {
          // ??????????
          Bundle bundle;
          bundle = i.getExtras();
          Message m = mHandler.obtainMessage(
              Consts.Status.SEND_WEIBO, bundle);
          mHandler.sendMessage(m);
        }
        intentDialog.cancel();
        // ?????!?????????
      }

    };
    ListView v = new ListView(mCtx);
    v.setCacheColorHint(0);
    if (Build.VERSION.SDK_INT < 11) {
      // ?????????????????????
      v.setBackgroundColor(mCtx.getResources().getColor(
          android.R.color.primary_text_dark));
    }
    v.setAdapter(new IntentListAdapter(info));
    v.setOnItemClickListener(listener);
    String title = (i.getAction().equals(Intent.ACTION_VIEW)) ? mCtx
        .getString(R.string.how_to_play) : mCtx
        .getString(R.string.how_to_share);
    intentDialog = new AlertDialog.Builder(mCtx).setView(v).setTitle(title)
        .create();
    //??????????????Dialog?,?????????
    //??????????????????,????
    intentDialog.show();
  }

  /**
   * ????ResolveInfo?????Intent
   * 
   * @param i
   *            ???Intent
   * @param ri
   *            ??App????
   * @return
   */
  private Intent generateIntent(final Intent i, ResolveInfo ri) {
    Intent intent = new Intent(i);
    intent.setFlags(intent.getFlags()
        & ~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT
        | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP
        | Intent.FLAG_ACTIVITY_NEW_TASK);

    intent.setComponent(new ComponentName(
        ri.activityInfo.applicationInfo.packageName,
        ri.activityInfo.name));
    return intent;
  }

}




Java Source Code List

android.net.http.SslError.java
com.paperairplane.music.share.AtSuggestionActivity.java
com.paperairplane.music.share.Consts.java
com.paperairplane.music.share.FeedbackMessage.java
com.paperairplane.music.share.Main.java
com.paperairplane.music.share.MusicData.java
com.paperairplane.music.share.MusicListAdapter.java
com.paperairplane.music.share.QueryAndShareMusicInfo.java
com.paperairplane.music.share.Receiver.java
com.paperairplane.music.share.SnsHelper.java
com.paperairplane.music.share.cache.ImageLoader.java
com.paperairplane.music.share.cache.MemoryCache.java
com.paperairplane.music.share.dialogs.AboutDialogFragment.java
com.paperairplane.music.share.dialogs.AbsDialogFragment.java
com.paperairplane.music.share.dialogs.AuthManagerDialogFragment.java
com.paperairplane.music.share.dialogs.BackgroundChooserDialogFragment.java
com.paperairplane.music.share.dialogs.ChangeColorDialogFragment.java
com.paperairplane.music.share.dialogs.EmptyDialogFragment.java
com.paperairplane.music.share.dialogs.FeedbackDialogFragment.java
com.paperairplane.music.share.dialogs.SearchDialogFragment.java
com.paperairplane.music.share.dialogs.SendWeiboDialogFragment.java
com.paperairplane.music.share.dialogs.ThankDialogFragment.java
com.paperairplane.music.share.utils.CrashHandler.java
com.paperairplane.music.share.utils.HanziToPinyin.java
com.paperairplane.music.share.utils.HttpQuestHandler.java
com.paperairplane.music.share.utils.IntentResolver.java
com.paperairplane.music.share.utils.MyLogger.java
com.paperairplane.music.share.utils.ShakeDetector.java
com.paperairplane.music.share.utils.Utilities.java
com.paperairplane.music.share.utils.lastfm.Album.java
com.paperairplane.music.share.utils.lastfm.Artist.java
com.paperairplane.music.share.utils.lastfm.Caller.java
com.paperairplane.music.share.utils.lastfm.DomElement.java
com.paperairplane.music.share.utils.lastfm.ImageHolder.java
com.paperairplane.music.share.utils.lastfm.ImageSize.java
com.paperairplane.music.share.utils.lastfm.Image.java
com.paperairplane.music.share.utils.lastfm.ItemFactoryBuilder.java
com.paperairplane.music.share.utils.lastfm.ItemFactory.java
com.paperairplane.music.share.utils.lastfm.MapUtilities.java
com.paperairplane.music.share.utils.lastfm.MusicEntry.java
com.paperairplane.music.share.utils.lastfm.PaginatedResult.java
com.paperairplane.music.share.utils.lastfm.ResponseBuilder.java
com.paperairplane.music.share.utils.lastfm.Result.java
com.paperairplane.music.share.utils.lastfm.StringUtilities.java
com.paperairplane.music.share.utils.lastfm.Track.java
com.weibo.sdk.android.Oauth2AccessToken.java
com.weibo.sdk.android.WeiboAuthListener.java
com.weibo.sdk.android.WeiboDialogError.java
com.weibo.sdk.android.WeiboDialog.java
com.weibo.sdk.android.WeiboException.java
com.weibo.sdk.android.WeiboParameters.java
com.weibo.sdk.android.Weibo.java
com.weibo.sdk.android.api.AccountAPI.java
com.weibo.sdk.android.api.ActivityInvokeAPI.java
com.weibo.sdk.android.api.CommentsAPI.java
com.weibo.sdk.android.api.CommonAPI.java
com.weibo.sdk.android.api.FavoritesAPI.java
com.weibo.sdk.android.api.FriendshipsAPI.java
com.weibo.sdk.android.api.PlaceAPI.java
com.weibo.sdk.android.api.RegisterAPI.java
com.weibo.sdk.android.api.SearchAPI.java
com.weibo.sdk.android.api.ShortUrlAPI.java
com.weibo.sdk.android.api.StatusesAPI.java
com.weibo.sdk.android.api.SuggestionsAPI.java
com.weibo.sdk.android.api.TagsAPI.java
com.weibo.sdk.android.api.TrendsAPI.java
com.weibo.sdk.android.api.UsersAPI.java
com.weibo.sdk.android.api.WeiboAPI.java
com.weibo.sdk.android.net.AsyncWeiboRunner.java
com.weibo.sdk.android.net.HttpManager.java
com.weibo.sdk.android.net.NetStateManager.java
com.weibo.sdk.android.net.RequestListener.java
com.weibo.sdk.android.sso.SsoHandler.java
com.weibo.sdk.android.util.BitmapHelper.java
com.weibo.sdk.android.util.Utility.java