Merge branch 'master' of https://github.com/LucasGGamerM/moshidon
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
|
||||
## F.A.Q
|
||||
|
||||
### Q: What are the main differences between this app and Megalodon?
|
||||
### Q: What are the main differences between Moshidon and Megalodon?
|
||||
|
||||
### A: There are many, but the most outstanding differences are: the ability to have other server's local timeline inside the app. It can be acessed in the "Add community" option in the top right corner of the Edit timelines screen. Most other features are pretty minor, such as profile notes directly available in the person's profile. Other features are quite minor usability and visibility improvements. All of which can be found in the settings page.
|
||||
|
||||
|
||||
@@ -4,8 +4,15 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
|
||||
public class SetAccountMuted extends MastodonAPIRequest<Relationship>{
|
||||
public SetAccountMuted(String id, boolean muted){
|
||||
public SetAccountMuted(String id, boolean muted, long duration){
|
||||
super(HttpMethod.POST, "/accounts/"+id+"/"+(muted ? "mute" : "unmute"), Relationship.class);
|
||||
setRequestBody(new Object());
|
||||
setRequestBody(muted ? new Request(duration): new Object());
|
||||
}
|
||||
|
||||
private static class Request{
|
||||
public long duration;
|
||||
public Request(long duration){
|
||||
this.duration=duration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,9 @@ import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.SubMenu;
|
||||
@@ -99,6 +101,7 @@ import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
@@ -109,6 +112,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
@@ -464,12 +468,45 @@ public class UiUtils{
|
||||
}
|
||||
|
||||
public static void confirmToggleMuteUser(Activity activity, String accountID, Account account, boolean currentlyMuted, Consumer<Relationship> resultCallback){
|
||||
showConfirmationAlert(activity, activity.getString(currentlyMuted ? R.string.confirm_unmute_title : R.string.confirm_mute_title),
|
||||
activity.getString(currentlyMuted ? R.string.confirm_unmute : R.string.confirm_mute, account.displayName),
|
||||
activity.getString(currentlyMuted ? R.string.do_unmute : R.string.do_mute),
|
||||
currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular,
|
||||
()->{
|
||||
new SetAccountMuted(account.id, !currentlyMuted)
|
||||
View menu = LayoutInflater.from(activity).inflate(R.layout.item_mute_duration, null);
|
||||
Button button = menu.findViewById(R.id.button);
|
||||
|
||||
AtomicReference<Duration> muteDuration = new AtomicReference<>(Duration.ZERO);
|
||||
|
||||
PopupMenu popupMenu=new PopupMenu(activity, button, Gravity.CENTER_HORIZONTAL);
|
||||
popupMenu.inflate(R.menu.mute_duration);
|
||||
popupMenu.setOnMenuItemClickListener(item -> {
|
||||
int id = item.getItemId();
|
||||
if (id == R.id.duration_indefinite)
|
||||
muteDuration.set(Duration.ZERO);
|
||||
else if (id == R.id.duration_minutes_5) {
|
||||
muteDuration.set(Duration.ofMinutes(5));
|
||||
}else if (id == R.id.duration_minutes_30) {
|
||||
muteDuration.set(Duration.ofMinutes(30));
|
||||
}else if (id == R.id.duration_hours_1) {
|
||||
muteDuration.set(Duration.ofHours(1));
|
||||
}else if (id == R.id.duration_hours_6) {
|
||||
muteDuration.set(Duration.ofHours(6));
|
||||
}else if (id == R.id.duration_days_1) {
|
||||
muteDuration.set(Duration.ofDays(1));
|
||||
}else if (id == R.id.duration_days_3) {
|
||||
muteDuration.set(Duration.ofDays(3));
|
||||
}else if (id == R.id.duration_days_7) {
|
||||
muteDuration.set(Duration.ofDays(7));
|
||||
}
|
||||
button.setText(item.getTitle());
|
||||
return true;
|
||||
});
|
||||
button.setOnTouchListener(popupMenu.getDragToOpenListener());
|
||||
button.setOnClickListener(v->popupMenu.show());
|
||||
button.setText(popupMenu.getMenu().getItem(0).getTitle());
|
||||
|
||||
new M3AlertDialogBuilder(activity)
|
||||
.setTitle(activity.getString(currentlyMuted ? R.string.confirm_unmute_title : R.string.confirm_mute_title))
|
||||
.setMessage(activity.getString(currentlyMuted ? R.string.confirm_unmute : R.string.confirm_mute, account.displayName))
|
||||
.setView(currentlyMuted ? null : menu)
|
||||
.setPositiveButton(activity.getString(currentlyMuted ? R.string.do_unmute : R.string.do_mute), (dlg, i)-> {
|
||||
new SetAccountMuted(account.id, !currentlyMuted, muteDuration.get().getSeconds())
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(Relationship result){
|
||||
@@ -486,7 +523,10 @@ public class UiUtils{
|
||||
})
|
||||
.wrapProgress(activity, R.string.loading, false)
|
||||
.exec(accountID);
|
||||
});
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setIcon(currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular)
|
||||
.show();
|
||||
}
|
||||
public static void confirmDeletePost(Activity activity, String accountID, Status status, Consumer<Status> resultCallback){
|
||||
confirmDeletePost(activity, accountID, status, resultCallback, false);
|
||||
|
||||
34
mastodon/src/main/res/layout/item_mute_duration.xml
Normal file
34
mastodon/src/main/res/layout/item_mute_duration.xml
Normal file
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
android:gravity="center"
|
||||
android:paddingVertical="12dp">
|
||||
|
||||
<TextView
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:text="@string/mo_mute_label"
|
||||
android:textSize="16sp"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="32dp"
|
||||
android:layout_weight="0"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:maxWidth="140dp"
|
||||
android:background="@drawable/bg_inline_button"
|
||||
android:elevation="0dp"
|
||||
android:ellipsize="middle"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:singleLine="true"
|
||||
android:stateListAnimator="@null"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="16sp"
|
||||
android:text="Duration" />
|
||||
</LinearLayout>
|
||||
11
mastodon/src/main/res/menu/mute_duration.xml
Normal file
11
mastodon/src/main/res/menu/mute_duration.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/duration_indefinite" android:title="@string/mo_duration_indefinite" />
|
||||
<item android:id="@+id/duration_minutes_5" android:title="@string/mo_duration_minutes_5"/>
|
||||
<item android:id="@+id/duration_minutes_30" android:title="@string/mo_duration_minutes_30"/>
|
||||
<item android:id="@+id/duration_hours_1" android:title="@string/mo_duration_hours_1"/>
|
||||
<item android:id="@+id/duration_hours_6" android:title="@string/mo_duration_hours_6"/>
|
||||
<item android:id="@+id/duration_days_1" android:title="@string/mo_duration_days_1"/>
|
||||
<item android:id="@+id/duration_days_3" android:title="@string/mo_duration_days_3"/>
|
||||
<item android:id="@+id/duration_days_7" android:title="@string/mo_duration_days_7"/>
|
||||
</menu>
|
||||
@@ -34,4 +34,16 @@
|
||||
<string name="mo_fab_compose">Compose</string>
|
||||
<string name="mo_sending_error">Error publishing</string>
|
||||
|
||||
<!-- duration labels-->
|
||||
<string name="mo_mute_label">Duration:</string>
|
||||
<string name="mo_duration_indefinite">Indefinite</string>
|
||||
<string name="mo_duration_minutes_5">5 minutes</string>
|
||||
<string name="mo_duration_minutes_30">30 minutes</string>
|
||||
<string name="mo_duration_hours_1">1 hour</string>
|
||||
<string name="mo_duration_hours_6">6 hours</string>
|
||||
<string name="mo_duration_days_1">1 day</string>
|
||||
<string name="mo_duration_days_3">3 days</string>
|
||||
<string name="mo_duration_days_7">7 day</string>
|
||||
|
||||
|
||||
</resources>
|
||||
Reference in New Issue
Block a user