mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-29 15:45:12 +01:00
Permissions & fixes
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
d25a806063
commit
9ef1128b59
@ -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'
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user