|
5 | 5 | import android.content.Intent; |
6 | 6 | import android.content.IntentFilter; |
7 | 7 | import android.content.BroadcastReceiver; |
| 8 | +import android.content.pm.PackageManager; |
8 | 9 | import android.hardware.Sensor; |
9 | 10 | import android.hardware.SensorEvent; |
10 | 11 | import android.hardware.SensorEventListener; |
11 | 12 | import android.hardware.SensorManager; |
| 13 | +import android.Manifest.permission; |
12 | 14 | import android.media.AudioAttributes; |
13 | 15 | import android.media.AudioManager; |
14 | 16 | import android.media.MediaPlayer; |
|
19 | 21 | import android.os.Build; |
20 | 22 | import android.provider.Settings; |
21 | 23 | import android.support.annotation.Nullable; |
| 24 | +import android.support.v4.app.ActivityCompat; |
| 25 | +import android.support.v4.content.ContextCompat; |
22 | 26 | import android.util.Log; |
| 27 | +import android.util.SparseArray; |
23 | 28 | import android.view.KeyEvent; |
24 | 29 | import android.view.Window; |
25 | 30 | import android.view.WindowManager; |
26 | 31 |
|
27 | 32 | import com.facebook.react.bridge.Arguments; |
28 | 33 | import com.facebook.react.bridge.LifecycleEventListener; |
29 | 34 | import com.facebook.react.bridge.NativeModule; |
| 35 | +import com.facebook.react.bridge.Promise; |
30 | 36 | import com.facebook.react.bridge.ReactApplicationContext; |
31 | 37 | import com.facebook.react.bridge.ReactContext; |
32 | 38 | import com.facebook.react.bridge.ReactContextBaseJavaModule; |
|
40 | 46 | import java.io.File; |
41 | 47 | import java.util.Map; |
42 | 48 | import java.util.HashMap; |
| 49 | +import java.util.Random; |
43 | 50 |
|
44 | 51 | public class InCallManagerModule extends ReactContextBaseJavaModule implements LifecycleEventListener { |
45 | 52 | private static final String REACT_NATIVE_MODULE_NAME = "InCallManager"; |
46 | 53 | private static final String TAG = REACT_NATIVE_MODULE_NAME; |
47 | 54 | private static ReactApplicationContext reactContext; |
| 55 | + private final SparseArray<Promise> mRequestPermissionCodePromises; |
48 | 56 |
|
49 | 57 | // --- Screen Manager |
50 | 58 | private PowerManager mPowerManager; |
@@ -89,6 +97,8 @@ public class InCallManagerModule extends ReactContextBaseJavaModule implements L |
89 | 97 | private MyPlayerInterface mRingtone; |
90 | 98 | private MyPlayerInterface mRingback; |
91 | 99 | private MyPlayerInterface mBusytone; |
| 100 | + private String media = "audio"; |
| 101 | + private String recordPermission = "unknow"; |
92 | 102 |
|
93 | 103 | interface MyPlayerInterface { |
94 | 104 | public boolean isPlaying(); |
@@ -119,6 +129,7 @@ public InCallManagerModule(ReactApplicationContext _reactContext) { |
119 | 129 | audioUriMap.put("bundleRingtoneUri", bundleRingtoneUri); |
120 | 130 | audioUriMap.put("bundleRingbackUri", bundleRingbackUri); |
121 | 131 | audioUriMap.put("bundleBusytoneUri", bundleBusytoneUri); |
| 132 | + mRequestPermissionCodePromises = new SparseArray<Promise>(); |
122 | 133 | Log.d(TAG, "InCallManager initialized"); |
123 | 134 | } |
124 | 135 |
|
@@ -570,7 +581,8 @@ private static void sendEvent(final String eventName, @Nullable WritableMap para |
570 | 581 |
|
571 | 582 | @ReactMethod |
572 | 583 | public void start(final String media, final boolean auto, final String ringbackUriType) { |
573 | | - if (media.equals("video")) { |
| 584 | + this.media = media; |
| 585 | + if (this.media.equals("video")) { |
574 | 586 | defaultSpeakerOn = true; |
575 | 587 | } else { |
576 | 588 | defaultSpeakerOn = false; |
@@ -748,7 +760,7 @@ public void setSpeakerphoneOn(final boolean enable) { |
748 | 760 | * flag: Int |
749 | 761 | * 0: use default action |
750 | 762 | * 1: force speaker on |
751 | | - * 2: force speaker off |
| 763 | + * -1: force speaker off |
752 | 764 | */ |
753 | 765 | @ReactMethod |
754 | 766 | public void setForceSpeakerphoneOn(final int flag) { |
@@ -1311,6 +1323,105 @@ public boolean isPlaying() { |
1311 | 1323 | } |
1312 | 1324 | } |
1313 | 1325 |
|
| 1326 | + @ReactMethod |
| 1327 | + public void checkRecordPermission(Promise promise) { |
| 1328 | + Log.d(TAG, "RNInCallManager.checkRecordPermission(): enter"); |
| 1329 | + this._checkRecordPermission(); |
| 1330 | + if (this.recordPermission.equals("unknow")) { |
| 1331 | + Log.d(TAG, "RNInCallManager.checkRecordPermission(): failed"); |
| 1332 | + promise.reject(new Exception("checkRecordPermission failed")); |
| 1333 | + } else { |
| 1334 | + promise.resolve(this.recordPermission); |
| 1335 | + } |
| 1336 | + } |
| 1337 | + |
| 1338 | + public void _checkRecordPermission() { |
| 1339 | + String recordPermission = "unknow"; |
| 1340 | + if (ContextCompat.checkSelfPermission(this.reactContext, permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { |
| 1341 | + recordPermission = "granted"; |
| 1342 | + } else { |
| 1343 | + recordPermission = "denied"; |
| 1344 | + } |
| 1345 | + this.recordPermission = recordPermission; |
| 1346 | + Log.d(TAG, String.format("RNInCallManager.checkRecordPermission(): recordPermission=%s", this.recordPermission)); |
| 1347 | + } |
| 1348 | + |
| 1349 | + @ReactMethod |
| 1350 | + public void requestRecordPermission(Promise promise) { |
| 1351 | + Log.d(TAG, "RNInCallManager.requestRecordPermission(): enter"); |
| 1352 | + this._checkRecordPermission(); |
| 1353 | + if (!this.recordPermission.equals("granted")) { |
| 1354 | + Activity currentActivity = getCurrentActivity(); |
| 1355 | + if (currentActivity == null) { |
| 1356 | + this.recordPermission = recordPermission; |
| 1357 | + Log.d(TAG, "RNInCallManager.requestRecordPermission(): ReactContext doesn't hava any Activity attached."); |
| 1358 | + promise.reject(new Exception("requestRecordPermission(): currentActivity is not attached")); |
| 1359 | + } |
| 1360 | + int requestPermissionCode = getRandomInteger(1, 99999999); |
| 1361 | + while (mRequestPermissionCodePromises.get(requestPermissionCode, null) != null) { |
| 1362 | + requestPermissionCode = getRandomInteger(1, 99999999); |
| 1363 | + } |
| 1364 | + mRequestPermissionCodePromises.put(requestPermissionCode, promise); |
| 1365 | + /* |
| 1366 | + if (ActivityCompat.shouldShowRequestPermissionRationale(currentActivity, permission.RECORD_AUDIO)) { |
| 1367 | + showMessageOKCancel("You need to allow access to microphone for making call", new DialogInterface.OnClickListener() { |
| 1368 | + @Override |
| 1369 | + public void onClick(DialogInterface dialog, int which) { |
| 1370 | + ActivityCompat.requestPermissions(currentActivity, new String[] {permission.RECORD_AUDIO}, requestPermissionCode); |
| 1371 | + } |
| 1372 | + }); |
| 1373 | + return; |
| 1374 | + } |
| 1375 | + */ |
| 1376 | + ActivityCompat.requestPermissions(currentActivity, new String[] {permission.RECORD_AUDIO}, requestPermissionCode); |
| 1377 | + } else { |
| 1378 | + // --- already granted |
| 1379 | + promise.resolve(this.recordPermission); |
| 1380 | + } |
| 1381 | + } |
| 1382 | + |
| 1383 | + private static int getRandomInteger(int min, int max) { |
| 1384 | + if (min >= max) { |
| 1385 | + throw new IllegalArgumentException("max must be greater than min"); |
| 1386 | + } |
| 1387 | + Random random = new Random(); |
| 1388 | + return random.nextInt((max - min) + 1) + min; |
| 1389 | + } |
| 1390 | + |
| 1391 | + //@Override |
| 1392 | + protected void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { |
| 1393 | + Log.d(TAG, "RNInCallManager.onRequestPermissionsResult(): enter"); |
| 1394 | + Promise promise = mRequestPermissionCodePromises.get(requestCode, null); |
| 1395 | + mRequestPermissionCodePromises.delete(requestCode); |
| 1396 | + if (promise != null) { |
| 1397 | + |
| 1398 | + Map<String, Integer> permissionResultMap = new HashMap<String, Integer>(); |
| 1399 | + |
| 1400 | + for (int i = 0; i < permissions.length; i++) { |
| 1401 | + permissionResultMap.put(permissions[i], grantResults[i]); |
| 1402 | + } |
| 1403 | + |
| 1404 | + if (!permissionResultMap.containsKey(permission.RECORD_AUDIO)) { |
| 1405 | + Log.wtf(TAG, "RNInCallManager.onRequestPermissionsResult(): requested permission RECORD_AUDIO but did not appear"); |
| 1406 | + promise.reject("RECORD_AUDIO_PERMISSION_NOT_FOUND", "requested permission RECORD_AUDIO but did not appear"); |
| 1407 | + return; |
| 1408 | + } |
| 1409 | + |
| 1410 | + String recordPermission = "unknow"; |
| 1411 | + if (permissionResultMap.get(permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { |
| 1412 | + recordPermission = "granted"; |
| 1413 | + } else { |
| 1414 | + recordPermission = "denied"; |
| 1415 | + } |
| 1416 | + this.recordPermission = recordPermission; |
| 1417 | + promise.resolve(recordPermission); |
| 1418 | + } else { |
| 1419 | + //super.onRequestPermissionsResult(requestCode, permissions, grantResults); |
| 1420 | + Log.wtf(TAG, "RNInCallManager.onRequestPermissionsResult(): request code not found"); |
| 1421 | + promise.reject("PERMISSION_REQUEST_CODE_NOT_FOUND", "request code not found"); |
| 1422 | + } |
| 1423 | + } |
| 1424 | + |
1314 | 1425 | @Override |
1315 | 1426 | public void onHostResume() { |
1316 | 1427 | Log.d(TAG, "onResume()"); |
|
0 commit comments