diff --git a/.idea/misc.xml b/.idea/misc.xml index be2c23c15..b36c7ce25 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,7 +5,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index ae4d0b4f0..dd4cd1d1b 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,7 +4,8 @@ - + + diff --git a/app/build.gradle b/app/build.gradle index 217b106c1..2c976dea8 100644 --- a/app/build.gradle +++ b/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 diff --git a/app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.kt index 0a864f24b..5075ebace 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.kt +++ b/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) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java index 7f86bec98..75e962bdd 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/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() { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 6fc22d45a..fd3206aab 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/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(R.id.quotedChatMessageView)?.tag as Int? - sendMessage(editable, if (view?.findViewById(R.id.quotedChatMessageView)?.visibility == View.VISIBLE) replyMessageId else null ) + sendMessage(editable, if (view?.findViewById(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(R.id.quotedMessage)?.ellipsize = TextUtils.TruncateAt.END messageInputView?.findViewById(R.id.quotedMessage)?.text = it.text messageInputView?.findViewById(R.id.quotedMessageTime)?.text = DateFormatter.format(it.createdAt, DateFormatter.Template.TIME) - messageInputView?.findViewById(R.id.quotedMessageAuthor)?.text = it.actorDisplayName ?: context!!.getText(R.string.nc_nick_guest) + messageInputView?.findViewById(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(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) diff --git a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java index e1949580b..909b1ccd8 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java +++ b/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); } diff --git a/app/src/main/res/drawable/ic_chat_black_24dp.xml b/app/src/main/res/drawable/ic_chat_black_24dp.xml deleted file mode 100644 index 65698dfb3..000000000 --- a/app/src/main/res/drawable/ic_chat_black_24dp.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_comment.xml b/app/src/main/res/drawable/ic_comment.xml new file mode 100644 index 000000000..808142bf3 --- /dev/null +++ b/app/src/main/res/drawable/ic_comment.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/app/src/main/res/layout/activity_magic_call.xml b/app/src/main/res/layout/activity_magic_call.xml index 342382ce4..7ea065fa5 100644 --- a/app/src/main/res/layout/activity_magic_call.xml +++ b/app/src/main/res/layout/activity_magic_call.xml @@ -30,4 +30,10 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> - \ 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 index a18d8a7ae..a3a4cc342 100644 --- a/app/src/main/res/layout/controller_call.xml +++ b/app/src/main/res/layout/controller_call.xml @@ -55,6 +55,15 @@ android:layout_marginBottom="8dp" android:animateLayoutChanges="true"> + + + + #D5D5D5 #E9FFFFFF #111111 + #7Fffffff #eceff1