package com.fastaccess.helper; import android.Manifest; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.ColorStateList; import android.graphics.Rect; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.customtabs.CustomTabsIntent; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.ShareCompat; import android.support.v4.util.Pair; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.LinearLayout.LayoutParams; import android.widget.RelativeLayout; import android.widget.Toast; import com.fastaccess.R; import java.util.ArrayList; import java.util.List; import es.dmoral.toasty.Toasty; /** * Created by Kosh on 12/12/15 10:51 PM */ public class ActivityHelper { private static int BUTTON_ID = 32; @Nullable public static Activity getActivity(@Nullable Context content) { if (content == null) return null; else if (content instanceof Activity) return (Activity) content; else if (content instanceof ContextWrapper) return getActivity(((ContextWrapper) content).getBaseContext()); return null; } public static void login(@NonNull Activity activity, @NonNull Uri url) { try { Uri uri = Uri.parse("googlechrome://navigate?url=" + url); Intent i = new Intent(Intent.ACTION_VIEW, uri); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(i); } catch (ActivityNotFoundException e) { Toasty.info(activity, "Chrome is required to login").show(); e.printStackTrace(); } } public static void startCustomTab(@NonNull Activity context, @NonNull Uri url) { String packageNameToUse = CustomTabsHelper.getPackageNameToUse(context); if (packageNameToUse != null) { CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder() .setToolbarColor(ViewHelper.getPrimaryColor(context)) .setShowTitle(true) .build(); customTabsIntent.intent.setPackage(packageNameToUse); customTabsIntent.launchUrl(context, url); } else { openChooser(context, url, true); } } public static void startCustomTab(@NonNull Activity context, @NonNull String url) { startCustomTab(context, Uri.parse(url)); } public static void openChooser(@NonNull Context context, @NonNull Uri url) { openChooser(context, url, false); } private static void openChooser(@NonNull Context context, @NonNull Uri url, boolean fromCustomTab) { Intent i = new Intent(Intent.ACTION_VIEW, url); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent finalIntent = chooserIntent(context, i, url); if (finalIntent != null) { try { context.startActivity(finalIntent); } catch (ActivityNotFoundException ignored) {} } else { if (!fromCustomTab) { Activity activity = ActivityHelper.getActivity(context); if (activity == null) { try { context.startActivity(i); } catch (ActivityNotFoundException ignored) {} return; } startCustomTab(activity, url); } else { try { context.startActivity(i); } catch (ActivityNotFoundException ignored) {} } } } public static void openChooser(@NonNull Context context, @NonNull String url) { openChooser(context, Uri.parse(url)); } @SafeVarargs public static void start(@NonNull Activity activity, Class cl, Pair<View, String>... sharedElements) { Intent intent = new Intent(activity, cl); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements); activity.startActivity(intent, options.toBundle()); } public static void start(@NonNull Activity activity, Intent intent, @NonNull View sharedElement) { ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElement, ViewHelper.getTransitionName(sharedElement)); activity.startActivity(intent, options.toBundle()); } public static void startReveal(@NonNull Activity activity, Intent intent, @NonNull View sharedElement, int requestCode) { ActivityOptionsCompat options = ActivityOptionsCompat.makeClipRevealAnimation(sharedElement, sharedElement.getWidth() / 2, sharedElement.getHeight() / 2, sharedElement.getWidth(), sharedElement.getHeight()); activity.startActivityForResult(intent, requestCode, options.toBundle()); } public static void startReveal(@NonNull Fragment fragment, Intent intent, @NonNull View sharedElement, int requestCode) { ActivityOptionsCompat options = ActivityOptionsCompat.makeClipRevealAnimation(sharedElement, sharedElement.getWidth() / 2, sharedElement.getHeight() / 2, sharedElement.getWidth(), sharedElement.getHeight()); fragment.startActivityForResult(intent, requestCode, options.toBundle()); } public static void startReveal(@NonNull Activity activity, Intent intent, @NonNull View sharedElement) { ActivityOptionsCompat options = ActivityOptionsCompat.makeClipRevealAnimation(sharedElement, sharedElement.getWidth() / 2, sharedElement.getHeight() / 2, sharedElement.getWidth(), sharedElement.getHeight()); activity.startActivity(intent, options.toBundle()); } @SafeVarargs public static void start(@NonNull Activity activity, @NonNull Intent intent, @NonNull Pair<View, String>... sharedElements) { ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements); activity.startActivity(intent, options.toBundle()); } public static void shareUrl(@NonNull Context context, @NonNull String url) { Activity activity = getActivity(context); if (activity == null) throw new IllegalArgumentException("Context given is not an instance of activity " + context.getClass().getName()); try { ShareCompat.IntentBuilder.from(activity) .setChooserTitle(context.getString(R.string.share)) .setType("text/*") .setText(url) .startChooser(); } catch (ActivityNotFoundException e) { Toasty.error(context, e.getMessage(), Toast.LENGTH_LONG).show(); } } @SuppressWarnings("RestrictedApi") @Nullable public static Fragment getVisibleFragment(@NonNull FragmentManager manager) { List<Fragment> fragments = manager.getFragments(); if (fragments != null && !fragments.isEmpty()) { for (Fragment fragment : fragments) { if (fragment != null && fragment.isVisible()) { return fragment; } } } return null; } private static boolean isPermissionGranted(@NonNull Context context, @NonNull String permission) { return ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED; } private static boolean isExplanationNeeded(@NonNull Activity context, @NonNull String permissionName) { return ActivityCompat.shouldShowRequestPermissionRationale(context, permissionName); } private static boolean isReadWritePermissionIsGranted(@NonNull Context context) { return isPermissionGranted(context, Manifest.permission.READ_EXTERNAL_STORAGE) && isPermissionGranted(context, Manifest.permission.WRITE_EXTERNAL_STORAGE); } private static void requestReadWritePermission(@NonNull Activity context) { ActivityCompat.requestPermissions(context, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, }, 1); } public static boolean checkAndRequestReadWritePermission(@NonNull Activity activity) { if (!isReadWritePermissionIsGranted(activity)) { requestReadWritePermission(activity); return false; } else if (isExplanationNeeded(activity, Manifest.permission.READ_EXTERNAL_STORAGE) || isExplanationNeeded(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toasty.error(activity, activity.getString(R.string.read_write_permission_explanation), Toast.LENGTH_LONG).show(); return false; } return true; } private static Intent chooserIntent(@NonNull Context context, @NonNull Intent intent, @NonNull Uri uri) { final PackageManager pm = context.getPackageManager(); final List<ResolveInfo> activities = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); final ArrayList<Intent> chooserIntents = new ArrayList<>(); final String ourPackageName = context.getPackageName(); for (ResolveInfo resInfo : activities) { ActivityInfo info = resInfo.activityInfo; if (!info.enabled || !info.exported) { continue; } if (info.packageName.equals(ourPackageName)) { continue; } Intent targetIntent = new Intent(intent); targetIntent.setPackage(info.packageName); targetIntent.setDataAndType(uri, intent.getType()); chooserIntents.add(targetIntent); } if (chooserIntents.isEmpty()) { return null; } final Intent lastIntent = chooserIntents.remove(chooserIntents.size() - 1); if (chooserIntents.isEmpty()) { return lastIntent; } Intent chooserIntent = Intent.createChooser(lastIntent, null); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, chooserIntents.toArray(new Intent[chooserIntents.size()])); return chooserIntent; } public static void showDismissHints(@NonNull Context context, @NonNull Runnable runnable) { Activity activity = getActivity(context); if (activity == null) return; LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.weight = 1; params.gravity = Gravity.START; int margin = (int) context.getResources().getDimension(R.dimen.spacing_normal); params.setMargins(margin, margin, margin, margin); Button button = new Button(context); button.setLayoutParams(params); button.setText(context.getResources().getString(R.string.dismiss_all)); button.setTextColor(context.getResources().getColor(R.color.material_grey_200)); button.setBackgroundTintList(ColorStateList.valueOf(context.getResources().getColor(R.color.material_red_accent_700))); button.setAllCaps(true); button.setOnClickListener(v -> { PrefGetter.isCommentHintShowed(); PrefGetter.isEditorHintShowed(); PrefGetter.isFileOptionHintShow(); PrefGetter.isHomeButoonHintShowed(); PrefGetter.isNavDrawerHintShowed(); PrefGetter.isReleaseHintShow(); PrefGetter.isRepoFabHintShowed(); PrefGetter.isRepoGuideShowed(); runnable.run(); ActivityHelper.hideDismissHints(context); }); ViewGroup parentView = (ViewGroup) activity.getWindow().getDecorView(); RelativeLayout relativeLayout = new RelativeLayout(context); relativeLayout.setId(BUTTON_ID); relativeLayout.setLayoutParams( new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); relativeLayout.setPadding(0, getNotificationBarHeight(context), 0, 0); relativeLayout.addView(button); parentView.addView(relativeLayout); } public static void hideDismissHints(@NonNull Context context) { Activity activity = getActivity(context); if (activity == null) return; ViewGroup parentView = (ViewGroup) activity.getWindow().getDecorView(); View button = parentView.findViewById(BUTTON_ID); if (button != null) parentView.removeView(button); } public static void bringDismissAllToFront(@NonNull Context context) { Activity activity = getActivity(context); if (activity == null) return; ViewGroup parentView = (ViewGroup) activity.getWindow().getDecorView(); View button = parentView.findViewById(BUTTON_ID); if (button != null) button.bringToFront(); } private static int getNotificationBarHeight(@NonNull Context context) { Rect rectangle = new Rect(); Activity activity = getActivity(context); if (activity == null) return 0; Window window = activity.getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rectangle); int statusBarHeight = rectangle.top; int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); return Math.abs(contentViewTop - statusBarHeight); } }