views created + database storage
parent
d98cef3c77
commit
b2a924ebf8
@ -0,0 +1,58 @@
|
||||
package org.thoughtcrime.securesms.loki.views
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import network.loki.messenger.R
|
||||
import org.session.libsignal.utilities.logging.Log
|
||||
import java.io.IOException
|
||||
|
||||
class OpenGroupInvitationView : FrameLayout {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "OpenGroupInvitationView"
|
||||
}
|
||||
|
||||
private val joinButton: ImageView
|
||||
private val openGroupIcon: ImageView
|
||||
private val groupName: TextView
|
||||
private val groupUrl: TextView
|
||||
|
||||
constructor(context: Context): this(context, null)
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet?): this(context, attrs, 0)
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr) {
|
||||
View.inflate(context, R.layout.open_group_invitation_view, this)
|
||||
joinButton = findViewById(R.id.join_open_group)
|
||||
openGroupIcon = findViewById(R.id.open_group_icon)
|
||||
groupName = findViewById(R.id.group_name)
|
||||
groupUrl = findViewById(R.id.group_url)
|
||||
|
||||
joinButton.setOnClickListener { }
|
||||
}
|
||||
|
||||
fun setOpenGroup(name: String, url: String, isOutgoing: Boolean = false) {
|
||||
groupName.text = name
|
||||
groupUrl.text = url
|
||||
|
||||
if(isOutgoing) {
|
||||
joinButton.visibility = View.GONE
|
||||
openGroupIcon.visibility = View.VISIBLE
|
||||
} else {
|
||||
joinButton.visibility = View.VISIBLE
|
||||
openGroupIcon.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
fun joinPublicGroup(url: String) {
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<org.thoughtcrime.securesms.loki.views.OpenGroupInvitationView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/open_group_invitation_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"/>
|
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<org.thoughtcrime.securesms.loki.views.OpenGroupInvitationView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/open_group_invitation_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"/>
|
@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.thoughtcrime.securesms.loki.views.OpenGroupInvitationView">
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/audio_widget_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
android:padding="8dp"
|
||||
tools:ignore="MissingConstraints" >
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/join_open_group"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:layout_margin="4dp"
|
||||
android:contentDescription="@string/open_group_invitation_view__join_accessibility_description"
|
||||
app:srcCompat="@drawable/ic_add_white_original_24dp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/open_group_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="false"
|
||||
android:visibility="gone"
|
||||
android:layout_margin="8dp"
|
||||
android:contentDescription="@string/open_group_invitation_view__join_accessibility_description"
|
||||
android:src="@drawable/ic_globe" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="6dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/group_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/Signal.Text.Caption"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:textSize="@dimen/large_font_size"
|
||||
android:maxLines="1"
|
||||
tools:text="Open group" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/open_group_invitation_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/Signal.Text.Body"
|
||||
android:maxLines="1"
|
||||
android:text="@string/open_group_invitation_view__open_group_invitation" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/group_url"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/Signal.Text.Caption"
|
||||
android:maxLines="1"
|
||||
tools:text="http://1.1.1.1" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</merge>
|
@ -1,46 +0,0 @@
|
||||
package org.session.libsession.messaging.messages.control
|
||||
|
||||
import org.session.libsignal.service.internal.push.SignalServiceProtos
|
||||
import org.session.libsignal.utilities.logging.Log
|
||||
|
||||
class OpenGroupInvitation() : ControlMessage() {
|
||||
|
||||
var groupUrl: String? = null;
|
||||
var groupName: String? = null;
|
||||
|
||||
companion object {
|
||||
const val TAG = "OpenGroupInvitation"
|
||||
|
||||
fun fromProto(proto: SignalServiceProtos.Content): OpenGroupInvitation? {
|
||||
val openGroupInvitationProto = if (proto.hasOpenGroupInvitation()) proto.openGroupInvitation else return null
|
||||
val serverAddress = openGroupInvitationProto.groupUrl
|
||||
val serverName = openGroupInvitationProto.groupName
|
||||
return OpenGroupInvitation(serverAddress, serverName)
|
||||
}
|
||||
}
|
||||
|
||||
constructor(url: String?, serverName: String?): this() {
|
||||
this.groupUrl = url
|
||||
this.groupName = serverName
|
||||
}
|
||||
|
||||
override fun isValid(): Boolean {
|
||||
if (!super.isValid()) return false
|
||||
return (groupUrl != null && groupName != null)
|
||||
}
|
||||
|
||||
override fun toProto(): SignalServiceProtos.Content? {
|
||||
val openGroupInvitationProto = SignalServiceProtos.OpenGroupInvitation.newBuilder()
|
||||
openGroupInvitationProto.groupUrl = groupUrl
|
||||
openGroupInvitationProto.groupName = groupName
|
||||
|
||||
val proto = SignalServiceProtos.Content.newBuilder()
|
||||
return try {
|
||||
proto.openGroupInvitation = openGroupInvitationProto.build()
|
||||
proto.build()
|
||||
} catch (e: Exception) {
|
||||
Log.w(TAG, "Couldn't construct open group invitation proto from: $this")
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package org.session.libsession.messaging.messages.visible
|
||||
|
||||
import org.session.libsession.messaging.messages.control.ControlMessage
|
||||
import org.session.libsignal.service.internal.push.SignalServiceProtos
|
||||
import org.session.libsignal.utilities.logging.Log
|
||||
|
||||
class OpenGroupInvitation() {
|
||||
|
||||
var groupUrl: String? = null;
|
||||
var groupName: String? = null;
|
||||
|
||||
companion object {
|
||||
const val TAG = "OpenGroupInvitation"
|
||||
|
||||
fun fromProto(proto: SignalServiceProtos.DataMessage.OpenGroupInvitation): OpenGroupInvitation? {
|
||||
val groupUrl = proto.url
|
||||
val groupName = proto.name
|
||||
return OpenGroupInvitation(groupUrl, groupName)
|
||||
}
|
||||
}
|
||||
|
||||
constructor(url: String?, serverName: String?): this() {
|
||||
this.groupUrl = url
|
||||
this.groupName = serverName
|
||||
}
|
||||
|
||||
fun isValid(): Boolean {
|
||||
return (groupUrl != null && groupName != null)
|
||||
}
|
||||
|
||||
fun toProto(): SignalServiceProtos.DataMessage.OpenGroupInvitation? {
|
||||
val openGroupInvitationProto = SignalServiceProtos.DataMessage.OpenGroupInvitation.newBuilder()
|
||||
openGroupInvitationProto.url = groupUrl
|
||||
openGroupInvitationProto.name = groupName
|
||||
|
||||
return try {
|
||||
openGroupInvitationProto.build()
|
||||
} catch (e: Exception) {
|
||||
Log.w(TAG, "Couldn't construct open group invitation proto from: $this")
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
@ -1,38 +1,39 @@
|
||||
package org.session.libsession.utilities
|
||||
|
||||
import java.net.MalformedURLException
|
||||
import java.net.URL
|
||||
import okhttp3.HttpUrl
|
||||
|
||||
object OpenGroupUrlParser {
|
||||
|
||||
// Error
|
||||
sealed class Error(val description: String) : Exception(description) {
|
||||
class MalformedUrl(message: String?) : Error("Malformed URL: $message.")
|
||||
class MalformedUrl() : Error("Malformed URL.")
|
||||
object NoRoomSpecified : Error("No room specified in the URL.")
|
||||
object NoPublicKeySpecified : Error("No public key specified in the URL.")
|
||||
object WrongQuery : Error("'public_key' argument is missing.")
|
||||
object InvalidPublicKeyProvided : Error("Invalid public key provided.")
|
||||
}
|
||||
|
||||
private const val pathPrefix = "/"
|
||||
private const val queryPrefix = "public_key="
|
||||
private const val queryPrefix = "public_key"
|
||||
|
||||
fun parseUrl(url: String): OpenGroupRoom {
|
||||
fun parseUrl(stringUrl: String): OpenGroupRoom {
|
||||
// Url have to start with 'http://'
|
||||
val url = if (!stringUrl.startsWith("http")) "http://$stringUrl" else stringUrl
|
||||
// If the URL is malformed, it will throw an exception
|
||||
val url = try { URL(url) } catch (e: MalformedURLException) { throw Error.MalformedUrl(e.message) }
|
||||
val httpUrl = HttpUrl.parse(url) ?: throw Error.MalformedUrl()
|
||||
|
||||
val host = url.host
|
||||
val host = httpUrl.host()
|
||||
// Test if the room is specified in the URL
|
||||
val room = if (!url.path.isNullOrEmpty()) url.path.removePrefix(pathPrefix) else throw Error.NoRoomSpecified
|
||||
val room = httpUrl.pathSegments().firstOrNull { !it.isNullOrEmpty() } ?: throw Error.NoRoomSpecified
|
||||
// Test if the query is specified in the URL
|
||||
val query = if (!url.query.isNullOrEmpty()) url.query else throw Error.NoPublicKeySpecified
|
||||
// Test if 'public_key' is specified in the URL
|
||||
val publicKey = if (query.contains(queryPrefix)) url.query.removePrefix(queryPrefix) else throw Error.WrongQuery
|
||||
val publicKey = httpUrl.queryParameter(queryPrefix) ?: throw Error.NoPublicKeySpecified
|
||||
// Public key must be 64 characters
|
||||
if (publicKey.length != 64) throw Error.InvalidPublicKeyProvided
|
||||
|
||||
return OpenGroupRoom(host,room,publicKey)
|
||||
}
|
||||
|
||||
fun trimParameter(stringUrl: String): String {
|
||||
return stringUrl.substringBefore("?$queryPrefix")
|
||||
}
|
||||
}
|
||||
|
||||
class OpenGroupRoom(val serverHost: String, val room: String, val serverPublicKey: String) {}
|
||||
class OpenGroupRoom(val serverHost: String, val room: String, val serverPublicKey: String) { }
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue