[ 
https://issues.apache.org/jira/browse/CB-10963?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15212332#comment-15212332
 ] 

ASF GitHub Bot commented on CB-10963:
-------------------------------------

Github user jasongin commented on a diff in the pull request:

    https://github.com/apache/cordova-android/pull/285#discussion_r57485286
  
    --- Diff: framework/src/org/apache/cordova/CallbackMap.java ---
    @@ -0,0 +1,65 @@
    +/*
    +       Licensed to the Apache Software Foundation (ASF) under one
    +       or more contributor license agreements.  See the NOTICE file
    +       distributed with this work for additional information
    +       regarding copyright ownership.  The ASF licenses this file
    +       to you under the Apache License, Version 2.0 (the
    +       "License"); you may not use this file except in compliance
    +       with the License.  You may obtain a copy of the License at
    +
    +         http://www.apache.org/licenses/LICENSE-2.0
    +
    +       Unless required by applicable law or agreed to in writing,
    +       software distributed under the License is distributed on an
    +       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    +       KIND, either express or implied.  See the License for the
    +       specific language governing permissions and limitations
    +       under the License.
    +*/
    +package org.apache.cordova;
    +
    +import android.util.Pair;
    +import android.util.SparseArray;
    +
    +/**
    + * Provides a collection that maps unique request codes to CordovaPlugins 
and Integers.
    + * Used to ensure that when plugins make requests for runtime permissions, 
those requests do not
    + * collide with requests from other plugins that use the same request code 
value.
    + */
    +public class CallbackMap {
    +    private int currentCallbackId = 0;
    +    private SparseArray<Pair<CordovaPlugin, Integer>> callbacks;
    +
    +    public CallbackMap() {
    +        this.callbacks = new SparseArray<Pair<CordovaPlugin, Integer>>();
    +    }
    +
    +    /**
    +     * Stores a CordovaPlugin and request code and returns a new unique 
request code to use
    +     * in a permission request.
    +     *
    +     * @param receiver      The plugin that is making the request
    +     * @param requestCode   The original request code used by the plugin
    +     * @return              A unique request code that can be used to 
retrieve this callback
    +     *                      with getAndRemoveCallback()
    +     */
    +    public int registerCallback(CordovaPlugin receiver, int requestCode) {
    +        int mappedId = this.currentCallbackId++;
    --- End diff --
    
    Also then you'd need a collection tolerant of concurrency instead of 
SparseArray.


> cordova-android does not support multiple runtime permission requests
> ---------------------------------------------------------------------
>
>                 Key: CB-10963
>                 URL: https://issues.apache.org/jira/browse/CB-10963
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android
>         Environment: Marshmallow
>            Reporter: Richard B Knoll
>            Assignee: Richard B Knoll
>              Labels: android, reproduced, triaged
>
> If a plugin makes multiple permission requests before the user grants/denies 
> them, only the last one will get returned. More importantly, requests from 
> multiple plugins can interfere with each other.
> For example, if Plugin A makes a permission request and then Plugin B 
> immediately makes another permission request before the user grants/denies 
> Plugin A's request, then Plugin A will never receive the results of its 
> request (Android seems to return permission requests in reverse order of when 
> they were made, so Plugin B will actually get the correct result back).
> I've got a fix for this and will open a PR momentarily.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org
For additional commands, e-mail: issues-h...@cordova.apache.org

Reply via email to