Example usage for android.support.v4.os ResultReceiver ResultReceiver

List of usage examples for android.support.v4.os ResultReceiver ResultReceiver

Introduction

In this page you can find the example usage for android.support.v4.os ResultReceiver ResultReceiver.

Prototype

ResultReceiver(Parcel in) 

Source Link

Usage

From source file:com.vonglasow.michael.satstat.utils.PermissionHelper.java

/**
 * Requests permissions to be granted to this application.
 * /*from  w w  w .  j a  v a2 s.  co m*/
 * This method is a wrapper around
 * {@link android.support.v4.app.ActivityCompat#requestPermissions(android.app.Activity, String[], int)}
 * which works in a similar way, except it can be called from non-activity contexts. When called, it
 * displays a notification with a customizable title and text. When the user taps the notification, an
 * activity is launched in which the user is prompted to allow or deny the request.
 * 
 * After the user has made a choice,
 * {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}
 * is called, reporting whether the permissions were granted or not.
 * 
 * @param context The context from which the request was made. The context supplied must implement
 * {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback} and will receive the
 * result of the operation.
 * @param permissions The requested permissions
 * @param requestCode Application specific request code to match with a result reported to
 * {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}
 * @param notificationTitle The title for the notification
 * @param notificationText The text for the notification
 * @param notificationIcon Resource identifier for the notification icon
 */
public static <T extends Context & OnRequestPermissionsResultCallback> void requestPermissions(final T context,
        String[] permissions, int requestCode, String notificationTitle, String notificationText,
        int notificationIcon) {
    ResultReceiver resultReceiver = new ResultReceiver(new Handler(Looper.getMainLooper())) {
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            String[] outPermissions = resultData.getStringArray(Const.KEY_PERMISSIONS);
            int[] grantResults = resultData.getIntArray(Const.KEY_GRANT_RESULTS);
            context.onRequestPermissionsResult(resultCode, outPermissions, grantResults);
        }
    };

    Intent permIntent = new Intent(context, PermissionRequestActivity.class);
    permIntent.putExtra(Const.KEY_RESULT_RECEIVER, resultReceiver);
    permIntent.putExtra(Const.KEY_PERMISSIONS, permissions);
    permIntent.putExtra(Const.KEY_REQUEST_CODE, requestCode);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addNextIntent(permIntent);

    PendingIntent permPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setSmallIcon(notificationIcon)
            .setContentTitle(notificationTitle).setContentText(notificationText).setOngoing(true)
            //.setCategory(Notification.CATEGORY_STATUS)
            .setAutoCancel(true).setWhen(0).setContentIntent(permPendingIntent).setStyle(null);

    NotificationManager notificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(requestCode, builder.build());
}

From source file:net.sf.xfd.provider.PublicProvider.java

final boolean checkAccess(Uri uri, String grantMode, String necessaryMode) {
    try {/*from  w  ww.  j a  v  a  2s .co m*/
        verifyMac(uri, grantMode, necessaryMode);

        return true;
    } catch (FileNotFoundException fnfe) {
        final Context context = getContext();

        assert context != null;

        ObjectIntMap<String> decisions = null;

        final String caller = getCallingPackage();

        if (!TextUtils.isEmpty(caller)) {
            decisions = accessCache.get(uri.getPath());
            if (decisions == null) {
                decisions = new ObjectIntHashMap<>();
            } else {
                //noinspection SynchronizationOnLocalVariableOrMethodParameter
                synchronized (decisions) {
                    final int decision = decisions.get(caller);

                    switch (decision) {
                    case RESPONSE_ALLOW:
                        return true;
                    }
                }
            }
        }

        final ArrayBlockingQueue<Bundle> queue = new ArrayBlockingQueue<>(1);

        //noinspection RestrictedApi
        final ResultReceiver receiver = new ResultReceiver(new Handler(Looper.getMainLooper())) {
            @Override
            protected void onReceiveResult(int resultCode, Bundle resultData) {
                try {
                    queue.offer(resultData, 4, TimeUnit.SECONDS);
                } catch (InterruptedException ignored) {
                }
            }
        };

        try {
            final Intent intent = authActivityIntent(context);

            if (intent == null)
                return false;

            final Bundle result;

            final CharSequence resolved = base.resolve(uri.getPath());

            // try to ensure, that no more than one dialog can appear at once
            uxLock.lockInterruptibly();
            try {
                context.startActivity(intent.putExtra(EXTRA_MODE, necessaryMode).putExtra(EXTRA_CALLER, caller)
                        .putExtra(EXTRA_UID, Binder.getCallingUid()).putExtra(EXTRA_CALLBACK, receiver)
                        .putExtra(EXTRA_PATH, resolved));

                result = queue.poll(10, TimeUnit.SECONDS);
            } finally {
                uxLock.unlock();
            }

            int decision = RESPONSE_DENY;

            if (result != null) {
                decision = result.getInt(EXTRA_RESPONSE, -1);
            }

            if (decision == RESPONSE_ALLOW) {
                if (decisions != null) {
                    //noinspection SynchronizationOnLocalVariableOrMethodParameter
                    synchronized (decisions) {
                        decisions.put(caller, RESPONSE_ALLOW);

                        accessCache.put(uri.getPath(), decisions);
                    }
                }

                return true;
            }
        } catch (InterruptedException ignored) {
        }
    }

    return false;
}