Back to project page Calma.
The source code is released under:
Apache License
If you think the Android project Calma listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
/* * Copyright (C) 2013 Thomas Schmid//from w w w . j a v a 2 s . com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package com.scto.android.calma.utils; import com.scto.android.calma.R; import com.scto.android.calma.utils.PreferenceUtils; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.AsyncTask; import android.os.Build; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.WindowManager; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.webkit.WebView; import android.widget.Toast; import java.lang.ref.WeakReference; import java.util.List; /** * Mostly general and UI helpers. * * @author Thomas Schmid(tschmid35@gmail.com) */ public final class CalmaUtils { private static Point mScreenSize = new Point(); /* This class is never initiated */ public CalmaUtils() { } /** * Used to determine if the device is running Froyo or greater * * @return True if the device is running Froyo or greater, false otherwise */ public static final boolean hasFroyo() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO; } /** * Used to determine if the device is running Gingerbread or greater * * @return True if the device is running Gingerbread or greater, false * otherwise */ public static final boolean hasGingerbread() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD; } /** * Used to determine if the device is running Honeycomb or greater * * @return True if the device is running Honeycomb or greater, false * otherwise */ public static final boolean hasHoneycomb() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; } /** * Used to determine if the device is running Honeycomb-MR1 or greater * * @return True if the device is running Honeycomb-MR1 or greater, false * otherwise */ public static final boolean hasHoneycombMR1() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1; } /** * Used to determine if the device is running ICS or greater * * @return True if the device is running Ice Cream Sandwich or greater, * false otherwise */ public static final boolean hasICS() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; } /** * Used to determine if the device is running Jelly Bean or greater * * @return True if the device is running Jelly Bean or greater, false * otherwise */ public static final boolean hasJellyBean() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; } /** * Used to determine if the device is a tablet or not * * @param context The {@link Context} to use. * @return True if the device is a tablet, false otherwise. */ public static final boolean isTablet(final Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; } /** * Used to determine if the device is currently in landscape mode * * @param context The {@link Context} to use. * @return True if the device is in landscape mode, false otherwise. */ public static final boolean isLandscape(final Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } /** * Execute an {@link AsyncTask} on a thread pool * * @param forceSerial True to force the task to run in serial order * @param task Task to execute * @param args Optional arguments to pass to * {@link AsyncTask#execute(Object[])} * @param <T> Task argument type */ @SuppressLint("NewApi") public static <T> void execute(final boolean forceSerial, final AsyncTask<T, ?, ?> task, final T... args) { final WeakReference<AsyncTask<T, ?, ?>> taskReference = new WeakReference<AsyncTask<T, ?, ?>>( task); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.DONUT) { throw new UnsupportedOperationException( "This class can only be used on API 4 and newer."); } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB || forceSerial) { taskReference.get().execute(args); } else { taskReference.get().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, args); } } /** * Used to determine if there is an active data connection and what type of * connection it is if there is one * * @param context The {@link Context} to use * @return True if there is an active data connection, false otherwise. * Also, if the user has checked to only download via Wi-Fi in the * settings, the mobile data and other network connections aren't * returned at all */ public static final boolean isOnline(final Context context) { /* * This sort of handles a sudden configuration change, but I think it * should be dealt with in a more professional way. */ if (context == null) { return false; } boolean state = false; /* Monitor network connections */ final ConnectivityManager connectivityManager = (ConnectivityManager)context .getSystemService(Context.CONNECTIVITY_SERVICE); /* Wi-Fi connection */ final NetworkInfo wifiNetwork = connectivityManager .getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (wifiNetwork != null) { state = wifiNetwork.isConnectedOrConnecting(); } /* Mobile data connection */ final NetworkInfo mbobileNetwork = connectivityManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (mbobileNetwork != null) { state = mbobileNetwork.isConnectedOrConnecting(); } /* Other networks */ final NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); if (activeNetwork != null) { state = activeNetwork.isConnectedOrConnecting(); } return state; } /** * Display a {@link Toast} letting the user know what an item does when long * pressed. * * @param view The {@link View} to copy the content description from. */ public static void showCheatSheet(final View view) { final int[] screenPos = new int[2]; // origin is device display final Rect displayFrame = new Rect(); // includes decorations (e.g. // status bar) view.getLocationOnScreen(screenPos); view.getWindowVisibleDisplayFrame(displayFrame); final Context context = view.getContext(); final int viewWidth = view.getWidth(); final int viewHeight = view.getHeight(); final int viewCenterX = screenPos[0] + viewWidth / 2; final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; final int estimatedToastHeight = (int)(48 * context.getResources().getDisplayMetrics().density); final Toast cheatSheet = Toast.makeText(context, view.getContentDescription(), Toast.LENGTH_SHORT); final boolean showBelow = screenPos[1] < estimatedToastHeight; if (showBelow) { // Show below // Offsets are after decorations (e.g. status bar) are factored in cheatSheet.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, viewCenterX - screenWidth / 2, screenPos[1] - displayFrame.top + viewHeight); } else { // Show above // Offsets are after decorations (e.g. status bar) are factored in cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, viewCenterX - screenWidth / 2, displayFrame.bottom - screenPos[1]); } cheatSheet.show(); } /** * @param context The {@link Context} to use. * @return An {@link AlertDialog} used to show the open source licenses used * in Apollo. */ public static final AlertDialog createOpenSourceDialog(final Context context) { final WebView webView = new WebView(context); webView.loadUrl("file:///android_asset/licenses.html"); return new AlertDialog.Builder(context).setTitle(R.string.settings_open_source_licenses) .setView(webView) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int whichButton) { dialog.dismiss(); } }).create(); } /** * Runs a piece of code after the next layout run * * @param view The {@link View} used. * @param runnable The {@link Runnable} used after the next layout run */ @SuppressLint("NewApi") public static void doAfterLayout(final View view, final Runnable runnable) { final OnGlobalLayoutListener listener = new OnGlobalLayoutListener() { @SuppressWarnings("deprecation") @Override public void onGlobalLayout() { /* Layout pass done, unregister for further events */ if (hasJellyBean()) { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); } runnable.run(); } }; view.getViewTreeObserver().addOnGlobalLayoutListener(listener); } /** * Used to know if Calma was sent into the background * * @param context The {@link Context} to use */ public static final boolean isApplicationSentToBackground(final Context context) { final ActivityManager activityManager = (ActivityManager)context .getSystemService(Context.ACTIVITY_SERVICE); final List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1); if (!tasks.isEmpty()) { final ComponentName topActivity = tasks.get(0).topActivity; if (!topActivity.getPackageName().equals(context.getPackageName())) { return true; } } return false; } /** * Returns the size of the screen * * @param activity The {@link Activity} to use * @return Point where x=width and y=height */ public static Point getScreenSize(Activity activity) { if (activity != null) { WindowManager service = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); service.getDefaultDisplay().getSize(mScreenSize); } return mScreenSize; } /** * Fade in a view from startAlpha to endAlpha during duration milliseconds * @param view The {@link View} to use * @param startAlpha * @param endAlpha * @param duration */ public static void fadeIn(View view, float startAlpha, float endAlpha, long duration) { if (view.getVisibility() == View.VISIBLE) { return; } view.setVisibility(View.VISIBLE); Animation animation = new AlphaAnimation(startAlpha, endAlpha); animation.setDuration(duration); view.startAnimation(animation); } /** * Fade in a view with the default time * @param view The {@link View} to use */ public static void fadeIn(View view) { fadeIn(view, 0F, 1F, 400); // We disabled the button in fadeOut(), so enable it here. view.setEnabled(true); } /** * Fade in a view with the default time * @param view The {@link View} to use */ public static void fadeOut(View view) { if (view.getVisibility() != View.VISIBLE) return; // Since the button is still clickable before fade-out animation // ends, we disable the button first to block click. view.setEnabled(false); Animation animation = new AlphaAnimation(1F, 0F); animation.setDuration(400); view.startAnimation(animation); view.setVisibility(View.GONE); } /** * Converts the specified DP to PIXELS according to current screen density * @param context The {@link Context} to use * @param dp * @return */ public static float dpToPx(Context context, float dp) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); return (int) ((dp * displayMetrics.density) + 0.5); } }