Permissions & fixes

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2017-12-12 22:09:29 +01:00
parent d25a806063
commit 9ef1128b59
5 changed files with 83 additions and 58 deletions

View File

@ -126,7 +126,7 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:4.3.0' implementation 'com.github.bumptech.glide:glide:4.3.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.3.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.3.0'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.0@aar' 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 "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}"
implementation 'com.evernote:android-job:1.2.0' implementation 'com.evernote:android-job:1.2.0'
@ -140,7 +140,8 @@ dependencies {
implementation 'com.yarolegovich:lovelyinput:1.0.2' implementation 'com.yarolegovich:lovelyinput:1.0.2'
implementation 'com.yarolegovich:mp:1.0.8' 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 group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
implementation 'com.github.Kennyc1012:BottomSheet:2.4.0' implementation 'com.github.Kennyc1012:BottomSheet:2.4.0'

View File

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

View File

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

View File

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

View File

@ -76,5 +76,11 @@
<string name="nc_one_contact_selected">contact selected</string> <string name="nc_one_contact_selected">contact selected</string>
<string name="nc_more_contacts_selected">contacts 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> </resources>