AppUtil


import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Environment;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.support.design.widget.Snackbar;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class AppUtil implements AppConstansts {

    private Context mContext;

    public AppUtil(Context Context) {
        mContext = Context;
    }

    /***
     * Check if the Email is valid or not
     *
     * @param email
     * @return
     */
    public boolean isEmailValid(String email) {
        String regExpn = "^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@"
                + "((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?"
                + "[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\."
                + "([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?"
                + "[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"
                + "([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$";

        CharSequence inputStr = email;

        Pattern pattern = Pattern.compile(regExpn, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(inputStr);

        if (matcher.matches()) {
            return true;
        } else {
            return false;
        }
    }

    /***
     * Display snack bar for network error
     *
     * @param View
     */
    public void displayNoInternetSnackBar(View View, final AppCallbackListener listener) {
        final Snackbar snackbar = Snackbar
                .make(View, "No internet connection!", Snackbar.LENGTH_LONG);

        snackbar.setAction("RETRY", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                snackbar.dismiss();
                listener.onAppCallback(AppConstansts.SNACKBAR_RETRY);
            }
        });

        // Changing message text color
        snackbar.setActionTextColor(Color.RED);

        // Changing action button text color
        View sbView = snackbar.getView();
        TextView textView = (TextView) sbView.findViewById
        (android.support.design.R.id.snackbar_text);
        textView.setTextColor(mContext.getResources().getColor(R.color.app_color));
        snackbar.show();
    }

    /***
     * Display snack bar for network error
     *
     * @param View
     */
    public void displayNoInternetSnackBar(View View) {
        Snackbar snackbar = Snackbar
                .make(View, "No internet connection!", Snackbar.LENGTH_LONG)
                /*.setAction("RETRY", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                    }
                })*/;

        // Changing message text color
        snackbar.setActionTextColor(Color.RED);

        // Changing action button text color
        android.view.View sbView = snackbar.getView();
        TextView textView = (TextView) 
     sbView.findViewById(android.support.design.R.id.snackbar_text);
        textView.setTextColor(Color.YELLOW);
        snackbar.show();
    }

    /***
     * Display message
     *
     * @param view
     * @param Message
     */
    public static void displaySnackBarWithMessage(View view, String Message) {
        Snackbar.make(view, Message, Snackbar.LENGTH_LONG).show();
    }

    public static void displayToastWithMessage(Context context, String Message) {
        Toast.makeText(context, Message, Toast.LENGTH_LONG).show();
    }

    /***
     * @param ctx
     * @param Message
     */
    public void displayAlertDailog(Context ctx, String Message) {
        AlertDialog.Builder builder =
                new AlertDialog.Builder(ctx, R.style.AppCompatAlertDialogStyle);
        builder.setMessage(Message);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {

            }
        });
        //builder.setNegativeButton("Cancel", null);
        builder.show();
    }

    /***
     * To check the internet connection
     *
     * @return
     */
    public boolean getConnectionState() {
        ConnectivityManager cm = (ConnectivityManager) mContext
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();

        if (ni == null)
            return false;
        else
            return true;
    }

    /***
     * Display Alert Message
     *
     * @param Msg
     */
    public void displayAlert(String Msg) {

        AlertDialog.Builder myAlertDialog 
    = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle);
        myAlertDialog.setTitle(R.string.app_name);
        myAlertDialog.setMessage(Msg);
        myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                // do something when the OK button is clicked

            }
        });

        myAlertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) { // do something


            }
        });

        myAlertDialog.show();
    }

    /***
     * get Hash Key
     */
    public void getKeyHash() {
        PackageInfo info = null;
        try {
            info = mContext.getPackageManager().getPackageInfo(
                    mContext.getPackageName(), PackageManager.GET_SIGNATURES);
        } catch (PackageManager.NameNotFoundException e1) {
            e1.printStackTrace();
            ErrorLog.SaveErrorLog(e1);
        }
        for (android.content.pm.Signature signature : info.signatures) {
            MessageDigest md = null;
            try {
                md = MessageDigest.getInstance("SHA");
            } catch (NoSuchAlgorithmException e1) {
                e1.printStackTrace();
                ErrorLog.SaveErrorLog(e1);
            }
            md.update(signature.toByteArray());
            Log.d("KeyHash:",
                    Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    }

    /***
     * Get the device unique id
     *
     * @return
     */
    public String getDeviceID() {
        String AndroidId = null;
        try {
            AndroidId = Settings.Secure.getString(mContext.getContentResolver(),
                    Settings.Secure.ANDROID_ID);
        } catch (Exception e) {
            e.printStackTrace();
            ErrorLog.SaveErrorLog(e);
        } finally {
            return AndroidId;
        }

    }

    /***
     * Get Applicaiton version name
     *
     * @return
     */
    public String getAppVersionName() {
        String VersionName = "";
        try {
            PackageInfo pInfo = mContext.getPackageManager().
                    getPackageInfo(mContext.getPackageName(), 0);
            VersionName = pInfo.versionName;
        } catch (Exception e) {
            e.printStackTrace();
            ErrorLog.SaveErrorLog(e);
        } finally {
            return VersionName;
        }
    }


    /***
     * Get Applicaiton version Code
     *
     * @return
     */
    public int getAppVersionCode() {
        int VersionID = 1;
        try {
            PackageInfo pInfo = mContext.getPackageManager().
                    getPackageInfo(mContext.getPackageName(), 0);
            VersionID = pInfo.versionCode;
        } catch (Exception e) {
            e.printStackTrace();
            ErrorLog.SaveErrorLog(e);
        } finally {
            return VersionID;
        }
    }

    /***
     * Convert the local time to UTC
     *
     * @return
     */
    public String getUTCTime() {
        String lv_dateFormateInUTC = ""; //Will hold the final converted date
        try {

            SimpleDateFormat lv_formatter = new SimpleDateFormat("dd/MM/yy hh:mm a");
            lv_formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
            lv_dateFormateInUTC = lv_formatter.format(new Date());
            Log.v("", "UTC TIme == " + lv_dateFormateInUTC);
        } catch (Exception e) {
            e.printStackTrace();
            ErrorLog.SaveErrorLog(e);
        }
        return lv_dateFormateInUTC;
    }

    /***
     * Convert the UTC time to local
     *
     * @return
     */
    /*public String convertUTCToLocalTime(SimpleDateFormat simpleDateFormat, String strDate) {
        String LocalDate = null;
        try {
            simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date myDate = simpleDateFormat.parse(strDate);
            LocalDate = myDate.toString();
        } catch (Exception e) {
            e.printStackTrace();
            ErrorLog.SaveErrorLog(e);
        }
        return LocalDate;


    }*/

    /***
     * Convert UTC time to local time
     * @param Date
     * @return
     */
    public String convertUTCToLocalTime(SimpleDateFormat format, String Date){
        String strDate = Date;
        try{

            //SimpleDateFormat format = new SimpleDateFormat("MM-dd-yy hh:mm:ss");
            java.util.Date newDate = format.parse(Date);
            strDate = format.format(newDate);

            //Convert UTC to Local
            format.setTimeZone(TimeZone.getTimeZone("UTC"));
            java.util.Date myDate = format.parse(strDate);
            strDate = myDate.toString();

            SimpleDateFormat formatDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
            newDate = formatDate.parse(strDate);

            format = new SimpleDateFormat("MM-dd-yy HH:mm:ss");
            strDate = format.format(newDate);

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

    /***
     * Check if video is downloaded on sdcard or not
     *
     * @param URL
     * @return
     */
    public boolean isVideoDownload(String URL) {
        boolean status = false;
        File dir = new File(Environment.getExternalStorageDirectory() + "/"
                + mContext.getResources().getString(R.string.app_name) + "/" + URL);
        if (dir.exists()) {
            status = true;
        }
        return status;
    }


    /***
     * Check if video is avilable in extermal memory card
     *
     * @param URL
     * @return
     */
    public boolean isVideoAvialableInMemoryCard(String URL) {
        boolean status = false;
        File dir = new File(System.getenv("SECONDARY_STORAGE") + "/"
                + mContext.getResources().getString(R.string.app_name) + "/" + URL);
        if (dir.exists()) {
            status = true;
        }
        return status;
    }


    /***
     * Encrpt the Text
     *
     * @param Text
     * @return
     * @throws GeneralSecurityException
     *//*
    public static String encrypt(String Text) throws GeneralSecurityException {

        try {
            SecretKeySpec secretKeySpec = new SecretKeySpec(ENCRPYT_KEY.getBytes(), ALGORITHM);
            Cipher cipherAES = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipherAES.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            byte[] cipherText = cipherAES.doFinal(Text.getBytes());
            return new String(Base64.encode(cipherText, Base64.DEFAULT)).trim();
        } catch (Exception e) {
            e.printStackTrace();
            ErrorLog.SaveErrorLog(e);
        }
        return null;

    }


    *//***
     * Decrypt the message
     *
     * @param encryptedText
     * @return
     * @throws GeneralSecurityException
     *//*
    public static String decrypt(byte[] encryptedText) throws GeneralSecurityException {

        SecretKey secret_key = new SecretKeySpec(ENCRPYT_KEY.getBytes(), ALGORITHM);

        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, secret_key);

        encryptedText = Base64.decode(encryptedText, Base64.DEFAULT);// = cipher.doFinal(encryptedText);
        byte[] decrypted = cipher.doFinal(encryptedText);
        return new String(decrypted).trim();
    }


    private static String convertBinary2Hexadecimal(byte[] bytes) {
        char[] hexArray = "0123456789ABCDEF".toCharArray();
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }

    *//***
     * @param data
     * @return
     *//*
    public static String bytesToHex(byte[] data) {

        if (data == null)
            return null;

        String str = "";

        for (int i = 0; i < data.length; i++) {
            if ((data[i] & 0xFF) < 16)
                str = str + "0" + java.lang.Integer.toHexString(data[i] & 0xFF);
            else
                str = str + java.lang.Integer.toHexString(data[i] & 0xFF);
        }

        return str;

    }*/

    /***
     * Insert UTC date Time to when the app open from Navigation Screen
     */
    public void lastOpenApp(Context mContext){
        try{
            SharedPrefrences mSharedPref = new SharedPrefrences(mContext);
            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy hh:mm a");
            Date UTCDateTime = format.parse(getUTCTime());
            String strUTCDateTime = format.format(UTCDateTime);
            mSharedPref.setPreferences(mSharedPref.LAST_APP_OPEN_DATE, strUTCDateTime);
        }
        catch (Exception e){

        }
    }

    /**
     * Check if the user login has a
     * @return
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    public boolean isOwnerUser(){
        boolean isSecondaryUser = false;
        if(android.os.Build.VERSION.SDK_INT >= 17) {
            UserHandle uh = android.os.Process.myUserHandle();
            UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
            if(null != um)
            {
                long userSerialNumber = um.getSerialNumberForUser(uh);
                Log.d("USer Serial Number", "userSerialNumber = " + userSerialNumber);
                isSecondaryUser = true;
                return 0 == userSerialNumber;


            }
            else
                isSecondaryUser =  false;
        }
        else {
            // Do something regular
        }
        return isSecondaryUser;
    }


    /***
     * Check if the application is downloaded from play store or not
     * @param context
     * @return
     */
    public static boolean isDownloadedFromPlayStore(Context context) {
        boolean result = false;

        try {
            String installer = context.getPackageManager()
                    .getInstallerPackageName(context.getPackageName());
            result = !TextUtils.isEmpty(installer);
        } catch (Throwable e) {
        }

        return result;
    }
}