diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d2c87f5f4..8ab3d0642 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,7 +11,7 @@
-
+
@@ -37,6 +37,11 @@
+
+
diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java
new file mode 100644
index 000000000..5a83d3ec1
--- /dev/null
+++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java
@@ -0,0 +1,98 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Mario Danic
+ * Copyright (C) 2017 Mario Danic
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.nextcloud.talk.activities;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+
+import com.bluelinelabs.conductor.Conductor;
+import com.bluelinelabs.conductor.Router;
+import com.bluelinelabs.conductor.RouterTransaction;
+import com.bluelinelabs.conductor.changehandler.SimpleSwapChangeHandler;
+import com.nextcloud.talk.R;
+import com.nextcloud.talk.application.NextcloudTalkApplication;
+import com.nextcloud.talk.controllers.CallController;
+import com.nextcloud.talk.utils.bundle.BundleBuilder;
+
+import autodagger.AutoInjector;
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+@AutoInjector(NextcloudTalkApplication.class)
+public class CallActivity extends AppCompatActivity {
+ private static final String TAG = "CallActivity";
+
+ @BindView(R.id.controller_container)
+ ViewGroup container;
+
+ private Router router;
+
+ private String roomToken;
+ private String userDisplayName;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
+ WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
+ getWindow().getDecorView().setSystemUiVisibility(getSystemUiVisibility());
+
+ setContentView(R.layout.activity_call);
+ NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
+ ButterKnife.bind(this);
+
+ roomToken = getIntent().getExtras().getString("roomToken", "");
+ userDisplayName = getIntent().getExtras().getString("userDisplayName", "");
+
+ router = Conductor.attachRouter(this, container, savedInstanceState);
+
+ if (!router.hasRootController()) {
+ BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
+ bundleBuilder.putString("roomToken", roomToken);
+ bundleBuilder.putString("userDisplayName", userDisplayName);
+
+ router.setRoot(RouterTransaction.with(new CallController(bundleBuilder.build()))
+ .popChangeHandler(new SimpleSwapChangeHandler())
+ .pushChangeHandler((new SimpleSwapChangeHandler())));
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (!router.handleBack()) {
+ super.onBackPressed();
+ }
+ }
+
+ 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;
+ }
+}
diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/RoomItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/RoomItem.java
index 994802973..5551d16e1 100644
--- a/app/src/main/java/com/nextcloud/talk/adapters/items/RoomItem.java
+++ b/app/src/main/java/com/nextcloud/talk/adapters/items/RoomItem.java
@@ -28,7 +28,6 @@ import android.widget.TextView;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.model.LazyHeaders;
-import com.bumptech.glide.load.resource.bitmap.BitmapTransitionOptions;
import com.nextcloud.talk.R;
import com.nextcloud.talk.api.helpers.api.ApiHelper;
import com.nextcloud.talk.api.models.json.rooms.Room;
@@ -122,7 +121,6 @@ public class RoomItem extends AbstractFlexibleItem
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
.asBitmap()
- .transition(BitmapTransitionOptions.withCrossFade())
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.load(glideUrl)
diff --git a/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOCS.java b/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOCS.java
index 75433131d..3eca77b50 100644
--- a/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOCS.java
+++ b/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOCS.java
@@ -24,6 +24,12 @@ import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.nextcloud.talk.api.models.json.generic.GenericOCS;
+import org.parceler.Parcel;
+
+import lombok.Data;
+
+@Data
+@Parcel
@JsonObject
public class CallOCS extends GenericOCS {
@JsonField(name = "data")
diff --git a/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOverall.java b/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOverall.java
index 6a49dab78..5f2944a20 100644
--- a/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOverall.java
+++ b/app/src/main/java/com/nextcloud/talk/api/models/json/call/CallOverall.java
@@ -23,6 +23,12 @@ package com.nextcloud.talk.api.models.json.call;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
+import org.parceler.Parcel;
+
+import lombok.Data;
+
+@Data
+@Parcel
@JsonObject
public class CallOverall {
@JsonField(name = "ocs")
diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java
new file mode 100644
index 000000000..cc081cb39
--- /dev/null
+++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java
@@ -0,0 +1,69 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Mario Danic
+ * Copyright (C) 2017 Mario Danic
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.nextcloud.talk.controllers;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.nextcloud.talk.R;
+import com.nextcloud.talk.application.NextcloudTalkApplication;
+import com.nextcloud.talk.controllers.base.RefWatchingController;
+
+import org.webrtc.SurfaceViewRenderer;
+
+import autodagger.AutoInjector;
+import butterknife.BindView;
+
+@AutoInjector(NextcloudTalkApplication.class)
+public class CallController extends RefWatchingController {
+ private static final String TAG = "CallController";
+
+ @BindView(R.id.fullscreen_video_view)
+ SurfaceViewRenderer fullScreenVideo;
+
+ @BindView(R.id.pip_video_view)
+ SurfaceViewRenderer pipVideoView;
+
+ private String roomToken;
+ private String userDisplayName;
+
+ public CallController(Bundle args) {
+ super(args);
+ this.roomToken = args.getString("roomToken", "");
+ this.userDisplayName = args.getString("userDisplayName");
+
+ }
+
+ @Override
+ protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
+ return inflater.inflate(R.layout.controller_call, container, false);
+ }
+
+ @Override
+ protected void onViewBound(@NonNull View view) {
+ super.onViewBound(view);
+ NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
+ }
+
+}
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 4d52a2982..2e1f08abd 100644
--- a/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java
+++ b/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java
@@ -22,6 +22,7 @@ package com.nextcloud.talk.controllers;
import android.app.SearchManager;
import android.content.Context;
+import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
@@ -46,15 +47,19 @@ 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.logansquare.LoganSquare;
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.api.models.json.rooms.Room;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.controllers.base.BaseController;
import com.nextcloud.talk.persistence.entities.UserEntity;
+import com.nextcloud.talk.utils.bundle.BundleBuilder;
import com.nextcloud.talk.utils.database.cache.CacheUtils;
import com.nextcloud.talk.utils.database.user.UserUtils;
@@ -69,7 +74,9 @@ 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)
@@ -108,6 +115,35 @@ public class CallsListController extends BaseController implements SearchView.On
private SearchView searchView;
private String searchQuery;
+ private FlexibleAdapter.OnItemClickListener onItemClickListener =
+ new FlexibleAdapter.OnItemClickListener() {
+ @Override
+ public boolean onItemClick(int position) {
+ 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.putString("userDisplayName", userEntity.getDisplayName());
+ callIntent.putExtras(bundleBuilder.build());
+ startActivity(callIntent);
+ }
+ });
+
+ return true;
+ }
+ };
+
public CallsListController() {
super();
setHasOptionsMenu(true);
@@ -132,6 +168,8 @@ public class CallsListController extends BaseController implements SearchView.On
adapter = new FlexibleAdapter<>(roomItems, getActivity(), false);
}
+ adapter.addListener(onItemClickListener);
+
prepareViews();
if ((userEntity = userUtils.getCurrentUser()) != null) {
@@ -391,4 +429,5 @@ public class CallsListController extends BaseController implements SearchView.On
public boolean onQueryTextSubmit(String query) {
return onQueryTextChange(query);
}
+
}
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 c2864b8b3..70f0bb27d 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
@@ -21,6 +21,7 @@ package com.nextcloud.talk.controllers.base;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.ActionBar;
+import android.util.Log;
import android.view.View;
import com.bluelinelabs.conductor.Controller;
@@ -28,6 +29,7 @@ import com.nextcloud.talk.controllers.base.providers.ActionBarProvider;
public abstract class BaseController extends RefWatchingController {
+ private static final String TAG = "BaseController";
protected BaseController() {
}
@@ -38,7 +40,12 @@ public abstract class BaseController extends RefWatchingController {
// Note: This is just a quick demo of how an ActionBar *can* be accessed, not necessarily how it *should*
// be accessed. In a production app, this would use Dagger instead.
protected ActionBar getActionBar() {
- ActionBarProvider actionBarProvider = ((ActionBarProvider) getActivity());
+ ActionBarProvider actionBarProvider = null;
+ try {
+ actionBarProvider = ((ActionBarProvider) getActivity());
+ } catch (Exception exception) {
+ Log.d(TAG, "Failed to fetch the action bar provider");
+ }
return actionBarProvider != null ? actionBarProvider.getSupportActionBar() : null;
}
diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml
new file mode 100644
index 000000000..cf1e604f8
--- /dev/null
+++ b/app/src/main/res/layout/activity_call.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/controller_call.xml b/app/src/main/res/layout/controller_call.xml
new file mode 100644
index 000000000..2db967632
--- /dev/null
+++ b/app/src/main/res/layout/controller_call.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file