feat(social): text activity
This commit is contained in:
parent
140dd2e0c3
commit
73ef5f4bbc
3 changed files with 105 additions and 42 deletions
|
@ -1634,14 +1634,14 @@ Page(page:$page,perPage:50) {
|
||||||
val filter = if (activityId != null) "id:$activityId,"
|
val filter = if (activityId != null) "id:$activityId,"
|
||||||
else if (userId != null) "userId:$userId,"
|
else if (userId != null) "userId:$userId,"
|
||||||
else if (global) "isFollowing:false,hasRepliesOrTypeText:true,"
|
else if (global) "isFollowing:false,hasRepliesOrTypeText:true,"
|
||||||
else "isFollowing:true,type_not:MESSAGE,"
|
else "isFollowing:true,"
|
||||||
return executeQuery<FeedResponse>(
|
return executeQuery<FeedResponse>(
|
||||||
"""{Page(page:$page,perPage:$ITEMS_PER_PAGE){activities(${filter}sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id title{english romaji native userPreferred}bannerImage coverImage{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id recipientId messengerId type replyCount likeCount message(asHtml:true)isLocked isSubscribed isLiked isPrivate siteUrl createdAt recipient{id name bannerImage avatar{medium large}}messenger{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}}}}""",
|
"""{Page(page:$page,perPage:$ITEMS_PER_PAGE){activities(${filter}sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id title{english romaji native userPreferred}bannerImage coverImage{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id recipientId messengerId type replyCount likeCount message(asHtml:true)isLocked isSubscribed isLiked isPrivate siteUrl createdAt recipient{id name bannerImage avatar{medium large}}messenger{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}}}}""",
|
||||||
force = true
|
force = true
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
private fun status(page: Int = 1): String {
|
private fun status(page: Int = 1): String {
|
||||||
return """Page(page:$page,perPage:50){activities(isFollowing: true, type:MEDIA_LIST,sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id title{english romaji native userPreferred}bannerImage coverImage{extraLarge medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id recipientId messengerId type replyCount likeCount message(asHtml:true)isLocked isSubscribed isLiked isPrivate siteUrl createdAt recipient{id name bannerImage avatar{medium large}}messenger{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}}}"""
|
return """Page(page:$page,perPage:50){activities(isFollowing: true,sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id title{english romaji native userPreferred}bannerImage coverImage{extraLarge medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id recipientId messengerId type replyCount likeCount message(asHtml:true)isLocked isSubscribed isLiked isPrivate siteUrl createdAt recipient{id name bannerImage avatar{medium large}}messenger{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}}}"""
|
||||||
}
|
}
|
||||||
suspend fun getStatus(
|
suspend fun getStatus(
|
||||||
): MutableList<User> {
|
): MutableList<User> {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import androidx.core.content.ContextCompat
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import ani.dantotsu.R
|
import ani.dantotsu.R
|
||||||
import ani.dantotsu.blurImage
|
import ani.dantotsu.blurImage
|
||||||
|
import ani.dantotsu.buildMarkwon
|
||||||
import ani.dantotsu.connections.anilist.Anilist
|
import ani.dantotsu.connections.anilist.Anilist
|
||||||
import ani.dantotsu.connections.anilist.api.Activity
|
import ani.dantotsu.connections.anilist.api.Activity
|
||||||
import ani.dantotsu.home.status.listener.StoriesCallback
|
import ani.dantotsu.home.status.listener.StoriesCallback
|
||||||
|
@ -33,6 +34,7 @@ import ani.dantotsu.profile.activity.ActivityItemBuilder
|
||||||
import ani.dantotsu.settings.saving.PrefManager
|
import ani.dantotsu.settings.saving.PrefManager
|
||||||
import ani.dantotsu.settings.saving.PrefName
|
import ani.dantotsu.settings.saving.PrefName
|
||||||
import ani.dantotsu.snackString
|
import ani.dantotsu.snackString
|
||||||
|
import ani.dantotsu.util.AniMarkdown
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
|
@ -56,6 +58,8 @@ constructor(
|
||||||
private lateinit var imageContentViewKen: ImageView
|
private lateinit var imageContentViewKen: ImageView
|
||||||
private lateinit var loadingView: ProgressBar
|
private lateinit var loadingView: ProgressBar
|
||||||
private lateinit var activityLikeCount: TextView
|
private lateinit var activityLikeCount: TextView
|
||||||
|
private lateinit var textActivity: TextView
|
||||||
|
private lateinit var textActivityContainer: LinearLayout
|
||||||
private lateinit var activityLike: ImageView
|
private lateinit var activityLike: ImageView
|
||||||
private lateinit var activityLikeContainer: LinearLayout
|
private lateinit var activityLikeContainer: LinearLayout
|
||||||
private lateinit var userName: TextView
|
private lateinit var userName: TextView
|
||||||
|
@ -89,6 +93,8 @@ constructor(
|
||||||
imageContentViewKen = findViewById(R.id.contentImageViewKen)
|
imageContentViewKen = findViewById(R.id.contentImageViewKen)
|
||||||
statusUserContainer = findViewById(R.id.statusUserContainer)
|
statusUserContainer = findViewById(R.id.statusUserContainer)
|
||||||
loadingView = findViewById(R.id.androidStoriesLoadingView)
|
loadingView = findViewById(R.id.androidStoriesLoadingView)
|
||||||
|
textActivityContainer = findViewById(R.id.textActivityContainer)
|
||||||
|
textActivity = findViewById(R.id.textActivity)
|
||||||
coverImage = findViewById(R.id.coverImage)
|
coverImage = findViewById(R.id.coverImage)
|
||||||
userName = findViewById(R.id.statusUserName)
|
userName = findViewById(R.id.statusUserName)
|
||||||
userAvatar = findViewById(R.id.statusUserAvatar)
|
userAvatar = findViewById(R.id.statusUserAvatar)
|
||||||
|
@ -377,12 +383,29 @@ constructor(
|
||||||
val set = PrefManager.getCustomVal<Set<Int>>(key, setOf()).plus((story.id))
|
val set = PrefManager.getCustomVal<Set<Int>>(key, setOf()).plus((story.id))
|
||||||
PrefManager.setCustomVal(key, set)
|
PrefManager.setCustomVal(key, set)
|
||||||
|
|
||||||
val bannerAnimations: Boolean = PrefManager.getVal(PrefName.BannerAnimations)
|
|
||||||
blurImage(if (bannerAnimations)imageContentViewKen else imageContentView, story.media?.bannerImage ?: story.media?.coverImage?.extraLarge)
|
|
||||||
userAvatar.loadImage(story.user?.avatar?.large)
|
userAvatar.loadImage(story.user?.avatar?.large)
|
||||||
coverImage.loadImage(story.media?.coverImage?.extraLarge)
|
|
||||||
userName.text = story.user?.name
|
userName.text = story.user?.name
|
||||||
time.text = ActivityItemBuilder.getDateTime(story.createdAt)
|
time.text = ActivityItemBuilder.getDateTime(story.createdAt)
|
||||||
|
statusUserContainer.setOnClickListener {
|
||||||
|
ContextCompat.startActivity(context, Intent(context, ProfileActivity::class.java)
|
||||||
|
.putExtra("userId", story.userId),
|
||||||
|
null)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun visible(isList: Boolean){
|
||||||
|
val visible = if (isList) View.VISIBLE else View.GONE
|
||||||
|
val gone = if (isList) View.GONE else View.VISIBLE
|
||||||
|
textActivity.visibility = gone
|
||||||
|
textActivityContainer.visibility = gone
|
||||||
|
infoText.visibility = visible
|
||||||
|
coverImage.visibility = visible
|
||||||
|
infoText.visibility = if (isList) View.VISIBLE else View.INVISIBLE
|
||||||
|
imageContentViewKen.visibility = visible
|
||||||
|
imageContentView.visibility = visible
|
||||||
|
}
|
||||||
|
when (story.typename){
|
||||||
|
"ListActivity" -> {
|
||||||
|
visible(true)
|
||||||
val text = "${story.status?.replaceFirstChar {
|
val text = "${story.status?.replaceFirstChar {
|
||||||
if (it.isLowerCase()) {
|
if (it.isLowerCase()) {
|
||||||
it.titlecase(Locale.ROOT)
|
it.titlecase(Locale.ROOT)
|
||||||
|
@ -397,32 +420,43 @@ constructor(
|
||||||
""
|
""
|
||||||
}
|
}
|
||||||
infoText.text = text
|
infoText.text = text
|
||||||
|
val bannerAnimations: Boolean = PrefManager.getVal(PrefName.BannerAnimations)
|
||||||
statusUserContainer.setOnClickListener {
|
blurImage(if (bannerAnimations)imageContentViewKen else imageContentView, story.media?.bannerImage ?: story.media?.coverImage?.extraLarge)
|
||||||
ContextCompat.startActivity(context, Intent(context, ProfileActivity::class.java)
|
coverImage.loadImage(story.media?.coverImage?.extraLarge)
|
||||||
.putExtra("userId", story.userId),
|
|
||||||
null)
|
|
||||||
}
|
|
||||||
|
|
||||||
coverImage.setOnClickListener{
|
coverImage.setOnClickListener{
|
||||||
ContextCompat.startActivity(context, Intent(context, MediaDetailsActivity::class.java)
|
ContextCompat.startActivity(context, Intent(context, MediaDetailsActivity::class.java)
|
||||||
.putExtra("mediaId", story.media?.id),
|
.putExtra("mediaId", story.media?.id),
|
||||||
null)
|
null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"TextActivity" -> {
|
||||||
|
visible(false)
|
||||||
|
if (!(context as android.app.Activity).isDestroyed) {
|
||||||
|
val markwon = buildMarkwon(context, false)
|
||||||
|
markwon.setMarkdown(
|
||||||
|
textActivity,
|
||||||
|
AniMarkdown.getBasicAniHTML(story.text ?: "")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"MessageActivity" -> {
|
||||||
|
visible(false)
|
||||||
|
if (!(context as android.app.Activity).isDestroyed) {
|
||||||
|
val markwon = buildMarkwon(context, false)
|
||||||
|
markwon.setMarkdown(
|
||||||
|
textActivity,
|
||||||
|
AniMarkdown.getBasicAniHTML(story.message ?: "")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
val userList = arrayListOf<User>()
|
val userList = arrayListOf<User>()
|
||||||
story.likes?.forEach { i ->
|
story.likes?.forEach { i ->
|
||||||
userList.add(User(i.id, i.name.toString(), i.avatar?.medium, i.bannerImage))
|
userList.add(User(i.id, i.name.toString(), i.avatar?.medium, i.bannerImage))
|
||||||
}
|
}
|
||||||
activityLikeContainer.setOnLongClickListener {
|
|
||||||
UsersDialogFragment().apply {
|
|
||||||
userList(userList)
|
|
||||||
show(activ.supportFragmentManager, "dialog")
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
val likeColor = ContextCompat.getColor(context, R.color.yt_red)
|
val likeColor = ContextCompat.getColor(context, R.color.yt_red)
|
||||||
val notLikeColor = ContextCompat.getColor(context, R.color.bg_opp)
|
val notLikeColor = ContextCompat.getColor(context, R.color.bg_opp)
|
||||||
|
@ -449,5 +483,12 @@ constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
activityLikeContainer.setOnLongClickListener {
|
||||||
|
UsersDialogFragment().apply {
|
||||||
|
userList(userList)
|
||||||
|
show(activ.supportFragmentManager, "dialog")
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -14,6 +14,7 @@
|
||||||
tools:ignore="ContentDescription"
|
tools:ignore="ContentDescription"
|
||||||
tools:src="@tools:sample/backgrounds/scenic" />
|
tools:src="@tools:sample/backgrounds/scenic" />
|
||||||
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/contentImageView"
|
android:id="@+id/contentImageView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -27,6 +28,27 @@
|
||||||
android:src="@drawable/linear_gradient_bg"
|
android:src="@drawable/linear_gradient_bg"
|
||||||
tools:ignore="ContentDescription" />
|
tools:ignore="ContentDescription" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/textActivityContainer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:gravity="center">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textActivity"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:fontFamily="@font/poppins_semi_bold"
|
||||||
|
android:gravity="center"
|
||||||
|
android:paddingHorizontal="12dp"
|
||||||
|
android:text="Play"
|
||||||
|
android:textColor="@color/bg_white"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:ignore="HardcodedText" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/leftTouchPanel"
|
android:id="@+id/leftTouchPanel"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
@ -36,6 +58,7 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintWidth_percent="0.5" />
|
app:layout_constraintWidth_percent="0.5" />
|
||||||
|
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/rightTouchPanel"
|
android:id="@+id/rightTouchPanel"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
@ -94,12 +117,12 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="4dp"
|
android:layout_marginEnd="4dp"
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
android:textColor="@color/bg_opp"
|
|
||||||
android:fontFamily="@font/poppins_bold"
|
android:fontFamily="@font/poppins_bold"
|
||||||
android:paddingTop="1dp"
|
android:paddingTop="1dp"
|
||||||
android:paddingBottom="0dp"
|
android:paddingBottom="0dp"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:text="Username"
|
android:text="Username"
|
||||||
|
android:textColor="@color/bg_opp"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
tools:ignore="HardcodedText,RtlSymmetry" />
|
tools:ignore="HardcodedText,RtlSymmetry" />
|
||||||
|
|
||||||
|
@ -157,8 +180,9 @@
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginVertical="32dp"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:layout_marginBottom="32dp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent">
|
app:layout_constraintStart_toStartOf="parent">
|
||||||
|
@ -168,10 +192,9 @@
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:gravity="start"
|
|
||||||
android:ellipsize="marquee"
|
android:ellipsize="marquee"
|
||||||
android:fontFamily="@font/poppins_semi_bold"
|
android:fontFamily="@font/poppins_semi_bold"
|
||||||
android:layout_marginStart="12dp"
|
android:gravity="start"
|
||||||
android:lineSpacingExtra="-8sp"
|
android:lineSpacingExtra="-8sp"
|
||||||
android:maxLines="3"
|
android:maxLines="3"
|
||||||
android:paddingHorizontal="12dp"
|
android:paddingHorizontal="12dp"
|
||||||
|
@ -182,20 +205,20 @@
|
||||||
tools:ignore="SpUsage"
|
tools:ignore="SpUsage"
|
||||||
tools:text="@string/slogan" />
|
tools:text="@string/slogan" />
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/statusUserActions"
|
android:id="@+id/statusUserActions"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center|end"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:layout_gravity="center"
|
|
||||||
android:paddingHorizontal="24dp"
|
|
||||||
tools:ignore="UseCompoundDrawables">
|
tools:ignore="UseCompoundDrawables">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/activityLikeCount"
|
android:id="@+id/activityLikeCount"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center|end"
|
||||||
|
|
||||||
android:fontFamily="@font/poppins_semi_bold"
|
android:fontFamily="@font/poppins_semi_bold"
|
||||||
android:textSize="15sp"
|
android:textSize="15sp"
|
||||||
tools:text="12" />
|
tools:text="12" />
|
||||||
|
@ -204,10 +227,9 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="12dp"
|
android:layout_marginStart="12dp"
|
||||||
|
android:layout_gravity="center|end"
|
||||||
android:src="@drawable/ic_round_favorite_24"
|
android:src="@drawable/ic_round_favorite_24"
|
||||||
tools:ignore="ContentDescription" />
|
tools:ignore="ContentDescription" />
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue