This commit is contained in:
Kelvin 2023-10-19 20:08:18 +02:00
commit d4317ff06f
9 changed files with 58 additions and 32 deletions

View file

@ -6,6 +6,7 @@ import com.futo.platformplayer.api.media.platforms.js.JSClient
import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.constructs.Event1
import com.futo.platformplayer.constructs.Event2 import com.futo.platformplayer.constructs.Event2
import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.logging.Logger
import com.futo.platformplayer.states.StateApp
class PlatformClientPool { class PlatformClientPool {
private val _parent: JSClient; private val _parent: JSClient;
@ -51,6 +52,11 @@ class PlatformClientPool {
if(reserved == null && _pool.size < capacity) { if(reserved == null && _pool.size < capacity) {
Logger.i(TAG, "Started additional [${_parent.name}] client in pool [${_poolName}] (${_pool.size + 1}/${capacity})"); Logger.i(TAG, "Started additional [${_parent.name}] client in pool [${_poolName}] (${_pool.size + 1}/${capacity})");
reserved = _parent.getCopy(); reserved = _parent.getCopy();
reserved?.onCaptchaException?.subscribe { client, ex ->
StateApp.instance.handleCaptchaException(client, ex);
};
reserved?.initialize(); reserved?.initialize();
_pool[reserved!!] = _poolCounter; _pool[reserved!!] = _poolCounter;
} }

View file

@ -346,24 +346,24 @@ class PostDetailFragment : MainFragment {
_rating.visibility = VISIBLE; _rating.visibility = VISIBLE;
_rating.setRating(RatingLikeDislikes(likes, dislikes), hasLiked, hasDisliked); _rating.setRating(RatingLikeDislikes(likes, dislikes), hasLiked, hasDisliked);
_rating.onLikeDislikeUpdated.subscribe(this) { processHandle, newHasLiked, newHasDisliked -> _rating.onLikeDislikeUpdated.subscribe(this) { args ->
if (newHasLiked) { if (args.hasLiked) {
processHandle.opinion(ref, Opinion.like); args.processHandle.opinion(ref, Opinion.like);
} else if (newHasDisliked) { } else if (args.hasDisliked) {
processHandle.opinion(ref, Opinion.dislike); args.processHandle.opinion(ref, Opinion.dislike);
} else { } else {
processHandle.opinion(ref, Opinion.neutral); args.processHandle.opinion(ref, Opinion.neutral);
} }
StateApp.instance.scopeOrNull?.launch(Dispatchers.IO) { StateApp.instance.scopeOrNull?.launch(Dispatchers.IO) {
try { try {
processHandle.fullyBackfillServers(); args.processHandle.fullyBackfillServers();
} catch (e: Throwable) { } catch (e: Throwable) {
Logger.e(TAG, "Failed to backfill servers", e) Logger.e(TAG, "Failed to backfill servers", e)
} }
} }
StatePolycentric.instance.updateLikeMap(ref, newHasLiked, newHasDisliked) StatePolycentric.instance.updateLikeMap(ref, args.hasLiked, args.hasDisliked)
}; };
} }
} catch (e: Throwable) { } catch (e: Throwable) {

View file

@ -1042,24 +1042,24 @@ class VideoDetailView : ConstraintLayout {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
_rating.visibility = View.VISIBLE; _rating.visibility = View.VISIBLE;
_rating.setRating(RatingLikeDislikes(likes, dislikes), hasLiked, hasDisliked); _rating.setRating(RatingLikeDislikes(likes, dislikes), hasLiked, hasDisliked);
_rating.onLikeDislikeUpdated.subscribe(this) { processHandle, newHasLiked, newHasDisliked -> _rating.onLikeDislikeUpdated.subscribe(this) { args ->
if (newHasLiked) { if (args.hasLiked) {
processHandle.opinion(ref, Opinion.like); args.processHandle.opinion(ref, Opinion.like);
} else if (newHasDisliked) { } else if (args.hasDisliked) {
processHandle.opinion(ref, Opinion.dislike); args.processHandle.opinion(ref, Opinion.dislike);
} else { } else {
processHandle.opinion(ref, Opinion.neutral); args.processHandle.opinion(ref, Opinion.neutral);
} }
fragment.lifecycleScope.launch(Dispatchers.IO) { fragment.lifecycleScope.launch(Dispatchers.IO) {
try { try {
processHandle.fullyBackfillServers(); args.processHandle.fullyBackfillServers();
} catch (e: Throwable) { } catch (e: Throwable) {
Logger.e(TAG, "Failed to backfill servers", e) Logger.e(TAG, "Failed to backfill servers", e)
} }
} }
StatePolycentric.instance.updateLikeMap(ref, newHasLiked, newHasDisliked) StatePolycentric.instance.updateLikeMap(ref, args.hasLiked, args.hasDisliked)
}; };
} }
} catch (e: Throwable) { } catch (e: Throwable) {

View file

@ -37,14 +37,13 @@ class StateTelemetry {
BuildConfig.BUILD_TYPE, BuildConfig.BUILD_TYPE,
BuildConfig.DEBUG, BuildConfig.DEBUG,
BuildConfig.IS_UNSTABLE_BUILD, BuildConfig.IS_UNSTABLE_BUILD,
Instant.now().epochSecond,
Build.BRAND, Build.BRAND,
Build.MANUFACTURER, Build.MANUFACTURER,
Build.MODEL Build.MODEL
); );
val headers = hashMapOf( val headers = hashMapOf(
"Content-Type" to "text/plain" "Content-Type" to "application/json"
); );
val json = Json.encodeToString(telemetry); val json = Json.encodeToString(telemetry);

View file

@ -6,6 +6,7 @@ import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.futo.platformplayer.* import com.futo.platformplayer.*
import com.futo.platformplayer.api.media.models.comments.IPlatformComment import com.futo.platformplayer.api.media.models.comments.IPlatformComment
@ -35,12 +36,14 @@ class CommentViewHolder : ViewHolder {
private val _buttonReplies: PillButton; private val _buttonReplies: PillButton;
private val _layoutRating: LinearLayout; private val _layoutRating: LinearLayout;
private val _pillRatingLikesDislikes: PillRatingLikesDislikes; private val _pillRatingLikesDislikes: PillRatingLikesDislikes;
private val _layoutComment: ConstraintLayout;
var onClick = Event1<IPlatformComment>(); var onClick = Event1<IPlatformComment>();
var comment: IPlatformComment? = null var comment: IPlatformComment? = null
private set; private set;
constructor(viewGroup: ViewGroup) : super(LayoutInflater.from(viewGroup.context).inflate(R.layout.list_comment, viewGroup, false)) { constructor(viewGroup: ViewGroup) : super(LayoutInflater.from(viewGroup.context).inflate(R.layout.list_comment, viewGroup, false)) {
_layoutComment = itemView.findViewById(R.id.layout_comment);
_creatorThumbnail = itemView.findViewById(R.id.image_thumbnail); _creatorThumbnail = itemView.findViewById(R.id.image_thumbnail);
_textAuthor = itemView.findViewById(R.id.text_author); _textAuthor = itemView.findViewById(R.id.text_author);
_textMetadata = itemView.findViewById(R.id.text_metadata); _textMetadata = itemView.findViewById(R.id.text_metadata);
@ -53,29 +56,31 @@ class CommentViewHolder : ViewHolder {
_layoutRating = itemView.findViewById(R.id.layout_rating); _layoutRating = itemView.findViewById(R.id.layout_rating);
_pillRatingLikesDislikes = itemView.findViewById(R.id.rating); _pillRatingLikesDislikes = itemView.findViewById(R.id.rating);
_pillRatingLikesDislikes.onLikeDislikeUpdated.subscribe { processHandle, hasLiked, hasDisliked -> _pillRatingLikesDislikes.onLikeDislikeUpdated.subscribe { args ->
val c = comment val c = comment
if (c !is PolycentricPlatformComment) { if (c !is PolycentricPlatformComment) {
throw Exception("Not implemented for non polycentric comments") throw Exception("Not implemented for non polycentric comments")
} }
if (hasLiked) { if (args.hasLiked) {
processHandle.opinion(c.reference, Opinion.like); args.processHandle.opinion(c.reference, Opinion.like);
} else if (hasDisliked) { } else if (args.hasDisliked) {
processHandle.opinion(c.reference, Opinion.dislike); args.processHandle.opinion(c.reference, Opinion.dislike);
} else { } else {
processHandle.opinion(c.reference, Opinion.neutral); args.processHandle.opinion(c.reference, Opinion.neutral);
} }
_layoutComment.alpha = if (args.dislikes > 2 && args.dislikes / (args.likes + args.dislikes) >= 0.7) 0.5f else 1.0f;
StateApp.instance.scopeOrNull?.launch(Dispatchers.IO) { StateApp.instance.scopeOrNull?.launch(Dispatchers.IO) {
try { try {
processHandle.fullyBackfillServers(); args.processHandle.fullyBackfillServers();
} catch (e: Throwable) { } catch (e: Throwable) {
Logger.e(TAG, "Failed to backfill servers.", e) Logger.e(TAG, "Failed to backfill servers.", e)
} }
} }
StatePolycentric.instance.updateLikeMap(c.reference, hasLiked, hasDisliked) StatePolycentric.instance.updateLikeMap(c.reference, args.hasLiked, args.hasDisliked)
}; };
_buttonReplies.onClick.subscribe { _buttonReplies.onClick.subscribe {
@ -98,6 +103,13 @@ class CommentViewHolder : ViewHolder {
_textMetadata.visibility = View.GONE; _textMetadata.visibility = View.GONE;
} }
val rating = comment.rating;
if (rating is RatingLikeDislikes) {
_layoutComment.alpha = if (rating.dislikes > 0 && rating.dislikes / (rating.likes + rating.dislikes) >= 0.7) 0.5f else 1.0f;
} else {
_layoutComment.alpha = 1.0f;
}
_textBody.text = comment.message.fixHtmlLinks(); _textBody.text = comment.message.fixHtmlLinks();
if (readonly) { if (readonly) {

View file

@ -12,11 +12,20 @@ import com.futo.platformplayer.R
import com.futo.platformplayer.api.media.models.ratings.IRating import com.futo.platformplayer.api.media.models.ratings.IRating
import com.futo.platformplayer.api.media.models.ratings.RatingLikeDislikes import com.futo.platformplayer.api.media.models.ratings.RatingLikeDislikes
import com.futo.platformplayer.api.media.models.ratings.RatingLikes import com.futo.platformplayer.api.media.models.ratings.RatingLikes
import com.futo.platformplayer.constructs.Event1
import com.futo.platformplayer.constructs.Event3 import com.futo.platformplayer.constructs.Event3
import com.futo.platformplayer.states.StatePolycentric import com.futo.platformplayer.states.StatePolycentric
import com.futo.platformplayer.toHumanNumber import com.futo.platformplayer.toHumanNumber
import com.futo.polycentric.core.ProcessHandle import com.futo.polycentric.core.ProcessHandle
data class OnLikeDislikeUpdatedArgs(
val processHandle: ProcessHandle,
val likes: Long,
val hasLiked: Boolean,
val dislikes: Long,
val hasDisliked: Boolean,
);
class PillRatingLikesDislikes : LinearLayout { class PillRatingLikesDislikes : LinearLayout {
private val _textLikes: TextView; private val _textLikes: TextView;
private val _textDislikes: TextView; private val _textDislikes: TextView;
@ -29,7 +38,7 @@ class PillRatingLikesDislikes : LinearLayout {
private var _dislikes = 0L; private var _dislikes = 0L;
private var _hasDisliked = false; private var _hasDisliked = false;
val onLikeDislikeUpdated = Event3<ProcessHandle, Boolean, Boolean>(); val onLikeDislikeUpdated = Event1<OnLikeDislikeUpdatedArgs>();
constructor(context : Context, attrs : AttributeSet?) : super(context, attrs) { constructor(context : Context, attrs : AttributeSet?) : super(context, attrs) {
LayoutInflater.from(context).inflate(R.layout.rating_likesdislikes, this, true); LayoutInflater.from(context).inflate(R.layout.rating_likesdislikes, this, true);
@ -76,7 +85,7 @@ class PillRatingLikesDislikes : LinearLayout {
_textLikes.text = _likes.toHumanNumber(); _textLikes.text = _likes.toHumanNumber();
updateColors(); updateColors();
onLikeDislikeUpdated.emit(processHandle, _hasLiked, _hasDisliked); onLikeDislikeUpdated.emit(OnLikeDislikeUpdatedArgs(processHandle, _likes, _hasLiked, _dislikes, _hasDisliked));
} }
fun dislike(processHandle: ProcessHandle) { fun dislike(processHandle: ProcessHandle) {
@ -96,7 +105,7 @@ class PillRatingLikesDislikes : LinearLayout {
_textDislikes.text = _dislikes.toHumanNumber(); _textDislikes.text = _dislikes.toHumanNumber();
updateColors(); updateColors();
onLikeDislikeUpdated.emit(processHandle, _hasLiked, _hasDisliked); onLikeDislikeUpdated.emit(OnLikeDislikeUpdatedArgs(processHandle, _likes, _hasLiked, _dislikes, _hasDisliked));
} }
private fun updateColors() { private fun updateColors() {

@ -1 +1 @@
Subproject commit 1c34bb016378805ca24883ed55573dcd862309cf Subproject commit eff873edf344663f7dd2741ea9f1b8eca17afa24

@ -1 +1 @@
Subproject commit 0a0b84437015cb282fae49e60ae69afe1b45768d Subproject commit 29665c24a1f645b17ee92d25018dc96b558235fe

@ -1 +1 @@
Subproject commit 636d17f0adb112c4ad139b71aac2eef652e04036 Subproject commit 1079dd394f71921a968509bc16292ac1e80e3f9c