From 15586bc0cc47d100932e904df8d4ee35b8d0b489 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 11 Nov 2017 05:39:01 +0100 Subject: [PATCH] Much progress Signed-off-by: Mario Danic --- .idea/codeStyleSettings.xml | 229 +++++++++++++ app/build.gradle | 4 +- .../talk/activities/CallActivity.java | 304 ++++++++++++------ .../talk/activities/MainActivity.java | 6 +- .../java/com/nextcloud/talk/api/NcApi.java | 27 +- .../talk/api/helpers/api/ApiHelper.java | 5 + .../api/models/json/generic/GenericMeta.java | 2 +- .../models/json/participants/Participant.java | 3 + .../api/models/json/signaling/Signaling.java | 4 +- .../application/NextcloudTalkApplication.java | 1 + .../talk/controllers/CallsListController.java | 32 +- .../talk/controllers/SettingsController.java | 12 +- .../controllers/SwitchAccountController.java | 2 +- .../controllers/WebViewLoginController.java | 2 +- .../talk/controllers/base/BaseController.java | 1 + .../talk/dagger/modules/RestModule.java | 4 + .../talk/events/CertificateEvent.java | 3 +- .../talk/jobs/AccountRemovalJob.java | 8 +- .../nextcloud/talk/utils/DisplayHelper.java | 4 +- .../talk/utils/ErrorMessageHolder.java | 9 +- .../com/nextcloud/talk/utils/PushUtils.java | 3 +- .../talk/utils/database/user/UserUtils.java | 2 +- app/src/main/res/drawable/ic_logo.xml | 17 + .../controller_account_verification.xml | 2 +- .../main/res/layout/controller_generic_rv.xml | 2 +- .../layout/controller_server_selection.xml | 21 +- app/src/main/res/values/colors.xml | 6 +- app/src/main/res/values/setup.xml | 1 - app/src/main/res/values/styles.xml | 2 +- 29 files changed, 547 insertions(+), 171 deletions(-) create mode 100644 .idea/codeStyleSettings.xml create mode 100644 app/src/main/res/drawable/ic_logo.xml diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 000000000..a0ccdcbf2 --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,229 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 3263ee4e7..05b7c99ac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,8 +77,8 @@ dependencies { implementation 'com.bluelinelabs:conductor-support:2.1.4' implementation 'com.squareup.okhttp3:okhttp:3.9.0' - implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.6.0' - implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0' + implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.9.0' + implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0' implementation 'com.bluelinelabs:logansquare:1.3.7' annotationProcessor 'com.bluelinelabs:logansquare-compiler:1.3.7' diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 2e7b76bf6..c43da6c61 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -29,21 +29,27 @@ import android.content.res.Resources; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.util.TypedValue; import android.view.View; import android.view.Window; import android.view.WindowManager; +import com.bluelinelabs.logansquare.LoganSquare; import com.nextcloud.talk.R; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.api.helpers.api.ApiHelper; +import com.nextcloud.talk.api.models.json.call.CallOverall; +import com.nextcloud.talk.api.models.json.generic.GenericOverall; +import com.nextcloud.talk.api.models.json.participants.Participant; +import com.nextcloud.talk.api.models.json.signaling.NCMessageWrapper; +import com.nextcloud.talk.api.models.json.signaling.Signaling; import com.nextcloud.talk.api.models.json.signaling.SignalingOverall; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.persistence.entities.UserEntity; import com.nextcloud.talk.webrtc.MagicPeerConnectionObserver; import com.nextcloud.talk.webrtc.MagicSdpObserver; -import org.parceler.Parcels; import org.webrtc.AudioSource; import org.webrtc.AudioTrack; import org.webrtc.Camera1Enumerator; @@ -67,7 +73,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import io.reactivex.functions.BooleanSupplier; + import javax.inject.Inject; import autodagger.AutoInjector; @@ -76,6 +82,7 @@ import butterknife.ButterKnife; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; +import io.reactivex.functions.BooleanSupplier; import io.reactivex.schedulers.Schedulers; import ru.alexbykov.nopermission.PermissionHelper; @@ -91,10 +98,6 @@ public class CallActivity extends AppCompatActivity { @Inject NcApi ncApi; - - private String roomToken; - private UserEntity userEntity; - PeerConnectionFactory peerConnectionFactory; MediaConstraints audioConstraints; MediaConstraints videoConstraints; @@ -104,20 +107,25 @@ public class CallActivity extends AppCompatActivity { AudioSource audioSource; AudioTrack localAudioTrack; VideoCapturer videoCapturer; - VideoRenderer localRenderer; VideoRenderer remoteRenderer; - PeerConnection localPeer, remotePeer; - - boolean inCall = true; - - BooleanSupplier booleanSupplier = () -> inCall; - + boolean leavingCall = false; + BooleanSupplier booleanSupplier = () -> leavingCall; Disposable signalingDisposable; Disposable pingDisposable; - List iceServers; + private String roomToken; + private UserEntity userEntity; + private String callSession; + + private String credentials; + + private static int getSystemUiVisibility() { + int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; + flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + return flags; + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -135,8 +143,10 @@ public class CallActivity extends AppCompatActivity { ButterKnife.bind(this); roomToken = getIntent().getExtras().getString("roomToken", ""); - userEntity = Parcels.unwrap(getIntent().getExtras().getParcelable("userEntity")); + userEntity = getIntent().getExtras().getParcelable("userEntity"); + callSession = getIntent().getExtras().getString("callSession", ""); + credentials = ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()); initViews(); PermissionHelper permissionHelper = new PermissionHelper(this); @@ -157,8 +167,6 @@ public class CallActivity extends AppCompatActivity { } - - private VideoCapturer createVideoCapturer() { videoCapturer = createCameraCapturer(new Camera1Enumerator(false)); return videoCapturer; @@ -256,119 +264,202 @@ public class CallActivity extends AppCompatActivity { sdpConstraints.optional.add(new MediaConstraints.KeyValuePair("internalSctpDataChannels", "true")); sdpConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true")); + //creating localPeer + localPeer = peerConnectionFactory.createPeerConnection(iceServers, sdpConstraints, + new MagicPeerConnectionObserver() { + @Override + public void onIceCandidate(IceCandidate iceCandidate) { + super.onIceCandidate(iceCandidate); + onIceCandidateReceived(localPeer, iceCandidate); + } + }); + //creating local mediastream MediaStream stream = peerConnectionFactory.createLocalMediaStream("102"); stream.addTrack(localAudioTrack); stream.addTrack(localVideoTrack); localPeer.addStream(stream); - // Start pulling signaling messages - ncApi.pullSignalingMessages(ApiHelper.getCredentials(userEntity.getUsername(), - userEntity.getToken()), ApiHelper.getUrlForSignaling(userEntity.getBaseUrl())) + ncApi.joinRoom(credentials, ApiHelper.getUrlForJoinRoom(userEntity.getBaseUrl(), roomToken)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) - .repeatWhen(observable -> observable.delay(1500, TimeUnit.MILLISECONDS)) - .repeatUntil(booleanSupplier) - .retry(3) - .subscribe(new Observer() { + .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - signalingDisposable = d; + } @Override - public void onNext(SignalingOverall signalingOverall) { - if (signalingOverall.getOcs().getSignalings() != null) { - for (int i = 0; i < signalingOverall.getOcs().getSignalings().size(); i++) { - try { - receivedSignalingMessage(signalingOverall.getOcs().getSignalings().get(i)); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + public void onNext(CallOverall callOverall) { + ncApi.joinCall(credentials, + ApiHelper.getUrlForCall(userEntity.getBaseUrl(), roomToken)) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(GenericOverall genericOverall) { + callSession = callOverall.getOcs().getData().getSessionId(); + + // start pinging the call + ncApi.pingCall(ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()), + ApiHelper.getUrlForCallPing(userEntity.getBaseUrl(), roomToken)) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .repeatWhen(observable -> observable.delay(5000, TimeUnit.MILLISECONDS)) + .repeatUntil(booleanSupplier) + .retry(3) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + pingDisposable = d; + } + + @Override + public void onNext(GenericOverall genericOverall) { + + } + + @Override + public void onError(Throwable e) { + dispose(pingDisposable); + } + + @Override + public void onComplete() { + dispose(pingDisposable); + } + }); + + // Start pulling signaling messages + ncApi.pullSignalingMessages(ApiHelper.getCredentials(userEntity.getUsername(), + userEntity.getToken()), ApiHelper.getUrlForSignaling(userEntity.getBaseUrl())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .repeatWhen(observable -> observable.delay(1500, TimeUnit.MILLISECONDS)) + .repeatUntil(booleanSupplier) + .retry(3) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + signalingDisposable = d; + } + + @Override + public void onNext(SignalingOverall signalingOverall) { + if (signalingOverall.getOcs().getSignalings() != null) { + for (int i = 0; i < signalingOverall.getOcs().getSignalings().size(); i++) { + try { + receivedSignalingMessage(signalingOverall.getOcs().getSignalings().get(i)); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + @Override + public void onError(Throwable e) { + dispose(signalingDisposable); + } + + @Override + public void onComplete() { + dispose(signalingDisposable); + } + }); + + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); } @Override public void onError(Throwable e) { - dispose(signalingDisposable); + } @Override public void onComplete() { - dispose(signalingDisposable); + } }); + } - // start pinging the call - ncApi.pingCall(ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()), - ApiHelper.getUrlForCallPing(userEntity.getBaseUrl(), roomToken)) - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .repeatWhen(observable -> observable.delay(5000, TimeUnit.MILLISECONDS)) - .repeatUntil(booleanSupplier) - .retry(3) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - pingDisposable = d; - } + private void receivedSignalingMessage(Signaling signaling) throws IOException { + String messageType = signaling.getType(); - @Override - public void onNext(Void aVoid) { + if (leavingCall) { + return; + } - } - - @Override - public void onError(Throwable e) { - dispose(pingDisposable); - } - - @Override - public void onComplete() { - dispose(pingDisposable); - } - }); + if ("usersInRoom".equals(messageType)) { + processUsersInRoom((List) signaling.getMessageWrapper()); + } else if ("message".equals(messageType)) { + NCMessageWrapper ncSignalingMessage = LoganSquare.parse(signaling.getMessageWrapper().toString(), + NCMessageWrapper.class); + if (ncSignalingMessage.getSignalingMessage().getRoomType().equals("video")) { + switch (ncSignalingMessage.getSignalingMessage().getType()) { + case "offer": + break; + case "answer": + break; + case "candidate": + break; + default: + break; + } + } + } else { + Log.d(TAG, "Something went very very wrong"); + } + } + private void processUsersInRoom(List users) { } private void call() { - //creating localPeer - localPeer = peerConnectionFactory.createPeerConnection(iceServers, sdpConstraints, - new MagicPeerConnectionObserver() { - @Override - public void onIceCandidate(IceCandidate iceCandidate) { - super.onIceCandidate(iceCandidate); - onIceCandidateReceived(localPeer, iceCandidate); - } - }); //creating remotePeer remotePeer = peerConnectionFactory.createPeerConnection(iceServers, sdpConstraints, new MagicPeerConnectionObserver() { - @Override - public void onIceCandidate(IceCandidate iceCandidate) { - super.onIceCandidate(iceCandidate); - onIceCandidateReceived(remotePeer, iceCandidate); - } + @Override + public void onIceCandidate(IceCandidate iceCandidate) { + super.onIceCandidate(iceCandidate); + onIceCandidateReceived(remotePeer, iceCandidate); + } - public void onAddStream(MediaStream mediaStream) { - super.onAddStream(mediaStream); - gotRemoteStream(mediaStream); - } + public void onAddStream(MediaStream mediaStream) { + super.onAddStream(mediaStream); + gotRemoteStream(mediaStream); + } - @Override - public void onIceGatheringChange(PeerConnection.IceGatheringState iceGatheringState) { - super.onIceGatheringChange(iceGatheringState); + @Override + public void onIceGatheringChange(PeerConnection.IceGatheringState iceGatheringState) { + super.onIceGatheringChange(iceGatheringState); - } - }); + } + }); //creating Offer - localPeer.createOffer(new MagicSdpObserver(){ + localPeer.createOffer(new MagicSdpObserver() { @Override public void onCreateSuccess(SessionDescription sessionDescription) { //we have localOffer. Set it as local desc for localpeer and remote desc for remote peer. @@ -390,10 +481,9 @@ public class CallActivity extends AppCompatActivity { }, sdpConstraints); } - private void hangup() { - inCall = false; + leavingCall = true; dispose(null); @@ -413,6 +503,32 @@ public class CallActivity extends AppCompatActivity { pipVideoView.release(); fullScreenVideoView.release(); + + String credentials = ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()); + ncApi.leaveCall(credentials, ApiHelper.getUrlForCall(userEntity.getBaseUrl(), roomToken)) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(GenericOverall genericOverall) { + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); } private void gotRemoteStream(MediaStream stream) { @@ -444,14 +560,8 @@ public class CallActivity extends AppCompatActivity { @Override public void onDestroy() { - hangup(); super.onDestroy(); - } - - private static int getSystemUiVisibility() { - int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; - flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - return flags; + hangup(); } private void dispose(@Nullable Disposable disposable) { diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java index 0decb6b18..bbec64027 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java @@ -111,7 +111,7 @@ public final class MainActivity extends AppCompatActivity implements ActionBarPr } public void showCertificateDialog(X509Certificate cert, MagicTrustManager magicTrustManager, - @Nullable SslErrorHandler sslErrorHandler) { + @Nullable SslErrorHandler sslErrorHandler) { DateFormat formatter = DateFormat.getDateInstance(DateFormat.LONG); String validFrom = formatter.format(cert.getNotBefore()); String validUntil = formatter.format(cert.getNotAfter()); @@ -140,8 +140,8 @@ public final class MainActivity extends AppCompatActivity implements ActionBarPr issuedBy, issuedFor, validFrom, validUntil); new LovelyStandardDialog(this) - .setTopColorRes(R.color.darkRed) - .setNegativeButtonColorRes(R.color.darkRed) + .setTopColorRes(R.color.nc_darkRed) + .setNegativeButtonColorRes(R.color.nc_darkRed) .setPositiveButtonColorRes(R.color.colorPrimaryDark) .setIcon(R.drawable.ic_security_white_24dp) .setTitle(R.string.nc_certificate_dialog_title) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 41bfe1cc8..736d3d4fa 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -133,23 +133,30 @@ public interface NcApi { @GET Observable getPeersForCall(@Header("Authorization") String authorization, @Url String url); + @POST + Observable joinRoom(@Header("Authorization") String authorization, @Url String url); + + @DELETE + Observable leaveRoom(@Header("Authorization") String authorization, @Url String url); + /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken */ + @POST - Observable joinCall(@Header("Authorization") String authorization, @Url String url); + Observable joinCall(@Header("Authorization") String authorization, @Url String url); + + /* + Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken + */ + @DELETE + Observable leaveCall(@Header("Authorization") String authorization, @Url String url); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken/ping */ @POST - Observable pingCall(@Header("Authorization") String authorization, @Url String url); - - /* - Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken - */ - @DELETE - Observable leaveCall(@Header("Authorization") String authorization, @Url String url); + Observable pingCall(@Header("Authorization") String authorization, @Url String url); /* QueryMap items are as follows: @@ -220,7 +227,7 @@ public interface NcApi { */ @DELETE Observable unregisterDeviceForNotificationsWithProxy(@Header("Authorization") String authorization, - @Url String url, - @QueryMap Map fields); + @Url String url, + @QueryMap Map fields); } diff --git a/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java b/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java index 9e2c1b470..ff66b1b8d 100644 --- a/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java +++ b/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java @@ -57,6 +57,10 @@ public class ApiHelper { return retrofitBucket; } + public static String getUrlForJoinRoom(String baseUrl, String token) { + return getRoom(baseUrl, token) + "/participants/active"; + } + public static String getUrlForGetRooms(String baseUrl) { return baseUrl + ocsApiVersion + spreedApiVersion + "/room"; } @@ -115,6 +119,7 @@ public class ApiHelper { public static String getUrlForCall(String baseUrl, String token) { return baseUrl + ocsApiVersion + spreedApiVersion + "/call/" + token; + } public static String getUrlForCallPing(String baseUrl, String token) { diff --git a/app/src/main/java/com/nextcloud/talk/api/models/json/generic/GenericMeta.java b/app/src/main/java/com/nextcloud/talk/api/models/json/generic/GenericMeta.java index 2626dc7d6..3c5b624bd 100644 --- a/app/src/main/java/com/nextcloud/talk/api/models/json/generic/GenericMeta.java +++ b/app/src/main/java/com/nextcloud/talk/api/models/json/generic/GenericMeta.java @@ -35,7 +35,7 @@ public class GenericMeta { String status; @JsonField(name = "statuscode") - String statusCode; + int statusCode; @JsonField(name = "message") String message; diff --git a/app/src/main/java/com/nextcloud/talk/api/models/json/participants/Participant.java b/app/src/main/java/com/nextcloud/talk/api/models/json/participants/Participant.java index 030af8ee1..7a68ffcf9 100644 --- a/app/src/main/java/com/nextcloud/talk/api/models/json/participants/Participant.java +++ b/app/src/main/java/com/nextcloud/talk/api/models/json/participants/Participant.java @@ -42,4 +42,7 @@ public class Participant { @JsonField(name = "roomId") long roomId; + + @JsonField(name = "inCall") + boolean inCall; } diff --git a/app/src/main/java/com/nextcloud/talk/api/models/json/signaling/Signaling.java b/app/src/main/java/com/nextcloud/talk/api/models/json/signaling/Signaling.java index a78191f0c..b3a37c385 100644 --- a/app/src/main/java/com/nextcloud/talk/api/models/json/signaling/Signaling.java +++ b/app/src/main/java/com/nextcloud/talk/api/models/json/signaling/Signaling.java @@ -34,7 +34,7 @@ import lombok.Data; public class Signaling { @JsonField(name = "type") String type; - //can be NCSignalingMessage or List + //can be NCMessageWrapper or List @JsonField(name = "data") - Object signalingMessage; + Object messageWrapper; } diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java index 567c6cd2f..8e90df0eb 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java @@ -98,6 +98,7 @@ public class NextcloudTalkApplication extends MultiDexApplication { new JobRequest.Builder(PushRegistrationJob.TAG).setUpdateCurrent(true).startNow().build().schedule(); new JobRequest.Builder(AccountRemovalJob.TAG).setUpdateCurrent(true).startNow().build().schedule(); + } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java index 571d0a693..1839b75c2 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java @@ -47,14 +47,13 @@ import android.view.inputmethod.EditorInfo; import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; -import com.bluelinelabs.conductor.changehandler.SimpleSwapChangeHandler; import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler; +import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler; import com.nextcloud.talk.R; import com.nextcloud.talk.activities.CallActivity; import com.nextcloud.talk.adapters.items.RoomItem; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.api.helpers.api.ApiHelper; -import com.nextcloud.talk.api.models.json.call.CallOverall; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.persistence.entities.UserEntity; @@ -73,9 +72,7 @@ import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; -import okhttp3.Credentials; import retrofit2.HttpException; @AutoInjector(NextcloudTalkApplication.class) @@ -110,26 +107,15 @@ public class CallsListController extends BaseController implements SearchView.On @Override public boolean onItemClick(int position) { if (roomItems.size() > position) { + overridePushHandler(new NoOpControllerChangeHandler()); + overridePopHandler(new NoOpControllerChangeHandler()); RoomItem roomItem = roomItems.get(position); - ncApi.joinCall(Credentials.basic(userEntity.getUsername(), userEntity.getToken()), - ApiHelper.getUrlForCall(userEntity.getBaseUrl(), roomItem.getModel().getToken())) - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(CallOverall callOverall) throws Exception { - - overridePushHandler(new SimpleSwapChangeHandler()); - overridePopHandler(new SimpleSwapChangeHandler()); - - Intent callIntent = new Intent(getActivity(), CallActivity.class); - BundleBuilder bundleBuilder = new BundleBuilder(new Bundle()); - bundleBuilder.putString("roomToken", roomItem.getModel().getToken()); - bundleBuilder.putParcelable("userEntity", userEntity); - callIntent.putExtras(bundleBuilder.build()); - startActivity(callIntent); - } - }); + Intent callIntent = new Intent(getActivity(), CallActivity.class); + BundleBuilder bundleBuilder = new BundleBuilder(new Bundle()); + bundleBuilder.putString("roomToken", roomItem.getModel().getToken()); + bundleBuilder.putParcelable("userEntity", userEntity); + callIntent.putExtras(bundleBuilder.build()); + startActivity(callIntent); } return true; diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java index d6bea0f05..d2f5c2ab3 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java @@ -340,7 +340,7 @@ public class SettingsController extends BaseController { messageView.setVisibility(View.VISIBLE); break; case WRONG_ACCOUNT: - messageText.setTextColor(getResources().getColor(R.color.darkRed)); + messageText.setTextColor(getResources().getColor(R.color.nc_darkRed)); messageText.setText(getResources().getString(R.string.nc_settings_wrong_account)); messageView.setVisibility(View.VISIBLE); break; @@ -424,6 +424,11 @@ public class SettingsController extends BaseController { } } + @Override + protected String getTitle() { + return getResources().getString(R.string.nc_app_name); + } + private class ProxyCredentialsChangeListener implements OnPreferenceValueChangedListener { @Override @@ -462,9 +467,4 @@ public class SettingsController extends BaseController { } } - @Override - protected String getTitle() { - return getResources().getString(R.string.nc_app_name); - } - } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java b/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java index 718de0c4e..5aedeb612 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java @@ -118,7 +118,7 @@ public class SwitchAccountController extends BaseController { User user; UserEntity currentUserEntity = userUtils.getCurrentUser(); - for(Object userEntityObject : userUtils.getUsers()) { + for (Object userEntityObject : userUtils.getUsers()) { userEntity = (UserEntity) userEntityObject; if (!userEntity.equals(currentUserEntity)) { user = new User(); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java index 841f1a6a2..a5ff401ca 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java @@ -236,7 +236,7 @@ public class WebViewLoginController extends BaseController { if (userUtils.checkIfUserIsScheduledForDeletion(loginData.getUsername(), baseUrl)) { ErrorMessageHolder.getInstance().setMessageType( ErrorMessageHolder.ErrorMessageType.ACCOUNT_SCHEDULED_FOR_DELETION); - getRouter().popToRoot(); + getRouter().popToRoot(); } // We use the URL user entered because one provided by the server is NOT reliable diff --git a/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java b/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java index 70f0bb27d..ff2b476e2 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java @@ -30,6 +30,7 @@ import com.nextcloud.talk.controllers.base.providers.ActionBarProvider; public abstract class BaseController extends RefWatchingController { private static final String TAG = "BaseController"; + protected BaseController() { } diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java b/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java index 505575317..80e03594a 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java @@ -34,6 +34,7 @@ import com.nextcloud.talk.utils.ssl.MagicTrustManager; import com.nextcloud.talk.utils.ssl.SSLSocketFactoryCompat; import java.io.IOException; +import java.net.CookieManager; import java.net.InetSocketAddress; import java.net.Proxy; import java.util.concurrent.TimeUnit; @@ -47,6 +48,7 @@ import okhttp3.Authenticator; import okhttp3.Cache; import okhttp3.Credentials; import okhttp3.Interceptor; +import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -121,6 +123,8 @@ public class RestModule { httpClient.readTimeout(30, TimeUnit.SECONDS); httpClient.writeTimeout(30, TimeUnit.SECONDS); + httpClient.cookieJar(new JavaNetCookieJar(new CookieManager())); + int cacheSize = 128 * 1024 * 1024; // 128 MB httpClient.cache(new Cache(NextcloudTalkApplication.getSharedApplication().getCacheDir(), cacheSize)); diff --git a/app/src/main/java/com/nextcloud/talk/events/CertificateEvent.java b/app/src/main/java/com/nextcloud/talk/events/CertificateEvent.java index e0acbf0da..a5a5afcfc 100644 --- a/app/src/main/java/com/nextcloud/talk/events/CertificateEvent.java +++ b/app/src/main/java/com/nextcloud/talk/events/CertificateEvent.java @@ -30,7 +30,8 @@ import java.security.cert.X509Certificate; public class CertificateEvent { private final X509Certificate x509Certificate; private final MagicTrustManager magicTrustManager; - @Nullable private final SslErrorHandler sslErrorHandler; + @Nullable + private final SslErrorHandler sslErrorHandler; public CertificateEvent(X509Certificate x509Certificate, MagicTrustManager magicTrustManager, @Nullable SslErrorHandler sslErrorHandler) { diff --git a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java index 690385e4d..b0a9d6b3b 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java @@ -61,7 +61,7 @@ public class AccountRemovalJob extends Job { NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); PushConfigurationState pushConfigurationState; - for(Object userEntityObject : userUtils.getUsersScheduledForDeletion()) { + for (Object userEntityObject : userUtils.getUsersScheduledForDeletion()) { UserEntity userEntity = (UserEntity) userEntityObject; try { if (!TextUtils.isEmpty(userEntity.getPushConfigurationState())) { @@ -78,8 +78,8 @@ public class AccountRemovalJob extends Job { @Override public void onNext(GenericOverall genericOverall) { - if (genericOverall.getOcs().getMeta().getStatusCode().equals("200") - || genericOverall.getOcs().getMeta().getStatusCode().equals("202")) { + if (genericOverall.getOcs().getMeta().getStatusCode() == 200 + || genericOverall.getOcs().getMeta().getStatusCode() == 202) { HashMap queryMap = new HashMap<>(); queryMap.put("deviceIdentifier", finalPushConfigurationState.deviceIdentifier); queryMap.put("userPublicKey", finalPushConfigurationState.getUserPublicKey()); @@ -158,7 +158,7 @@ public class AccountRemovalJob extends Job { } }); } - } catch(IOException e) { + } catch (IOException e) { Log.d(TAG, "Something went wrong while removing job at parsing PushConfigurationState"); userUtils.deleteUser(userEntity.getUsername(), userEntity.getBaseUrl()); diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayHelper.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayHelper.java index c885c77c9..91679d7a1 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayHelper.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayHelper.java @@ -28,10 +28,10 @@ public class DisplayHelper { private static final String TAG = "DIsplayHelper"; - public static float convertDpToPixel(float dp, Context context){ + public static float convertDpToPixel(float dp, Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); - float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); + float px = dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); return px; } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ErrorMessageHolder.java b/app/src/main/java/com/nextcloud/talk/utils/ErrorMessageHolder.java index 2b50844a1..81294f5fd 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ErrorMessageHolder.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ErrorMessageHolder.java @@ -23,13 +23,9 @@ package com.nextcloud.talk.utils; import android.support.annotation.Nullable; public class ErrorMessageHolder { - public enum ErrorMessageType { - WRONG_ACCOUNT, ACCOUNT_UPDATED_NOT_ADDED, ACCOUNT_SCHEDULED_FOR_DELETION - } - + private static final ErrorMessageHolder holder = new ErrorMessageHolder(); private ErrorMessageType errorMessageType; - private static final ErrorMessageHolder holder = new ErrorMessageHolder(); public static ErrorMessageHolder getInstance() { return holder; } @@ -42,6 +38,9 @@ public class ErrorMessageHolder { this.errorMessageType = errorMessageType; } + public enum ErrorMessageType { + WRONG_ACCOUNT, ACCOUNT_UPDATED_NOT_ADDED, ACCOUNT_SCHEDULED_FOR_DELETION + } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java index 02f277b8a..17246465d 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java @@ -335,7 +335,8 @@ public class PushUtils { if (readPublicKey) { keyString = keyString.replaceAll("\\n", "").replace("-----BEGIN PUBLIC KEY-----", - "").replace("-----END PUBLIC KEY-----", "");; + "").replace("-----END PUBLIC KEY-----", ""); + ; } else { keyString = keyString.replaceAll("\\n", "").replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", ""); diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java b/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java index 668fba161..f6978b1f8 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java @@ -65,7 +65,6 @@ public class UserUtils { } - public UserEntity getAnyUserAndSetAsActive() { Result findUserQueryResult = dataStore.select(User.class) .where(UserEntity.SCHEDULED_FOR_DELETION.eq(false)) @@ -125,6 +124,7 @@ public class UserUtils { return false; } + public boolean getIfUserWithUsernameAndServer(String username, String server) { Result findUserQueryResult = dataStore.select(User.class).where(UserEntity.USERNAME.eq(username) .and(UserEntity.BASE_URL.eq(server.toLowerCase()))) diff --git a/app/src/main/res/drawable/ic_logo.xml b/app/src/main/res/drawable/ic_logo.xml new file mode 100644 index 000000000..385d98069 --- /dev/null +++ b/app/src/main/res/drawable/ic_logo.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/controller_account_verification.xml b/app/src/main/res/layout/controller_account_verification.xml index 850ff4949..f704741d3 100644 --- a/app/src/main/res/layout/controller_account_verification.xml +++ b/app/src/main/res/layout/controller_account_verification.xml @@ -23,7 +23,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/nc_background_color"> + android:background="@color/nc_white_color"> + android:background="@color/nc_white_color"> + android:background="@color/colorPrimary"> + + + app:primaryColor="@color/nc_white_color_complete" + > + android:singleLine="true" + android:textColor="@color/nc_white_color_complete"/> @@ -59,7 +70,7 @@ android:layout_marginStart="@dimen/activity_horizontal_margin" android:layout_marginTop="@dimen/padding_between_elements" android:indeterminate="true" - android:progressTint="@color/colorPrimary" + android:progressTint="@color/nc_white_color" android:visibility="invisible"/> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7a89774e2..9ef642be3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,9 +1,11 @@ - #0082c9 + #0082C9 #006AA3 #007CC2 - #D32F2F + #D32F2F + @color/per70white + #FFFFFF diff --git a/app/src/main/res/values/setup.xml b/app/src/main/res/values/setup.xml index 91574306e..39715c913 100644 --- a/app/src/main/res/values/setup.xml +++ b/app/src/main/res/values/setup.xml @@ -7,7 +7,6 @@ Nextcloud Talk Nextcloud - @color/per70white https://push-notifications.nextcloud.com diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0eb88fe33..90baaefda 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,4 +1,4 @@ - +