Browse Source

Permissions & fixes

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 7 năm trước cách đây
mục cha
commit
9ef1128b59

+ 3 - 2
app/build.gradle

@@ -126,7 +126,7 @@ dependencies {
     implementation 'com.github.bumptech.glide:glide:4.3.0'
     annotationProcessor 'com.github.bumptech.glide:compiler:4.3.0'
     implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.0@aar'
-    implementation 'org.webrtc:google-webrtc:1.0.+'
+    implementation 'org.webrtc:google-webrtc:1.0.21217'
     implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}"
 
     implementation 'com.evernote:android-job:1.2.0'
@@ -140,7 +140,8 @@ dependencies {
     implementation 'com.yarolegovich:lovelyinput:1.0.2'
     implementation 'com.yarolegovich:mp:1.0.8'
 
-    implementation 'ru.alexbykov:nopermission:1.1.1'
+    implementation 'me.zhanghai.android.effortlesspermissions:library:1.0.2'
+
     implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
 
     implementation 'com.github.Kennyc1012:BottomSheet:2.4.0'

+ 57 - 8
app/src/main/java/com/nextcloud/talk/activities/CallActivity.java

@@ -27,6 +27,7 @@ package com.nextcloud.talk.activities;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v7.app.AppCompatActivity;
 import android.text.TextUtils;
@@ -104,6 +105,9 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.functions.BooleanSupplier;
 import io.reactivex.schedulers.Schedulers;
+import me.zhanghai.android.effortlesspermissions.EffortlessPermissions;
+import me.zhanghai.android.effortlesspermissions.OpenAppDetailsDialogFragment;
+import pub.devrel.easypermissions.AfterPermissionGranted;
 
 @AutoInjector(NextcloudTalkApplication.class)
 public class CallActivity extends AppCompatActivity {
@@ -148,11 +152,18 @@ public class CallActivity extends AppCompatActivity {
     private UserEntity userEntity;
     private String callSession;
 
+    private VideoCapturer videoCapturerAndroid;
+
     private MediaStream localMediaStream;
 
     private String credentials;
     private List<MagicPeerConnectionWrapper> magicPeerConnectionWrapperList = new ArrayList<>();
 
+    private static final String[] PERMISSIONS_CALL = {
+            android.Manifest.permission.CAMERA,
+            android.Manifest.permission.RECORD_AUDIO
+    };
+
     private static int getSystemUiVisibility() {
         int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
         flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
@@ -181,7 +192,8 @@ public class CallActivity extends AppCompatActivity {
         credentials = ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken());
         initViews();
 
-        start();
+        checkPermissions();
+
     }
 
     private VideoCapturer createVideoCapturer() {
@@ -237,18 +249,36 @@ public class CallActivity extends AppCompatActivity {
 
     }
 
+    @AfterPermissionGranted(100)
+    private void checkPermissions() {
+        if (EffortlessPermissions.hasPermissions(this, PERMISSIONS_CALL)) {
+            start();
+        } else if (EffortlessPermissions.somePermissionPermanentlyDenied(this,
+                PERMISSIONS_CALL)) {
+            // Some permission is permanently denied so we cannot request them normally.
+            OpenAppDetailsDialogFragment.show(
+                    R.string.nc_permissions_permanently_denied,
+                    R.string.nc_permissions_settings , this);
+        } else {
+            EffortlessPermissions.requestPermissions(this, R.string.nc_permissions,
+                    100, PERMISSIONS_CALL);
+        }
+    }
+
     public void start() {
         //Initialize PeerConnectionFactory globals.
-        //Params are context, initAudio,initVideo and videoCodecHwAcceleration
-        PeerConnectionFactory.initializeAndroidGlobals(this, true, true,
-                false);
+        PeerConnectionFactory.InitializationOptions initializationOptions = PeerConnectionFactory.InitializationOptions
+                .builder(this)
+                .setEnableVideoHwAcceleration(false)
+                .createInitializationOptions();
+        PeerConnectionFactory.initialize(initializationOptions);
 
         //Create a new PeerConnectionFactory instance.
         PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
         peerConnectionFactory = new PeerConnectionFactory(options);
 
         //Now create a VideoCapturer instance. Callback methods are there if you want to do something! Duh!
-        VideoCapturer videoCapturerAndroid = createVideoCapturer();
+        videoCapturerAndroid = createVideoCapturer();
 
         //Create MediaConstraints - Will be useful for specifying video and audio constraints.
         audioConstraints = new MediaConstraints();
@@ -280,9 +310,7 @@ public class CallActivity extends AppCompatActivity {
             }
         });
 
-        Resources r = getResources();
-        int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120, r.getDisplayMetrics());
-        videoCapturerAndroid.startCapture(px, px, 30);
+        startVideoCapture();
 
         //create a videoRenderer based on SurfaceViewRenderer instance
         localRenderer = new VideoRenderer(fullScreenVideoView);
@@ -340,6 +368,12 @@ public class CallActivity extends AppCompatActivity {
                 });
     }
 
+    private void startVideoCapture() {
+        Resources r = getResources();
+        int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120, r.getDisplayMetrics());
+        videoCapturerAndroid.startCapture(px, px, 30);
+    }
+
     private void joinRoomAndCall() {
         ncApi.joinRoom(credentials, ApiHelper.getUrlForRoom(userEntity.getBaseUrl(), roomToken))
                 .subscribeOn(Schedulers.newThread())
@@ -755,12 +789,18 @@ public class CallActivity extends AppCompatActivity {
     public void onStart() {
         super.onStart();
         eventBus.register(this);
+        startVideoCapture();
     }
 
     @Override
     public void onStop() {
         super.onStop();
         eventBus.unregister(this);
+        try {
+            videoCapturer.stopCapture();
+        } catch (InterruptedException e) {
+            Log.e(TAG, "Failed to stop the capturing process");
+        }
     }
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
@@ -904,4 +944,13 @@ public class CallActivity extends AppCompatActivity {
 
         super.onConfigurationChanged(newConfig);
     }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+                                           @NonNull int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+
+        EffortlessPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults,
+                this);
+    }
 }

+ 9 - 25
app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java

@@ -20,7 +20,6 @@
 
 package com.nextcloud.talk.controllers;
 
-import android.Manifest;
 import android.app.SearchManager;
 import android.content.Context;
 import android.content.Intent;
@@ -83,7 +82,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
 import retrofit2.HttpException;
-import ru.alexbykov.nopermission.PermissionHelper;
 
 @AutoInjector(NextcloudTalkApplication.class)
 public class CallsListController extends BaseController implements SearchView.OnQueryTextListener,
@@ -390,29 +388,15 @@ public class CallsListController extends BaseController implements SearchView.On
     @Override
     public boolean onItemClick(int position) {
         if (callItems.size() > position) {
-
-            PermissionHelper permissionHelper = new PermissionHelper(getActivity());
-            permissionHelper.check(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
-                    .onSuccess(new Runnable() {
-                        @Override
-                        public void run() {
-                            overridePushHandler(new NoOpControllerChangeHandler());
-                            overridePopHandler(new NoOpControllerChangeHandler());
-                            CallItem callItem = callItems.get(position);
-                            Intent callIntent = new Intent(getActivity(), CallActivity.class);
-                            BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
-                            bundleBuilder.putString("roomToken", callItem.getModel().getToken());
-                            bundleBuilder.putParcelable("userEntity", Parcels.wrap(userEntity));
-                            callIntent.putExtras(bundleBuilder.build());
-                            startActivity(callIntent);
-                        }
-                    })
-                    .onDenied(new Runnable() {
-                        @Override
-                        public void run() {
-                        }
-                    })
-                    .run();
+            overridePushHandler(new NoOpControllerChangeHandler());
+            overridePopHandler(new NoOpControllerChangeHandler());
+            CallItem callItem = callItems.get(position);
+            Intent callIntent = new Intent(getActivity(), CallActivity.class);
+            BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
+            bundleBuilder.putString("roomToken", callItem.getModel().getToken());
+            bundleBuilder.putParcelable("userEntity", Parcels.wrap(userEntity));
+            callIntent.putExtras(bundleBuilder.build());
+            startActivity(callIntent);
         }
 
         return true;

+ 8 - 23
app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java

@@ -20,7 +20,6 @@
 
 package com.nextcloud.talk.controllers;
 
-import android.Manifest;
 import android.app.SearchManager;
 import android.content.Context;
 import android.content.Intent;
@@ -86,7 +85,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
 import retrofit2.HttpException;
-import ru.alexbykov.nopermission.PermissionHelper;
 
 @AutoInjector(NextcloudTalkApplication.class)
 public class ContactsController extends BaseController implements SearchView.OnQueryTextListener,
@@ -457,27 +455,14 @@ public class ContactsController extends BaseController implements SearchView.OnQ
 
                         @Override
                         public void onNext(RoomOverall roomOverall) {
-                            PermissionHelper permissionHelper = new PermissionHelper(getActivity());
-                            permissionHelper.check(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
-                                    .onSuccess(new Runnable() {
-                                        @Override
-                                        public void run() {
-                                            overridePushHandler(new NoOpControllerChangeHandler());
-                                            overridePopHandler(new NoOpControllerChangeHandler());
-                                            Intent callIntent = new Intent(getActivity(), CallActivity.class);
-                                            BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
-                                            bundleBuilder.putString("roomToken", roomOverall.getOcs().getData().getToken());
-                                            bundleBuilder.putParcelable("userEntity", Parcels.wrap(userEntity));
-                                            callIntent.putExtras(bundleBuilder.build());
-                                            startActivity(callIntent);
-                                        }
-                                    })
-                                    .onDenied(new Runnable() {
-                                        @Override
-                                        public void run() {
-                                        }
-                                    })
-                                    .run();
+                            overridePushHandler(new NoOpControllerChangeHandler());
+                            overridePopHandler(new NoOpControllerChangeHandler());
+                            Intent callIntent = new Intent(getActivity(), CallActivity.class);
+                            BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
+                            bundleBuilder.putString("roomToken", roomOverall.getOcs().getData().getToken());
+                            bundleBuilder.putParcelable("userEntity", Parcels.wrap(userEntity));
+                            callIntent.putExtras(bundleBuilder.build());
+                            startActivity(callIntent);
                         }
 
                         @Override

+ 6 - 0
app/src/main/res/values/strings.xml

@@ -76,5 +76,11 @@
     <string name="nc_one_contact_selected">contact selected</string>
     <string name="nc_more_contacts_selected">contacts selected</string>
 
+    <!-- Permissions -->
+    <string name="nc_permissions">We need certain permissions to establish a video call. Please click \"ALLOW\" in
+        the upcoming system dialog.</string>
+    <string name="nc_permissions_permanently_denied">We need certain permissions to establish a video call. Please
+        grant the \"Camera\" and  \"Record audio\" permission in system settings.</string>
+    <string name="nc_permissions_settings">Open settings</string>
 
 </resources>