2017年1月3日 星期二

No screenshot activity

public class NoScreenshotActivity extends Activity {@
Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (android.os.Build.VERSION.SDK_INT >=
android.os.Build.VERSION_CODES.HONEYCOMB) {
getWindow().setFlags(LayoutParams.FLAG_SECURE,
LayoutParams.FLAG_SECURE);
}
setContentView(R.layout.main);
}
}

Useful Utility method in Android

package pom.tryutillibrary;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.ColorStateList;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.app.AlertDialog;
import android.telephony.TelephonyManager;
import android.util.Base64;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.cert.CertificateException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import static android.content.Context.MODE_PRIVATE;

/**
 * Created by Roy.Leung on 4/1/17.
 */

public class Utility {
    public static boolean checkEmail(String email) {
        String rexRule = "([\\w-+]+(?:\\.[\\w-+]+)*@(?:[\\w-]+\\.)+[a-zA-Z]{2,7})";
        if (email.matches(rexRule))
            return true;
        else
            return false;
    }

    public static void showDialog(Context context, String title, String message, DialogInterface.OnClickListener onClickListener) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(message).setTitle(title);
// Add the buttons
        builder.setPositiveButton("OK", onClickListener);

        builder.setCancelable(false);
// Create the AlertDialog
        AlertDialog dialog = builder.create();
        dialog.show();

    }

    public static void showOneButtonDialog(Context context, String title, String message, String buttonText, DialogInterface.OnClickListener onClickListener) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(message).setTitle(title);
// Add the buttons
        builder.setPositiveButton(buttonText, onClickListener);

        builder.setCancelable(false);
// Create the AlertDialog
        AlertDialog dialog = builder.create();
        dialog.show();

    }

    public static void showTowButtonDialog(Context context, String title, String message, String leftButton, String rightButton,
                                           DialogInterface.OnClickListener rightOnClickListener,
                                           DialogInterface.OnClickListener leftOnClickListener) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(message).setTitle(title);
// Add the buttons
        builder.setPositiveButton(rightButton, rightOnClickListener);
        builder.setNegativeButton(leftButton, leftOnClickListener);

        builder.setCancelable(false);
// Create the AlertDialog
        AlertDialog dialog = builder.create();
        dialog.show();

    }

    public static String getDeviceID(Context context) {

        String deviceID = null;
        if (deviceID == null) {
            TelephonyManager tManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            deviceID = tManager.getDeviceId();
        }

        return deviceID;
    }

    public static String getDeviceModel() {
        return Build.MANUFACTURER + " - " + Build.MODEL;
    }

    public static String getDeviceOS() {
        return "Android";
    }

    public static String getAppVersion() {
        return BuildConfig.VERSION_CODE + "";
    }

    private static Bitmap resizeBitmap(Bitmap image, int maxWidth, int maxHeight) {
        if (maxHeight > 0 && maxWidth > 0) {
            int width = image.getWidth();
            int height = image.getHeight();
            float ratioBitmap = (float) width / (float) height;
            float ratioMax = (float) maxWidth / (float) maxHeight;

            int finalWidth = maxWidth;
            int finalHeight = maxHeight;
            if (ratioMax > 1) {
                finalWidth = (int) ((float) maxHeight * ratioBitmap);
            } else {
                finalHeight = (int) ((float) maxWidth / ratioBitmap);
            }
            image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true);
            return image;
        } else {
            return image;
        }
    }

    public static Bitmap decodeSampledBitmapFromUri(ContentResolver cr, Uri uri,
                                                    int reqWidth, int reqHeight) {


        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        try {
            BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);
            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);
        } catch (Exception ex) {
            return null;
        }
    }

    public static Bitmap getBitmapFromUri(Uri uri, Context context) {
        try {

            Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
            return bitmap;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }



    public static String formatTheDate(int day, int month, int year) {
//        return String.format("%02d/%02d/%04d", day, month, year);
        return String.format("%04d-%02d-%02d", year, month, day);

    }

    public static Bitmap scaleImageBitmap(String path, int imgWidth, int imgHeight) {
        Bitmap srcBitmap = null;

//        Configure.Log("scaleImageBitmap path: " + path);
        try {
            double ratio;

            srcBitmap = getBitmapFromPathWithHighQuality(path);

            double w = srcBitmap.getWidth();
            double h = srcBitmap.getHeight();

            // Determine the Image baseLength
            double baseLength = Math.max(w, h);

            if (w == baseLength && w > imgWidth) {
                // Scale Down the Image base on weight
                ratio = w / imgWidth;

                w = imgWidth;
                h = (int) (h / ratio);
            } else if (h == baseLength && h > imgHeight) {
                // Scale Down the Image base on height
                ratio = h / imgHeight;

                h = imgHeight;
                w = (int) (w / ratio);
            }

            srcBitmap = Bitmap.createScaledBitmap(srcBitmap, (int) w, (int) h, true);

        } catch (Exception ex) {
            ex.printStackTrace();
            srcBitmap = null;

//            Configure.Log("scaleImageBitmap fail!");
        }

        if (srcBitmap != null && !srcBitmap.isRecycled()) {
//            Configure.Log("scaledBitmap w: " + srcBitmap.getWidth());
//            Configure.Log("scaledBitmap h: " + srcBitmap.getHeight());
        }

        return srcBitmap;
    }

    public static Bitmap getBitmapFromPath(String path, int maxNumOfPixel) throws Exception {
        // GET IMAGE FROM THE PATH
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, opts);

        opts.inSampleSize = computeSampleSize(opts, -1, maxNumOfPixel);
        opts.inJustDecodeBounds = false;
        Bitmap bitmap = BitmapFactory.decodeFile(path, opts);

        int degree = getBitmapOrientation(path);
        if (degree != 0) {
            Matrix matrix = new Matrix();
            matrix.postRotate(degree);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        }

        return bitmap;
    }

    public static int getBitmapOrientation(String path) {
        int orientation = -1;
        int degree = 0;
        ExifInterface exif = null;

        try {
            exif = new ExifInterface(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (exif != null) {
            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
            if (orientation != -1) {
                // We only recognize a subset of orientation tag values.
                switch (orientation) {
                    case ExifInterface.ORIENTATION_NORMAL:
                        degree = 0;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        degree = 90;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        degree = 180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        degree = 270;
                        break;
                }

                // Configure.Log("orientation: " + orientation);
                // Configure.Log("degree: " + degree);
            }
        }
        return degree;
    }


    public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
        int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);

        int roundedSize;
        if (initialSize <= 8) {
            roundedSize = 1;
            while (roundedSize < initialSize) {
                roundedSize <<= 1;
            }
        } else {
            roundedSize = (initialSize + 7) / 8 * 8;
        }

        return roundedSize;
    }

    private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
        double w = options.outWidth;
        double h = options.outHeight;

        int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
        int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength),
                Math.floor(h / minSideLength));

        if (upperBound < lowerBound) {
            // return the larger one when there is no overlapping zone.
            return lowerBound;
        }

        if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
            return 1;
        } else if (minSideLength == -1) {
            return lowerBound;
        } else {
            return upperBound;
        }
    }

    public static String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{
                        split[1]
                };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    public static Bitmap getBitmapFromPathWithHighQuality(String path) throws Exception {
        return getBitmapFromPath(path, 1500 * 1500);
    }


    public static Bitmap getBitmapFromUriAndRotateWithExif(Uri imageUri, Context context) {
        ExifInterface exif = null;
        Bitmap bitmap = null;
        try {
            bitmap = resizeBitmap(MediaStore.Images.Media.getBitmap(context.getContentResolver(), imageUri), 1024, 1024);
            String imagePath;

            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
                imagePath = Utility.getPath(context, imageUri);
            } else {
                File myFile = new File(imageUri.getPath());
                imagePath = myFile.getAbsolutePath();
            }

            exif = new ExifInterface(imagePath);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_UNDEFINED);


        return rotateBitmap(bitmap, orientation);
    }

    public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {

        Matrix matrix = new Matrix();
        switch (orientation) {
            case ExifInterface.ORIENTATION_NORMAL:
                return bitmap;
            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                matrix.setScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                matrix.setRotate(180);
                break;
            case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                matrix.setRotate(180);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_TRANSPOSE:
                matrix.setRotate(90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                matrix.setRotate(90);
                break;
            case ExifInterface.ORIENTATION_TRANSVERSE:
                matrix.setRotate(-90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                matrix.setRotate(-90);
                break;
            default:
                return bitmap;
        }
        try {
            Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            bitmap.recycle();
            return bmRotated;
        } catch (OutOfMemoryError e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String bitmapToBase64String(Bitmap bitmap) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOutputStream);
        byte[] byteArray = byteArrayOutputStream.toByteArray();

        return Base64.encodeToString(byteArray, Base64.DEFAULT);
    }

    public static String bitmapToBase64StringFromUri(Uri uri, Context context) {
        return bitmapToBase64String(getBitmapFromUriAndRotateWithExif(uri, context));
    }


    public static OkHttpClient getUnsafeOkHttpClient() {
        String fav = com.generali.hk.BuildConfig.FLAVOR;
        if (fav.equals("production")) {
            return new OkHttpClient();
        } else {
            try {
                // Create a trust manager that does not validate certificate chains
                final TrustManager[] trustAllCerts = new TrustManager[]{
                        new X509TrustManager() {
                            @Override
                            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                            }

                            @Override
                            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                            }

                            @Override
                            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                                return new java.security.cert.X509Certificate[]{};
                            }
                        }
                };

                // Install the all-trusting trust manager
                final SSLContext sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
                // Create an ssl socket factory with our all-trusting manager
                final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

                OkHttpClient.Builder builder = new OkHttpClient.Builder();
                builder.sslSocketFactory(sslSocketFactory);
                builder.hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });

                OkHttpClient okHttpClient = builder.build();
                return okHttpClient;
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }

    }

    public static void removeWebviewCacheDatabase(Context context) {
        try {
            boolean deleted1 = context.deleteDatabase("webview.db");
            boolean deleted2 = context.deleteDatabase("webviewCache.db");
        } catch (Exception e) {
        }


    }

    public static String convertDateFormat1To2(String targetDate, String dateFormat1, String dateFormat2) {
        SimpleDateFormat df1 = new SimpleDateFormat(dateFormat1);
        try {
            Date parsedDate = df1.parse(targetDate);
            return convertDateToStringENG(parsedDate, dateFormat2);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String convertDateToString(Date targetDate, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        String dateString = sdf.format(targetDate);
        return dateString;
    }

    public static String convertDateToStringENG(Date targetDate, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
        String dateString = sdf.format(targetDate);
        return dateString;
    }

    public static String convertMillisToDate(long milliSeconds, String dateFormat) {

        SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);


        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(milliSeconds);
        return formatter.format(calendar.getTime());
    }

    public static String convertMillisToDateEN(long milliSeconds, String dateFormat) {

        SimpleDateFormat formatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);


        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(milliSeconds);
        return formatter.format(calendar.getTime());
    }

    public static long getTimeDifferent(String start, String end, String format) {
        long startTime = 0;
        long endTime = 0;

        SimpleDateFormat df = new SimpleDateFormat(format);

        try {
            Date parsedDate1 = df.parse(start);
            Date parsedDate2 = df.parse(end);

            startTime = parsedDate1.getTime();
            endTime = parsedDate2.getTime();
        } catch (ParseException e) {

            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return endTime - startTime;
    }

    public static Bitmap getBitmapFromUriAndRotateWithExif(Context context, Uri imageUri) throws IOException {
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), imageUri);

        ExifInterface exif = null;

        File imageFile = new File(imageUri.getPath());
        String imagePath = imageFile.getAbsolutePath();
        try {
            exif = new ExifInterface(imagePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_UNDEFINED);


        return rotateBitmap(bitmap, orientation);
    }

    public static Bitmap getBitmapFromUri(Context context, Uri imageUri) throws IOException {
        return MediaStore.Images.Media.getBitmap(context.getContentResolver(), imageUri);
    }

    public static Bitmap resizeWeixinBmp(Bitmap bmp, int dWidth) {
        if (bmp == null)
            return null;

        int width = bmp.getWidth();
        int height = bmp.getHeight();
        float ratio = (float) height / width;
        int desiredWidth = dWidth;
        if (ratio > 2)
            desiredWidth = (int) (dWidth * 2 / ratio);

        Bitmap resizedBitmap = Bitmap.createScaledBitmap(bmp, desiredWidth, (int) (desiredWidth * ratio), false);
        return resizedBitmap;
    }

    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = (int) Math.ceil((float) height / (float) reqHeight);
            } else {
                inSampleSize = (int) Math.ceil((float) width / (float) reqWidth);
            }
        }

//        Utility.Log("Utility", "@calculateInSampleSize:" + inSampleSize);
        return inSampleSize;
    }

    public static int calculateInSampleSizeForMaxWidthHeight(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            int inSampleSize1 = (int) Math.ceil((float) height / (float) reqHeight);

            int inSampleSize2 = (int) Math.ceil((float) width / (float) reqWidth);

            inSampleSize = inSampleSize1 > inSampleSize2 ? inSampleSize1 : inSampleSize2;

        }

//        Utility.Log("Utility", "@calculateInSampleSize:" + inSampleSize);
        return inSampleSize;
    }

    public static Bitmap decodeBitmapFromInputStream(InputStream originalIS,
                                                     int reqWidth, int reqHeight) {

        Bitmap result;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        try {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = originalIS.read(buffer)) > -1) {
                baos.write(buffer, 0, len);
            }
            baos.flush();
        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }

        InputStream is1 = new ByteArrayInputStream(baos.toByteArray());
        InputStream is2 = new ByteArrayInputStream(baos.toByteArray());

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        try {
            BitmapFactory.decodeStream(is1, null, options);
            int width = options.outWidth;
            int height = options.outHeight;

            if (reqWidth < options.outWidth || reqHeight < options.outHeight) {
                options.inSampleSize = calculateInSampleSizeForMaxWidthHeight(options, reqWidth, reqHeight);

            }
            int size = options.inSampleSize;


            options.inJustDecodeBounds = false;

            Bitmap b = BitmapFactory.decodeStream(is2, null, options);


            if (size != 1) {


                if (width * reqHeight < height * reqWidth) {
                    result = Bitmap.createScaledBitmap(b, reqHeight * width / height, (int) (reqHeight), false);

                } else {
                    result = Bitmap.createScaledBitmap(b, reqWidth, (int) (height * reqWidth / width), false);
                }


                b.recycle();
            } else {
                result = b;
            }

        } catch (Exception e) {
            e.printStackTrace();
            result = null;
        } finally {
            try {

                if (is1 != null) {
                    is1.close();
                    is1 = null;
                }

                if (is2 != null) {
                    is2.close();
                    is2 = null;
                }

                baos = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        return result;

    }


    public static Intent getUrlIntentAction(Context context, String url) {


        Intent intent = null;

        if (url.startsWith("market:")) {
            intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        } else if (url.startsWith("sms:")) {
            String[] tempStringArray = url.split("\\:");
            intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:"));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (tempStringArray.length > 2) {
                intent.putExtra("address", tempStringArray[1]);
                intent.putExtra("sms_body", tempStringArray[2]);
            } else if (tempStringArray.length > 1) {
                intent.putExtra("address", tempStringArray[1]);
            }
            intent.setType("vnd.android-dir/mms-sms");

        } else if (url.startsWith("tel:")) {
            intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        } else if (url.startsWith("mailto:")) {
            intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/html");
            int colonIndex = url.indexOf(":") + 1;
            String mailString = url.substring(colonIndex);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra(Intent.EXTRA_EMAIL, new String[]{mailString});

        } else if (url.toLowerCase().startsWith("video:")) {
            int colonIndex = url.indexOf(":") + 1;
            String linkString = url.substring(colonIndex);

            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.parse(linkString), "video/*");

        } else if (url.toLowerCase().startsWith("activity:")) {
            int colonIndex = url.indexOf(":") + 1;
            String linkString = url.substring(colonIndex);

            intent = new Intent(Intent.ACTION_VIEW, Uri.parse(linkString));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        } else if (url.startsWith("https://play.google.com") || url.startsWith("http://play.google.com")) {
            String appId = getGooglePlayAppId(url);

            if (appId != null) {
                intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appId));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }

        } else if (url.startsWith("fb:")) {
            intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        } else if (url.startsWith("vnd.youtube:")) {
            intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        } else if (url.contains("youtube.com")) {
            String videoId = getYoutubeVideoId(url);

            if (videoId != null) {
                intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + videoId));
                intent.putExtra("VIDEO_ID", videoId);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
        }

        if (intent != null && !isIntentCanHandle(context, intent)) {
            intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }

        return intent;

    }

    static boolean isIntentCanHandle(Context context, Intent intent) {
        boolean canHandle = false;

        try {
            PackageManager manager = context.getPackageManager();
            List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0);
            if (infos.size() > 0) {
                canHandle = true;
            } else {
                canHandle = false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return canHandle;
    }

    public static String getYoutubeVideoId(String youtubeUrl) {
        // android.util.Log.d("getYoutubeVideoId", "youtubeUrl: " + youtubeUrl);
        String video_id = null;
        if (youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http")) {

            String expression = "^.*((youtu.be" + "\\/)"
                    + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*";
            CharSequence input = youtubeUrl;
            Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(input);
            if (matcher.matches()) {

                // for (int i = 0; i <= matcher.groupCount(); i++) {
                // android.util.Log.d("getYoutubeVideoId", i + " : " +
                // matcher.group(i));
                // }

                String groupIndex1 = matcher.group(matcher.groupCount());
                if (groupIndex1 != null && groupIndex1.length() == 11)
                    video_id = groupIndex1;
            }
        }
        return video_id;
    }

    public static float convertDipToPx(Context context, float dipValue) {
        float px = 0;

        if (context != null) {
            px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, context.getResources()
                    .getDisplayMetrics());
        }

        return px;
    }


    public static boolean isValidMobile(String mobile) {
        String regexStr = "^\\d{8}$";
        if (mobile.matches(regexStr)) {
            return true;
        }
        return false;
    }



    public static boolean saveImageToInternalCache(Context context, String imageName, Bitmap bitmap) {
        boolean success = false;
        FileOutputStream fos = null;

        File mydir = context.getDir(TEMP_IMGE_FOLDER, MODE_PRIVATE); //Creating an internal dir;
        if (!mydir.exists())
            mydir.mkdirs();

        File fileWithinMyDir = new File(mydir, imageName); //Getting a file within the dir.


        try {
            if (bitmap != null) {
                fos = new FileOutputStream(fileWithinMyDir);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

                fos.flush();
                fos.close();

                success = true;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return success;
    }


    public static boolean saveImageToFile(Context context, File file, Bitmap bitmap) {
        boolean success = false;
        FileOutputStream fos = null;

        file.mkdirs();

        if (file.exists())
            file.delete();


        try {
            if (bitmap != null) {
                fos = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

                fos.flush();
                fos.close();

                success = true;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return success;
    }

    public static void deleteAllInternalTempImages(Context context) throws IOException {

//        Context context = AppsApplication.getAppContext();

        File imageFile;

        File internalFileDir = context.getDir(TEMP_IMGE_FOLDER, MODE_PRIVATE);

        for (String intFileName : internalFileDir.list()) {
            imageFile = new File(internalFileDir, intFileName);

            if (imageFile.exists() && imageFile.toString().contains(".png")) {
                imageFile.delete();
            }
        }

    }


    public static Bitmap getImageFromCache(Context context, String imageName) {
        Bitmap bitmap = null;
        FileInputStream fis = null;

        try {
            fis = context.getApplicationContext().openFileInput(imageName);
            bitmap = BitmapFactory.decodeStream(fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    public static File createTemporaryFile(String part, String ext) throws Exception {
        File tempDir = Environment.getExternalStorageDirectory();
        tempDir = new File(tempDir.getAbsolutePath() + "/.temp/");
        if (!tempDir.exists()) {
            tempDir.mkdir();
        }
        return File.createTempFile(part, ext, tempDir);
    }

    public static boolean appInstalledOrNot(Context context, String uri) {
        PackageManager pm = context.getPackageManager();
        boolean app_installed;
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            app_installed = true;
        } catch (PackageManager.NameNotFoundException e) {
            app_installed = false;
        }
        return app_installed;
    }


    public static Point getTheScreenSize(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);

        return size;

    }

    public static void setAViewSize(View v, int width, int height) {


        LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width, height);
        v.setLayoutParams(parms);

    }

    public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) {
        final Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
        DrawableCompat.setTintList(wrappedDrawable, colors);
        return wrappedDrawable;
    }

    public static void clearAllTheBackStack(FragmentActivity fActivity) {
        FragmentManager fm = fActivity.getSupportFragmentManager();
        fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

    }

  /*  public static void setSpIsComeFromLoginFragment(Context context) {
        SharedPreferences.Editor editor = context.getSharedPreferences(StaticString.SP_NAME, MODE_PRIVATE).edit();
        editor.putBoolean(StaticString.SP_IS_FROM_PROPERTIES_LOFIN_FRAGMENT, true);
        editor.commit();
    }*/

   /* static public boolean getSpIsComeFromLoginFragment(Context context) {
        SharedPreferences sp = context.getSharedPreferences(StaticString.SP_NAME, MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        boolean answer = sp.getBoolean(StaticString.SP_IS_FROM_PROPERTIES_LOFIN_FRAGMENT, false);
        editor.putBoolean(StaticString.SP_IS_FROM_PROPERTIES_LOFIN_FRAGMENT, false);
        editor.commit();

        return answer;

    }*/

    static public String getVersionName(Context context) {
        PackageInfo pInfo = null;
        try {
            pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        String version = pInfo.versionName;
        return version;

    }

    /*public static void setNotificationOnatServer(Boolean on, Context context, final MainActivity acitivty) {
//        final ProgressHUD progress = ProgressHUD.show(context);
//        progress.show();
        OkHttpClient client = new OkHttpClient();
        String deviceID = acitivty.getDeviceID();
        FirebaseInstanceId firebase = FirebaseInstanceId.getInstance();
        if (firebase == null) {
            Utility.Log("firebase is null");
            return;
        }

        String token = FirebaseInstanceId.getInstance().getToken();
        if (token == null) {
            Utility.Log("Token is null");
            return;
        }
        Request request = new Request.Builder().url(ApiManagerForProperties.getNotificationSettingOnServerURL(on, deviceID, token)).build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("IOException", e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (acitivty == null)
                    return;

                Utility.Log(response.toString());
//                acitivty.runOnUiThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        progress.dismiss();
//
//                    }
//                });
            }
        });

    }*/

    public static Bitmap resizeBitmapCentralInside(Bitmap image, int maxWidth, int maxHeight) {
        if (maxHeight > 0 && maxWidth > 0) {
            int width = image.getWidth();
            int height = image.getHeight();
            float ratioBitmap = (float) width / (float) height;
            float ratioMax = (float) maxWidth / (float) maxHeight;

            int finalWidth = maxWidth;
            int finalHeight = maxHeight;
            if (ratioMax < 1) {
                finalWidth = (int) ((float) maxHeight * ratioBitmap);
            } else {
                finalHeight = (int) ((float) maxWidth / ratioBitmap);
            }
            image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, false);
            return image;
        } else {
            return image;
        }
    }




}

2016年11月26日 星期六

OKHTTP with RXJAVA

some RxJava information:

http://www.jianshu.com/p/52cd2d514528


Github:


https://github.com/roy989898/tryOKHTTP-withRXjava






2016年11月4日 星期五

The rule in layout

The rule in layout

should have 16dp space for the right side and left side

the not related(in different group) view show have at least 15dp*2  or more vertical space between them


the related(in same group) view show have 10dp vertical space between them

2016年10月1日 星期六

How to use okhttp get the json

How to use okhttp get the json
http://stackoverflow.com/questions/28221555/how-does-okhttp-get-json-string
Create the right object

gson = new Gson();


Build the request

HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.github.help").newBuilder();
urlBuilder.addQueryParameter("v", "1.0");
urlBuilder.addQueryParameter("user", "vogella");
String url = urlBuilder.build().toString();

Request request = new Request.Builder()
                     .url(url)
                     .build();








OKHTTP3 update UI

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onResponse(Call call, final Response response) throws IOException {
        // ... check for failure using `isSuccessful` before proceeding

        // Read data on the worker thread
        final String responseData = response.body().string();

        // Run view-related code back on the main thread
        MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {
                    TextView myTextView = (TextView) findViewById(R.id.myTextView);
                    myTextView.setText(responseData);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
       }
    }
});


Specifica view raitio

https://plus.google.com/+AndroidDevelopers/posts/ZQS29a5yroK


use Percent Support Library

Embeed the youtube into the APP

Youtube API way:
https://www.sitepoint.com/using-the-youtube-api-to-embed-video-in-an-android-app/


Not use Youtube API way:



Video


Youtube


No need use youtube api way:


Tutorial:


Webview