Kaynağa Gözat

Chat during call

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 4 yıl önce
ebeveyn
işleme
f7d9290871

+ 7 - 3
.idea/misc.xml

@@ -5,7 +5,7 @@
     <option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
     <option name="myNullables">
       <value>
-        <list size="10">
+        <list size="12">
           <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
           <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
           <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
@@ -16,12 +16,14 @@
           <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
           <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
           <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+          <item index="10" class="java.lang.String" itemvalue="android.annotation.Nullable" />
+          <item index="11" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
         </list>
       </value>
     </option>
     <option name="myNotNulls">
       <value>
-        <list size="9">
+        <list size="11">
           <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
           <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
           <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
@@ -31,11 +33,13 @@
           <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
           <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
           <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+          <item index="9" class="java.lang.String" itemvalue="android.annotation.NonNull" />
+          <item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
         </list>
       </value>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">

+ 2 - 1
.idea/modules.xml

@@ -4,7 +4,8 @@
     <modules>
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/Projects-talk-android.iml" filepath="$PROJECT_DIR$/.idea/modules/Projects-talk-android.iml" group="talk-android" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/app/Projects-talk-android-app.iml" filepath="$PROJECT_DIR$/.idea/modules/app/Projects-talk-android-app.iml" group="talk-android/app" />
-      <module fileurl="file://$PROJECT_DIR$/talk-android.iml" filepath="$PROJECT_DIR$/talk-android.iml" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/app/app.iml" filepath="$PROJECT_DIR$/.idea/modules/app/app.iml" group="talk-android/app" />
+      <module fileurl="file://$PROJECT_DIR$/talk-android.iml" filepath="$PROJECT_DIR$/talk-android.iml" group="talk-android" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/app/talk-android-app.iml" filepath="$PROJECT_DIR$/.idea/modules/app/talk-android-app.iml" group="talk-android/app" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/app/talk-android.app.iml" filepath="$PROJECT_DIR$/.idea/modules/app/talk-android.app.iml" />
     </modules>

+ 2 - 2
app/build.gradle

@@ -39,8 +39,8 @@ android {
         targetSdkVersion 28
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 
-        versionCode 80001090 // 0-50=Alpha / 51-98=RC / 90-99=stable
-        versionName "8.0.10"
+        versionCode 80010000 // 0-50=Alpha / 51-98=RC / 90-99=stable
+        versionName "8.1.0 Alhpa 1"
 
         flavorDimensions "default"
         renderscriptTargetApi 19

+ 32 - 0
app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.kt

@@ -37,16 +37,26 @@ import com.nextcloud.talk.R
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.controllers.CallController
 import com.nextcloud.talk.controllers.CallNotificationController
+import com.nextcloud.talk.controllers.ChatController
 import com.nextcloud.talk.events.ConfigurationChangeEvent
 import com.nextcloud.talk.utils.bundle.BundleKeys
+import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
+import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
+import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY
 
 @AutoInjector(NextcloudTalkApplication::class)
 class MagicCallActivity : BaseActivity() {
 
+    private lateinit var chatController: ChatController
+
     @BindView(R.id.controller_container)
     lateinit var container: ViewGroup
+    
+    @BindView(R.id.chatControllerView)
+    lateinit var chatContainer: ViewGroup
 
     private var router: Router? = null
+    private var chatRouter: Router? = null
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -76,6 +86,28 @@ class MagicCallActivity : BaseActivity() {
                         .popChangeHandler(HorizontalChangeHandler()))
             }
         }
+
+        val extras = intent.extras ?: Bundle()
+        extras.putBoolean("showToggleChat", true)
+        
+        chatController = ChatController(extras)
+        chatRouter = Conductor.attachRouter(this, chatContainer, savedInstanceState)
+        chatRouter!!.setRoot(RouterTransaction.with(chatController)
+                .pushChangeHandler(HorizontalChangeHandler())
+                .popChangeHandler(HorizontalChangeHandler()))
+    }
+    
+    fun showChat() {
+        chatContainer.visibility = View.VISIBLE
+        container.visibility = View.GONE
+        chatController.wasDetached = false
+        chatController.pullChatMessages(1)
+    }
+
+    fun showCall() {
+        container.visibility = View.VISIBLE
+        chatContainer.visibility = View.GONE
+        chatController.wasDetached = true
     }
 
     override fun onConfigurationChanged(newConfig: Configuration) {

+ 12 - 1
app/src/main/java/com/nextcloud/talk/controllers/CallController.java

@@ -51,6 +51,7 @@ import com.facebook.drawee.backends.pipeline.Fresco;
 import com.facebook.drawee.interfaces.DraweeController;
 import com.facebook.drawee.view.SimpleDraweeView;
 import com.nextcloud.talk.R;
+import com.nextcloud.talk.activities.MagicCallActivity;
 import com.nextcloud.talk.api.NcApi;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.controllers.base.BaseController;
@@ -294,7 +295,12 @@ public class CallController extends BaseController {
         }
 
         powerManagerUtils = new PowerManagerUtils();
-        setCallState(CallStatus.CALLING);
+        
+        if (args.getString("state", "").equalsIgnoreCase("resume")) {
+            setCallState(CallStatus.IN_CONVERSATION);
+        } else {
+            setCallState(CallStatus.CALLING);
+        }
     }
 
     @Override
@@ -720,6 +726,11 @@ public class CallController extends BaseController {
             }
         }
     }
+    
+    @OnClick(R.id.callControlToggleChat)
+    void onToggleChatClick() {
+        ((MagicCallActivity) getActivity()).showChat();
+    }
 
     @OnClick(R.id.callControlHangupView)
     void onHangupClick() {

+ 36 - 20
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -27,8 +27,6 @@ import android.content.res.Resources
 import android.graphics.Bitmap
 import android.graphics.PorterDuff
 import android.graphics.drawable.ColorDrawable
-import android.graphics.drawable.Drawable
-import android.os.Build
 import android.os.Bundle
 import android.os.Handler
 import android.os.Parcelable
@@ -58,6 +56,7 @@ import com.facebook.common.executors.UiThreadImmediateExecutorService
 import com.facebook.common.references.CloseableReference
 import com.facebook.datasource.DataSource
 import com.facebook.drawee.backends.pipeline.Fresco
+import com.facebook.drawee.view.SimpleDraweeView
 import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber
 import com.facebook.imagepipeline.image.CloseableImage
 import com.google.android.flexbox.FlexboxLayout
@@ -82,6 +81,9 @@ import com.nextcloud.talk.models.json.mention.Mention
 import com.nextcloud.talk.presenters.MentionAutocompletePresenter
 import com.nextcloud.talk.utils.*
 import com.nextcloud.talk.utils.bundle.BundleKeys
+import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
+import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
+import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY
 import com.nextcloud.talk.utils.database.user.UserUtils
 import com.nextcloud.talk.utils.preferences.AppPreferences
 import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder
@@ -160,6 +162,9 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
     @JvmField
     @BindView(R.id.quotedChatMessageView)
     var quotedChatMessageView: RelativeLayout? = null
+    @BindView(R.id.callControlToggleChat)
+    @JvmField
+    var toggleChat: SimpleDraweeView? = null
     var roomToken: String? = null
     val conversationUser: UserEntity?
     val roomPassword: String
@@ -390,6 +395,15 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
             }
         }
 
+        if (args.containsKey("showToggleChat") && args.getBoolean("showToggleChat")) {
+            toggleChat?.visibility = View.VISIBLE
+            wasDetached = true
+        }
+        
+        toggleChat?.setOnClickListener{
+            (activity as MagicCallActivity).showCall()
+        }
+
         messagesListView?.addOnScrollListener(object : RecyclerView.OnScrollListener() {
             override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                 super.onScrollStateChanged(recyclerView, newState)
@@ -752,7 +766,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
                             if (isFirstMessagesProcessing) {
                                 pullChatMessages(0)
                             } else {
-                                pullChatMessages(1)
+                                pullChatMessages(1, 0)
                             }
 
                             if (magicWebSocketInstance != null) {
@@ -854,7 +868,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
 
             messageInput?.setText("")
             val replyMessageId: Int? = view?.findViewById<RelativeLayout>(R.id.quotedChatMessageView)?.tag as Int?
-            sendMessage(editable, if (view?.findViewById<RelativeLayout>(R.id.quotedChatMessageView)?.visibility == View.VISIBLE) replyMessageId else null )
+            sendMessage(editable, if (view?.findViewById<RelativeLayout>(R.id.quotedChatMessageView)?.visibility == View.VISIBLE) replyMessageId else null)
             cancelReply()
         }
     }
@@ -918,7 +932,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
         }
     }
 
-    private fun pullChatMessages(lookIntoFuture: Int) {
+    fun pullChatMessages(lookIntoFuture: Int, setReadMarker: Int = 1) {
         if (!inConversation) {
             return
         }
@@ -940,16 +954,17 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
             }
         }
 
-        var timeout = 30
-        if (!lookingIntoFuture) {
-            timeout = 0;
+        val timeout = if (lookingIntoFuture) {
+            30
+        } else {
+            0
         }
 
         fieldMap["timeout"] = timeout
 
         fieldMap["lookIntoFuture"] = lookIntoFuture
         fieldMap["limit"] = 100
-        fieldMap["setReadMarker"] = 1
+        fieldMap["setReadMarker"] = setReadMarker
 
         val lastKnown: Int
         if (lookIntoFuture > 0) {
@@ -974,7 +989,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
 
                             override fun onNext(response: Response<*>) {
                                 if (response.code() == 304) {
-                                    pullChatMessages(1)
+                                    pullChatMessages(1, setReadMarker)
                                 } else if (response.code() == 412) {
                                     futurePreconditionFailed = true
 
@@ -1127,7 +1142,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
 
                     if (adapter != null) {
                         chatMessage.isGrouped = (adapter!!.isPreviousSameAuthor(chatMessage
-                        .actorId, -1) && adapter!!.getSameAuthorLastMessagesCount(chatMessage.actorId) % 5 > 0)
+                                .actorId, -1) && adapter!!.getSameAuthorLastMessagesCount(chatMessage.actorId) % 5 > 0)
                         chatMessage.isOneToOneConversation = (currentConversation?.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)
                         adapter?.addToStart(chatMessage, shouldScroll)
                     }
@@ -1298,7 +1313,8 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
                             messageInputView?.findViewById<EmojiTextView>(R.id.quotedMessage)?.ellipsize = TextUtils.TruncateAt.END
                             messageInputView?.findViewById<EmojiTextView>(R.id.quotedMessage)?.text = it.text
                             messageInputView?.findViewById<TextView>(R.id.quotedMessageTime)?.text = DateFormatter.format(it.createdAt, DateFormatter.Template.TIME)
-                            messageInputView?.findViewById<EmojiTextView>(R.id.quotedMessageAuthor)?.text = it.actorDisplayName ?: context!!.getText(R.string.nc_nick_guest)
+                            messageInputView?.findViewById<EmojiTextView>(R.id.quotedMessageAuthor)?.text = it.actorDisplayName
+                                    ?: context!!.getText(R.string.nc_nick_guest)
 
                             conversationUser?.let { currentUser ->
 
@@ -1307,7 +1323,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
                                     transformations(CircleCropTransformation())
                                 }
 
-                                chatMessage.imageUrl?.let{ previewImageUrl ->
+                                chatMessage.imageUrl?.let { previewImageUrl ->
                                     messageInputView?.findViewById<ImageView>(R.id.quotedMessageImage)?.visibility = View.VISIBLE
 
                                     val px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 96f, resources?.displayMetrics)
@@ -1387,14 +1403,14 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter
                             bundle.putString(BundleKeys.KEY_ROOM_ID, roomOverall.ocs.data.roomId)
 
                             if (conversationUser != null) {
-                            if (conversationUser.hasSpreedFeatureCapability("chat-v2")) {
-                                bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION,
-                                        Parcels.wrap(roomOverall.ocs.data))
-                                conversationIntent.putExtras(bundle)
+                                if (conversationUser.hasSpreedFeatureCapability("chat-v2")) {
+                                    bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION,
+                                            Parcels.wrap(roomOverall.ocs.data))
+                                    conversationIntent.putExtras(bundle)
 
-                                ConductorRemapping.remapChatController(router, conversationUser.id,
-                                        roomOverall.ocs.data.token, bundle, false)
-                            }
+                                    ConductorRemapping.remapChatController(router, conversationUser.id,
+                                            roomOverall.ocs.data.token, bundle, false)
+                                }
 
                             } else {
                                 conversationIntent.putExtras(bundle)

+ 11 - 14
app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java

@@ -32,24 +32,12 @@ import android.media.MediaPlayer;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
-import android.os.VibrationEffect;
 import android.os.Vibrator;
 import android.service.notification.StatusBarNotification;
 import android.text.TextUtils;
 import android.util.Base64;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.app.NotificationCompat;
-import androidx.core.app.NotificationManagerCompat;
-import androidx.core.app.Person;
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.emoji.text.EmojiCompat;
-import androidx.work.Data;
-import androidx.work.Worker;
-import androidx.work.WorkerParameters;
-
 import com.bluelinelabs.logansquare.LoganSquare;
 import com.facebook.common.executors.UiThreadImmediateExecutorService;
 import com.facebook.common.references.CloseableReference;
@@ -84,7 +72,6 @@ import com.nextcloud.talk.utils.bundle.BundleKeys;
 import com.nextcloud.talk.utils.database.arbitrarystorage.ArbitraryStorageUtils;
 import com.nextcloud.talk.utils.preferences.AppPreferences;
 import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder;
-import com.vanniktech.emoji.emoji.Emoji;
 
 import org.parceler.Parcels;
 
@@ -100,6 +87,16 @@ import javax.crypto.Cipher;
 import javax.crypto.NoSuchPaddingException;
 import javax.inject.Inject;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
+import androidx.core.app.Person;
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.emoji.text.EmojiCompat;
+import androidx.work.Data;
+import androidx.work.Worker;
+import androidx.work.WorkerParameters;
 import autodagger.AutoInjector;
 import io.reactivex.Observer;
 import io.reactivex.disposables.Disposable;
@@ -293,7 +290,7 @@ public class NotificationWorker extends Worker {
             default:
                 // assuming one2one
                 if (decryptedPushMessage.getType().equals("chat") || decryptedPushMessage.getType().equals("room")) {
-                    largeIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_chat_black_24dp);
+                    largeIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_comment);
                 } else {
                     largeIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_call_black_24dp);
                 }

+ 0 - 25
app/src/main/res/drawable/ic_chat_black_24dp.xml

@@ -1,25 +0,0 @@
-<!--
-  ~ Nextcloud Talk application
-  ~
-  ~ @author Mario Danic
-  ~ Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
-  ~
-  ~ 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 <http://www.gnu.org/licenses/>.
-  -->
-
-<vector android:autoMirrored="true" android:height="24dp"
-    android:viewportHeight="24.0" android:viewportWidth="24.0"
-    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#FF000000" android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM6,9h12v2L6,11L6,9zM14,14L6,14v-2h8v2zM18,8L6,8L6,6h12v2z"/>
-</vector>

+ 29 - 0
app/src/main/res/drawable/ic_comment.xml

@@ -0,0 +1,29 @@
+<!--
+  ~ Nextcloud Talk application
+  ~  
+  ~ @author Mario Danic
+  ~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.com>
+  ~  
+  ~ 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 <http://www.gnu.org/licenses/>.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="32"
+    android:viewportHeight="32">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M6.667,4C4.089,4 2,6.105 2,8.7v11.282c0,2.597 2.09,4.701 4.667,4.701 1.716,0.01 12.083,0.003 17.057,0 1.115,0.842 1.807,1.748 3.057,3.206a0.93,0.93 0,0 0,0.561 0.103,0.969 0.969,0 0,0 0.445,-0.187c0.302,-0.223 0.466,-0.603 0.427,-0.988l-0.314,-2.912a4.699,4.699 0,0 0,2.1 -3.923L30,8.701C30,6.105 27.91,4 25.333,4zM10.4,12.461c1.03,0 1.867,0.842 1.867,1.88 0,1.676 -2.01,2.514 -3.187,1.33 -1.176,-1.184 -0.343,-3.21 1.32,-3.21zM16,12.461c1.03,0 1.867,0.842 1.867,1.88 0,1.676 -2.01,2.514 -3.187,1.33 -1.176,-1.184 -0.343,-3.21 1.32,-3.21zM21.6,12.461c1.03,0 1.867,0.842 1.867,1.88 0,1.676 -2.01,2.514 -3.187,1.33 -1.176,-1.184 -0.343,-3.21 1.32,-3.21z"/>
+</vector>

+ 7 - 1
app/src/main/res/layout/activity_magic_call.xml

@@ -30,4 +30,10 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 
-</RelativeLayout>
+    <com.bluelinelabs.conductor.ChangeHandlerFrameLayout
+        android:id="@+id/chatControllerView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="gone" />
+
+</RelativeLayout>

+ 9 - 0
app/src/main/res/layout/controller_call.xml

@@ -55,6 +55,15 @@
         android:layout_marginBottom="8dp"
         android:animateLayoutChanges="true">
 
+        <com.facebook.drawee.view.SimpleDraweeView xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/callControlToggleChat"
+            android:layout_width="60dp"
+            android:layout_height="60dp"
+            android:layout_marginStart="16dp"
+            app:backgroundImage="@color/whiteHalfTransparent"
+            app:placeholderImage="@drawable/ic_comment"
+            app:roundAsCircle="true" />
+
         <LinearLayout
             android:id="@+id/callControlsLinearLayoutView"
             android:layout_width="match_parent"

+ 12 - 0
app/src/main/res/layout/controller_chat.xml

@@ -28,6 +28,18 @@
     <include layout="@layout/lobby_view"
         android:visibility="gone"/>
 
+    <com.facebook.drawee.view.SimpleDraweeView
+        android:id="@+id/callControlToggleChat"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_margin="16dp"
+        app:backgroundImage="@color/nc_grey"
+        app:placeholderImage="@drawable/ic_call_black_24dp"
+        app:roundAsCircle="true"
+        android:elevation="10dp"
+        android:visibility="gone"
+        />
+
     <ProgressBar
         android:id="@+id/progressBar"
         android:layout_width="@dimen/item_height"

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -47,6 +47,7 @@
     <color name="nc_grey">#D5D5D5</color>
     <color name="controller_call_incomingCallTextView">#E9FFFFFF</color>
     <color name="grey950">#111111</color>
+    <color name="whiteHalfTransparent">#7Fffffff</color>
 
     <!-- Emoji list in chat window -->
     <color name="emoji_background">#eceff1</color>