Merge pull request #485 from FineFindus/feat/draft-improvements
feat(Draft): display ScheduledStatus highlighted and formatted
This commit is contained in:
commit
07ab3c394a
|
@ -85,7 +85,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
|
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
|
||||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, null,
|
return StatusDisplayItem.buildItems(this, s.toFormattedStatus(accountID), accountID, s, knownAccounts, null,
|
||||||
StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS |
|
StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS |
|
||||||
StatusDisplayItem.FLAG_NO_FOOTER |
|
StatusDisplayItem.FLAG_NO_FOOTER |
|
||||||
StatusDisplayItem.FLAG_NO_TRANSLATE);
|
StatusDisplayItem.FLAG_NO_TRANSLATE);
|
||||||
|
|
|
@ -1,17 +1,27 @@
|
||||||
package org.joinmastodon.android.model;
|
package org.joinmastodon.android.model;
|
||||||
|
|
||||||
|
import android.util.Patterns;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import org.joinmastodon.android.api.ObjectValidationException;
|
import org.joinmastodon.android.api.ObjectValidationException;
|
||||||
import org.joinmastodon.android.api.RequiredField;
|
import org.joinmastodon.android.api.RequiredField;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSession;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.model.Poll.Option;
|
import org.joinmastodon.android.model.Poll.Option;
|
||||||
import org.parceler.Parcel;
|
import org.parceler.Parcel;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Parcel
|
@Parcel
|
||||||
public class ScheduledStatus extends BaseModel implements DisplayItemsParent{
|
public class ScheduledStatus extends BaseModel implements DisplayItemsParent{
|
||||||
|
private static final Pattern HIGHLIGHT_PATTER=Pattern.compile("(?<!\\w)(?:@([a-z0-9_]+)(@[a-z0-9_\\.\\-]*)?|#([^\\s.]+)|:([a-z0-9_]+))|" +Patterns.WEB_URL, Pattern.CASE_INSENSITIVE);
|
||||||
|
|
||||||
@RequiredField
|
@RequiredField
|
||||||
public String id;
|
public String id;
|
||||||
@RequiredField
|
@RequiredField
|
||||||
|
@ -87,7 +97,61 @@ public class ScheduledStatus extends BaseModel implements DisplayItemsParent{
|
||||||
s.visibility=params.visibility;
|
s.visibility=params.visibility;
|
||||||
s.language=params.language;
|
s.language=params.language;
|
||||||
s.sensitive=params.sensitive;
|
s.sensitive=params.sensitive;
|
||||||
|
// hide media preview only if status is marked as sensitive
|
||||||
|
s.sensitiveRevealed=!params.sensitive;
|
||||||
if(params.poll!=null) s.poll=params.poll.toPoll();
|
if(params.poll!=null) s.poll=params.poll.toPoll();
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a fake status, which has (somewhat) correctly formatted mentions, hashtags and URLs.
|
||||||
|
*
|
||||||
|
* @param accountID the ID of the account
|
||||||
|
* @return the formatted Status object
|
||||||
|
*/
|
||||||
|
public Status toFormattedStatus(String accountID){
|
||||||
|
AccountSession self=AccountSessionManager.get(accountID);
|
||||||
|
Status s=this.toStatus();
|
||||||
|
// the mastodon api does not return formatted (html) content, only the raw content, so we modify it
|
||||||
|
s.content=s.content.replace("\n", "<br>");
|
||||||
|
if(!s.content.contains("@") && !s.content.contains("#") && !s.content.contains(":"))
|
||||||
|
return s;
|
||||||
|
|
||||||
|
StringBuffer sb=new StringBuffer();
|
||||||
|
Matcher matcher=HIGHLIGHT_PATTER.matcher(s.content);
|
||||||
|
|
||||||
|
// I'm sure this will cause problems at some point...
|
||||||
|
while(matcher.find()){
|
||||||
|
String content=matcher.group();
|
||||||
|
String href="";
|
||||||
|
// add relevant links, so on-click actions work
|
||||||
|
// hashtags are done by the parser
|
||||||
|
if(content.startsWith("@"))
|
||||||
|
href=" href=\""+formatMention(content, self.domain)+"\" class=\"u-url mention\"";
|
||||||
|
else if(content.startsWith("https://"))
|
||||||
|
href=" href=\""+content+"\"";
|
||||||
|
|
||||||
|
matcher.appendReplacement(sb, "<a"+href+">"+content+"</a>");
|
||||||
|
}
|
||||||
|
matcher.appendTail(sb);
|
||||||
|
s.content=sb.toString();
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a string mention into a URL of the account.
|
||||||
|
* @param mention Mention in the form a of user name with an optional instance URL
|
||||||
|
* @param instanceURL URL of the home instance of the user
|
||||||
|
* @return Formatted HTML or the mention
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
private static String formatMention(@NonNull String mention, @NonNull String instanceURL){
|
||||||
|
String[] parts=mention.split("@");
|
||||||
|
if(parts.length>1){
|
||||||
|
String username=parts[1];
|
||||||
|
String domain=parts.length==3 ? parts[2] : instanceURL;
|
||||||
|
return "https://"+domain+"/@"+username;
|
||||||
|
}
|
||||||
|
return mention;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue