package go.smart.woaiwhz.smartgo.activity; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import android.support.annotation.AnimRes; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.content.ContextCompat; import android.support.v4.util.Pair; import android.view.View; import go.smart.woaiwhz.smartgo.base.ActivityAnimate; import go.smart.woaiwhz.smartgo.base.BaseLauncher; import go.smart.woaiwhz.smartgo.base.Box; import go.smart.woaiwhz.smartgo.base.SmartGoLog; import go.smart.woaiwhz.smartgo.builder.SharedAnimatorBuilder; /** * Created by huazhou.whz on 2016/9/3. */ public abstract class BaseActivityLauncher extends BaseLauncher { protected static final int INIT_REQUEST_CODE = -1; protected int mRequestCode = INIT_REQUEST_CODE; protected final Context mFrom; private final Box<ActivityOptionsCompat> mActivityOptionsBox; public BaseActivityLauncher(final Context from){ super(from); mFrom = from; mActivityOptionsBox = new Box<>(); } protected <T extends BaseActivityLauncher> T requestCode(final T son, final int requestCode){ mRequestCode = requestCode; return son; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) protected <T extends BaseActivityLauncher> SharedAnimatorBuilder<T> shareElements(final T son){ if(mFrom instanceof Activity){ return new SharedAnimatorBuilder<>(mActivityOptionsBox,son,(Activity) mFrom); }else { throw new IllegalArgumentException("this method needs Activity context,not : " + mFrom); } } protected <T extends BaseActivityLauncher> T animate(final T son, @AnimRes int enterResId, @AnimRes int exitResId){ ActivityAnimate.animate(mFrom,mActivityOptionsBox,enterResId,exitResId); return son; } protected <T extends BaseActivityLauncher> T animate(final T son, @NonNull View source, int startX, int startY, int startWidth, int startHeight){ ActivityAnimate.animate(mActivityOptionsBox,source,startX,startY,startWidth,startHeight); return son; } protected <T extends BaseActivityLauncher> T animate(final T son, @NonNull View sharedElement, @NonNull String sharedElementName){ if(mFrom instanceof Activity) { ActivityAnimate.animate((Activity) mFrom, mActivityOptionsBox, sharedElement, sharedElementName); return son; }else { throw new IllegalArgumentException("this method needs Activity context,not : " + mFrom); } } protected <T extends BaseActivityLauncher> T animate(final T son, @NonNull View source, @NonNull Bitmap thumbnail, int startX, int startY){ ActivityAnimate.animate(mActivityOptionsBox,source,thumbnail,startX,startY); return son; } protected <T extends BaseActivityLauncher> T animate(final T son, @NonNull Pair<View, String>... sharedElements){ if(mFrom instanceof Activity) { ActivityAnimate.animate((Activity) mFrom, mActivityOptionsBox, sharedElements); return son; }else { throw new IllegalArgumentException("this method needs Activity context,not : " + mFrom); } } @Override public void goReally(final Context context,final Intent intent){ if(isAvailable(context,intent)) { final ActivityOptionsCompat options = mActivityOptionsBox.get(); Bundle optionsBundle = null; if(options != null) { optionsBundle = options.toBundle(); } if(context instanceof Activity) { ActivityCompat.startActivityForResult((Activity) context, intent, mRequestCode, optionsBundle); }else { ContextCompat.startActivities(context,new Intent[]{intent},optionsBundle); } }else{ SmartGoLog.e("have no resolved activity : " + intent); } } private boolean isAvailable(final Context context,final Intent intent){ final PackageManager manager = context.getPackageManager(); final ResolveInfo info = manager.resolveActivity( intent, PackageManager.MATCH_DEFAULT_ONLY); return info != null; } }