// Path: CallMeter3G/src/main/java/de/ub0r/android/callmeter/CallMeter.java
// public final class CallMeter extends Application {
// 
//     private static final String TAG = "CallMeter";
// 
//     /**
//      * Minimum date.
//      */
//     public static final long MIN_DATE = 10000000000L;
// 
//     /**
//      * Milliseconds per seconds.
//      */
//     public static final long MILLIS = 1000L;
// 
//     /**
//      * 80.
//      */
//     public static final int EIGHTY = 80;
// 
//     /**
//      * 100.
//      */
//     public static final int HUNDRED = 100;
// 
//     /**
//      * Seconds of a minute.
//      */
//     public static final int SECONDS_MINUTE = 60;
// 
//     /**
//      * Seconds of a hour.
//      */
//     public static final int SECONDS_HOUR = 60 * SECONDS_MINUTE;
// 
//     /**
//      * Seconds of a day.
//      */
//     public static final int SECONDS_DAY = 24 * SECONDS_HOUR;
// 
//     /**
//      * 10.
//      */
//     public static final int TEN = 10;
// 
//     /**
//      * Bytes: kB.
//      */
//     public static final long BYTE_KB = 1024L;
// 
//     /**
//      * Bytes: MB.
//      */
//     public static final long BYTE_MB = BYTE_KB * BYTE_KB;
// 
//     /**
//      * Bytes: GB.
//      */
//     public static final long BYTE_GB = BYTE_MB * BYTE_KB;
// 
//     /**
//      * Bytes: TB.
//      */
//     public static final long BYTE_TB = BYTE_GB * BYTE_KB;
// 
//     @Override
//     public void onCreate() {
//         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
//             // fix AsyncTask for some old devices + broken gms
//             // http://stackoverflow.com/a/27239869/2331953
//             try {
//                 Class.forName("android.os.AsyncTask");
//             } catch (Throwable ignore) {
//             }
//         }
// 
//         super.onCreate();
//         Utils.setLocale(this);
//     }
// 
//     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
//     public static void setActivitySubtitle(final Activity a, final String t) {
//         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
//             a.getActionBar().setSubtitle(t);
//         }
//     }
// 
//     public static boolean hasPermission(final Context context, final String permission) {
//         return
//                 Build.VERSION.SDK_INT < Build.VERSION_CODES.M
//                         || ContextCompat.checkSelfPermission(context, permission)
//                         == PackageManager.PERMISSION_GRANTED;
//     }
// 
//     public static boolean hasPermissions(final Context context, final String... permissions) {
//         for (String p : permissions) {
//             if (!hasPermission(context, p)) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
//     public static boolean requestPermission(final Activity activity, final String permission,
//             final int requestCode, final int message,
//             final DialogInterface.OnClickListener onCancelListener) {
//         Log.i(TAG, "requesting permission: " + permission);
//         if (!hasPermission(activity, permission)) {
//             if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
//                 new AlertDialog.Builder(activity)
//                         .setTitle(R.string.permissions_)
//                         .setMessage(message)
//                         .setCancelable(false)
//                         .setNegativeButton(android.R.string.cancel, onCancelListener)
//                         .setPositiveButton(android.R.string.ok,
//                                 new DialogInterface.OnClickListener() {
//                                     @Override
//                                     public void onClick(final DialogInterface dialogInterface,
//                                             final int i) {
//                                         ActivityCompat.requestPermissions(activity,
//                                                 new String[]{permission}, requestCode);
//                                     }
//                                 })
//                         .show();
//             } else {
//                 ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
//             }
//             return false;
//         } else {
//             return true;
//         }
//     }
// }


import android.Manifest;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.ContactsContract.PhoneLookup;
import android.widget.TextView;
import de.ub0r.android.callmeter.CallMeter;
import de.ub0r.android.logg0r.Log;
        if (result == null) {
            return null;
        } else if (format == null) {
            NameCache.getInstance().put(number, result);
            return result;
        } else {
            NameCache.getInstance().put(number, result);
            return String.format(format, result);
        }
    }

    /**
     * Default constructor.
     *
     * @param context {@link Context}
     * @param number  phone number
     * @param format  format to format the {@link String} with
     * @param view    {@link TextView} to set the result on
     */
    public NameLoader(final Context context, final String number, final String format,
            final TextView view) {
        ctx = context;
        num = number;
        f = format;
        tv = view;
    }

    @Override
    protected String doInBackground(final Void... params) {
        String ret = null;
// Path: CallMeter3G/src/main/java/de/ub0r/android/callmeter/CallMeter.java
// public final class CallMeter extends Application {
// 
//     private static final String TAG = "CallMeter";
// 
//     /**
//      * Minimum date.
//      */
//     public static final long MIN_DATE = 10000000000L;
// 
//     /**
//      * Milliseconds per seconds.
//      */
//     public static final long MILLIS = 1000L;
// 
//     /**
//      * 80.
//      */
//     public static final int EIGHTY = 80;
// 
//     /**
//      * 100.
//      */
//     public static final int HUNDRED = 100;
// 
//     /**
//      * Seconds of a minute.
//      */
//     public static final int SECONDS_MINUTE = 60;
// 
//     /**
//      * Seconds of a hour.
//      */
//     public static final int SECONDS_HOUR = 60 * SECONDS_MINUTE;
// 
//     /**
//      * Seconds of a day.
//      */
//     public static final int SECONDS_DAY = 24 * SECONDS_HOUR;
// 
//     /**
//      * 10.
//      */
//     public static final int TEN = 10;
// 
//     /**
//      * Bytes: kB.
//      */
//     public static final long BYTE_KB = 1024L;
// 
//     /**
//      * Bytes: MB.
//      */
//     public static final long BYTE_MB = BYTE_KB * BYTE_KB;
// 
//     /**
//      * Bytes: GB.
//      */
//     public static final long BYTE_GB = BYTE_MB * BYTE_KB;
// 
//     /**
//      * Bytes: TB.
//      */
//     public static final long BYTE_TB = BYTE_GB * BYTE_KB;
// 
//     @Override
//     public void onCreate() {
//         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
//             // fix AsyncTask for some old devices + broken gms
//             // http://stackoverflow.com/a/27239869/2331953
//             try {
//                 Class.forName("android.os.AsyncTask");
//             } catch (Throwable ignore) {
//             }
//         }
// 
//         super.onCreate();
//         Utils.setLocale(this);
//     }
// 
//     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
//     public static void setActivitySubtitle(final Activity a, final String t) {
//         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
//             a.getActionBar().setSubtitle(t);
//         }
//     }
// 
//     public static boolean hasPermission(final Context context, final String permission) {
//         return
//                 Build.VERSION.SDK_INT < Build.VERSION_CODES.M
//                         || ContextCompat.checkSelfPermission(context, permission)
//                         == PackageManager.PERMISSION_GRANTED;
//     }
// 
//     public static boolean hasPermissions(final Context context, final String... permissions) {
//         for (String p : permissions) {
//             if (!hasPermission(context, p)) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
//     public static boolean requestPermission(final Activity activity, final String permission,
//             final int requestCode, final int message,
//             final DialogInterface.OnClickListener onCancelListener) {
//         Log.i(TAG, "requesting permission: " + permission);
//         if (!hasPermission(activity, permission)) {
//             if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
//                 new AlertDialog.Builder(activity)
//                         .setTitle(R.string.permissions_)
//                         .setMessage(message)
//                         .setCancelable(false)
//                         .setNegativeButton(android.R.string.cancel, onCancelListener)
//                         .setPositiveButton(android.R.string.ok,
//                                 new DialogInterface.OnClickListener() {
//                                     @Override
//                                     public void onClick(final DialogInterface dialogInterface,
//                                             final int i) {
//                                         ActivityCompat.requestPermissions(activity,
//                                                 new String[]{permission}, requestCode);
//                                     }
//                                 })
//                         .show();
//             } else {
//                 ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
//             }
//             return false;
//         } else {
//             return true;
//         }
//     }
// }


// Path: CallMeter3G/src/main/java/de/ub0r/android/callmeter/data/NameLoader.java
import android.Manifest;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.ContactsContract.PhoneLookup;
import android.widget.TextView;
import de.ub0r.android.callmeter.CallMeter;
import de.ub0r.android.logg0r.Log;

        if (result == null) {
            return null;
        } else if (format == null) {
            NameCache.getInstance().put(number, result);
            return result;
        } else {
            NameCache.getInstance().put(number, result);
            return String.format(format, result);
        }
    }

    /**
     * Default constructor.
     *
     * @param context {@link Context}
     * @param number  phone number
     * @param format  format to format the {@link String} with
     * @param view    {@link TextView} to set the result on
     */
    public NameLoader(final Context context, final String number, final String format,
            final TextView view) {
        ctx = context;
        num = number;
        f = format;
        tv = view;
    }

    @Override
    protected String doInBackground(final Void... params) {
        String ret = null;
        if (CallMeter.hasPermission(ctx, Manifest.permission.READ_CONTACTS)) {