package com.kickstarter.libs.utils; import android.annotation.SuppressLint; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.kickstarter.R; import com.kickstarter.ui.views.AppRatingDialog; import com.kickstarter.ui.views.ConfirmDialog; import rx.functions.Action1; public final class ViewUtils { private ViewUtils() {} public static float getScreenDensity(final @NonNull Context context) { return context.getResources().getDisplayMetrics().density; } public static int getScreenHeightDp(final @NonNull Context context) { return context.getResources().getConfiguration().screenHeightDp; } public static int getScreenWidthDp(final @NonNull Context context) { return context.getResources().getConfiguration().screenWidthDp; } public static boolean isFontScaleLarge(final @NonNull Context context) { return context.getResources().getConfiguration().fontScale > 1.5f; } public static boolean isLandscape(final @NonNull Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } public static boolean isPortrait(final @NonNull Context context) { return !isLandscape(context); } /** * Set layout margins for a ViewGroup with LinearLayout parent. */ public static void setLinearViewGroupMargins(final @NonNull ViewGroup viewGroup, final int leftMargin, final int topMargin, final int rightMargin, final int bottomMargin) { final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(viewGroup.getLayoutParams()); layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); viewGroup.setLayoutParams(layoutParams); } /** * Set layout margins for a ViewGroup with RelativeLayout parent. */ public static void setRelativeViewGroupMargins(final @NonNull ViewGroup viewGroup, final int leftMargin, final int topMargin, final int rightMargin, final int bottomMargin) { final RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(viewGroup.getLayoutParams()); layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); viewGroup.setLayoutParams(layoutParams); } /** * Show a dialog box to the user. */ public static void showDialog(final @NonNull Context context, final @Nullable String title, final @NonNull String message) { new ConfirmDialog(context, title, message).show(); } public static void showDialog(final @NonNull Context context, final @Nullable String title, final @NonNull String message, final @NonNull String buttonMessage) { new ConfirmDialog(context, title, message, buttonMessage).show(); } public static void showRatingDialog(final @NonNull Context context) { new AppRatingDialog(context).show(); } /** * Opens the play store native app or the play store web site. */ public static void openStoreRating(final @NonNull Context context, final @NonNull String packageName) { final Intent intent = new Intent(Intent.ACTION_VIEW); try { // First try to load the play store native application final Uri marketUri = Uri.parse("market://details?id=" + packageName); intent.setData(marketUri); context.startActivity(intent); } catch (ActivityNotFoundException __) { // Fallback to the play store web site final Uri httpUri = Uri.parse("http://play.google.com/store/apps/details?id=" + packageName); intent.setData(httpUri); context.startActivity(intent); } } /** * Show a toast with default bottom gravity to the user. */ @SuppressLint("InflateParams") public static void showToast(final @NonNull Context context, final @NonNull String message) { final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View view = inflater.inflate(R.layout.toast, null); final TextView text = (TextView) view.findViewById(R.id.toast_text_view); text.setText(message); final Toast toast = new Toast(context); toast.setView(view); toast.show(); } @SuppressLint("InflateParams") public static void showToastFromTop(final @NonNull Context context, final @NonNull String message, final int xOffset, final int yOffset) { final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View view = inflater.inflate(R.layout.toast, null); final TextView text = (TextView) view.findViewById(R.id.toast_text_view); text.setText(message); final Toast toast = new Toast(context); toast.setView(view); toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, xOffset, yOffset); toast.show(); } public static Action1<String> showToast(final @NonNull Context context) { return (message) -> showToast(context, message); } /** * Sets the visiblity of a view to {@link View#VISIBLE} or {@link View#GONE}. Setting * the view to GONE removes it from the layout so that it no longer takes up any space. */ public static void setGone(final @NonNull View view, final boolean gone) { if (gone) { view.setVisibility(View.GONE); } else { view.setVisibility(View.VISIBLE); } } public static Action1<Boolean> setGone(final @NonNull View view) { return (gone) -> setGone(view, gone); } /** * Sets the visiblity of a view to {@link View#VISIBLE} or {@link View#INVISIBLE}. Setting * the view to INVISIBLE makes it hidden, but it still takes up space. */ public static void setInvisible(final @NonNull View view, final boolean hidden) { if (hidden) { view.setVisibility(View.INVISIBLE); } else { view.setVisibility(View.VISIBLE); } } public static Action1<Boolean> setInvisible(final @NonNull View view) { return (invisible) -> setInvisible(view, invisible); } }