diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt index f0490d379d..37b5055ff3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt @@ -11,7 +11,6 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import android.widget.Toast -import androidx.activity.viewModels import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory import androidx.core.view.isVisible import androidx.fragment.app.* @@ -42,9 +41,6 @@ import org.thoughtcrime.securesms.loki.viewmodel.DefaultGroupsViewModel import org.thoughtcrime.securesms.loki.viewmodel.State class JoinPublicChatActivity : PassphraseRequiredActionBarActivity(), ScanQRCodeWrapperFragmentDelegate { - - private val viewModel by viewModels() - private val adapter = JoinPublicChatActivityAdapter(this) // region Lifecycle @@ -83,23 +79,18 @@ class JoinPublicChatActivity : PassphraseRequiredActionBarActivity(), ScanQRCode } fun joinPublicChatIfPossible(url: String) { - // add http if just an IP style / host style URL is entered but leave it if scheme is included - val properString = if (!url.startsWith("http")) "http://$url" else url - val httpUrl = HttpUrl.parse(properString) ?: return Toast.makeText(this,R.string.invalid_url, Toast.LENGTH_SHORT).show() - - val room = httpUrl.pathSegments().firstOrNull() - val publicKey = httpUrl.queryParameter("public_key") + // Add "http" if not entered explicitly + val stringWithExplicitScheme = if (!url.startsWith("http")) "http://$url" else url + val url = HttpUrl.parse(stringWithExplicitScheme) ?: return Toast.makeText(this,R.string.invalid_url, Toast.LENGTH_SHORT).show() + val room = url.pathSegments().firstOrNull() + val publicKey = url.queryParameter("public_key") val isV2OpenGroup = !room.isNullOrEmpty() showLoader() - lifecycleScope.launch(Dispatchers.IO) { try { val (threadID, groupID) = if (isV2OpenGroup) { - val server = HttpUrl.Builder().scheme(httpUrl.scheme()).host(httpUrl.host()).apply { - if (httpUrl.port() != 80 || httpUrl.port() != 443) { - // non-standard port, add to server - this.port(httpUrl.port()) - } + val server = HttpUrl.Builder().scheme(url.scheme()).host(url.host()).apply { + if (url.port() != 80 || url.port() != 443) { this.port(url.port()) } // Non-standard port; add to server }.build() val group = OpenGroupUtilities.addGroup(this@JoinPublicChatActivity, server.toString().removeSuffix("/"), room!!, publicKey!!) val threadID = GroupManager.getOpenGroupThreadID(group.id, this@JoinPublicChatActivity) @@ -107,21 +98,19 @@ class JoinPublicChatActivity : PassphraseRequiredActionBarActivity(), ScanQRCode threadID to groupID } else { val channel: Long = 1 - val group = OpenGroupUtilities.addGroup(this@JoinPublicChatActivity, properString, channel) + val group = OpenGroupUtilities.addGroup(this@JoinPublicChatActivity, stringWithExplicitScheme, channel) val threadID = GroupManager.getOpenGroupThreadID(group.id, this@JoinPublicChatActivity) val groupID = GroupUtil.getEncodedOpenGroupID(group.id.toByteArray()) threadID to groupID } MultiDeviceProtocol.forceSyncConfigurationNowIfNeeded(this@JoinPublicChatActivity) - withContext(Dispatchers.Main) { - // go to the new conversation and finish this one - openConversationActivity(this@JoinPublicChatActivity, threadID, Recipient.from(this@JoinPublicChatActivity, Address.fromSerialized(groupID), false)) + val recipient = Recipient.from(this@JoinPublicChatActivity, Address.fromSerialized(groupID), false) + openConversationActivity(this@JoinPublicChatActivity, threadID, recipient) finish() } - } catch (e: Exception) { - Log.e("JoinPublicChatActivity", "Fialed to join open group.", e) + Log.e("Loki", "Couldn't join open group.", e) withContext(Dispatchers.Main) { hideLoader() Toast.makeText(this@JoinPublicChatActivity, R.string.activity_join_public_chat_error, Toast.LENGTH_SHORT).show() @@ -175,19 +164,39 @@ private class JoinPublicChatActivityAdapter(val activity: JoinPublicChatActivity // region Enter Chat URL Fragment class EnterChatURLFragment : Fragment() { - private val viewModel by activityViewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.fragment_enter_chat_url, container, false) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + chatURLEditText.imeOptions = chatURLEditText.imeOptions or 16777216 // Always use incognito keyboard + joinPublicChatButton.setOnClickListener { joinPublicChatIfPossible() } + viewModel.defaultRooms.observe(viewLifecycleOwner) { state -> + defaultRoomsContainer.isVisible = state is State.Success + defaultRoomsLoader.isVisible = state is State.Loading + when (state) { + State.Loading -> { + // TODO: Show a loader + } + is State.Error -> { + // TODO: Hide the loader + } + is State.Success -> { + populateDefaultGroups(state.value) + } + } + } + } + private fun populateDefaultGroups(groups: List) { defaultRoomsGridLayout.removeAllViews() groups.forEach { defaultGroup -> val chip = layoutInflater.inflate(R.layout.default_group_chip,defaultRoomsGridLayout, false) as Chip val drawable = defaultGroup.image?.let { bytes -> - val bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.size) + val bitmap = BitmapFactory.decodeByteArray(bytes,0, bytes.size) RoundedBitmapDrawableFactory.create(resources,bitmap).apply { isCircular = true } @@ -200,32 +209,10 @@ class EnterChatURLFragment : Fragment() { defaultRoomsGridLayout.addView(chip) } if (groups.size and 1 != 0) { - // add a filler weight 1 view layoutInflater.inflate(R.layout.grid_layout_filler, defaultRoomsGridLayout) } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - chatURLEditText.imeOptions = chatURLEditText.imeOptions or 16777216 // Always use incognito keyboard - joinPublicChatButton.setOnClickListener { joinPublicChatIfPossible() } - viewModel.defaultRooms.observe(viewLifecycleOwner) { state -> - defaultRoomsParent.isVisible = state is State.Success - defaultRoomsLoader.isVisible = state is State.Loading - when (state) { - State.Loading -> { - // show a loader here probs - } - is State.Error -> { - // hide the loader and the - } - is State.Success -> { - populateDefaultGroups(state.value) - } - } - } - } - // region Convenience private fun joinPublicChatIfPossible() { val inputMethodManager = requireContext().getSystemService(BaseActionBarActivity.INPUT_METHOD_SERVICE) as InputMethodManager diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/viewmodel/DefaultGroupsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/viewmodel/DefaultGroupsViewModel.kt index a2d747ed9b..d4281a6cfb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/viewmodel/DefaultGroupsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/viewmodel/DefaultGroupsViewModel.kt @@ -20,5 +20,4 @@ class DefaultGroupsViewModel : ViewModel() { }.onStart { emit(State.Loading) }.asLiveData() - } \ No newline at end of file diff --git a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml index a4b088aac1..058ff98059 100644 --- a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml +++ b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml @@ -34,10 +34,11 @@ + + + - + + + , server: String): Promise, Exception> { + fun compactPoll(rooms: List, server: String): Promise, Exception> { val authTokenRequests = rooms.associateWith { room -> getAuthToken(room, server) } val storage = MessagingModuleConfiguration.shared.storage val requests = rooms.mapNotNull { room -> diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt index 311e213592..7e40c9b2a6 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt @@ -70,7 +70,7 @@ class OpenGroupV2Poller(private val openGroups: List, private val e isPollOngoing = true val server = openGroups.first().server // assume all the same server val rooms = openGroups.map { it.room } - return OpenGroupAPIV2.getCompactPoll(rooms = rooms, server).successBackground { results -> + return OpenGroupAPIV2.compactPoll(rooms = rooms, server).successBackground { results -> results.forEach { (room, results) -> val serverRoomId = "$server.$room" handleDeletedMessages(serverRoomId,results.deletions)