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'
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'

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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

View File

@ -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>