Loading app/src/main/java/app/fedilab/android/activities/ProfileActivity.java +34 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package app.fedilab.android.activities; import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction; import android.content.BroadcastReceiver; import android.content.ClipData; Loading Loading @@ -117,6 +118,7 @@ public class ProfileActivity extends BaseActivity { private String mention_str; private WellKnownNodeinfo.NodeInfo nodeInfo; private boolean checkRemotely; private boolean homeMuted; private final BroadcastReceiver broadcast_data = new BroadcastReceiver() { @Override Loading Loading @@ -144,6 +146,7 @@ public class ProfileActivity extends BaseActivity { Bundle b = getIntent().getExtras(); binding.accountFollow.setEnabled(false); checkRemotely = false; homeMuted = false; if (b != null) { account = (Account) b.getSerializable(Helper.ARG_ACCOUNT); account_id = b.getString(Helper.ARG_USER_ID, null); Loading Loading @@ -185,6 +188,8 @@ public class ProfileActivity extends BaseActivity { Toasty.error(ProfileActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); finish(); } //Check if account is homeMuted accountsVM.isMuted(currentAccount, account).observe(ProfileActivity.this, account1 -> homeMuted = account1 != null); LocalBroadcastManager.getInstance(ProfileActivity.this).registerReceiver(broadcast_data, new IntentFilter(Helper.BROADCAST_DATA)); } Loading Loading @@ -685,9 +690,11 @@ public class ProfileActivity extends BaseActivity { menu.findItem(R.id.action_endorse).setVisible(false); menu.findItem(R.id.action_direct_message).setVisible(false); menu.findItem(R.id.action_add_to_list).setVisible(false); menu.findItem(R.id.action_mute_home).setVisible(false); } else { menu.findItem(R.id.action_block).setVisible(true); menu.findItem(R.id.action_mute).setVisible(true); menu.findItem(R.id.action_mute_home).setVisible(true); menu.findItem(R.id.action_timed_mute).setVisible(true); menu.findItem(R.id.action_mention).setVisible(true); } Loading @@ -696,6 +703,7 @@ public class ProfileActivity extends BaseActivity { if (!relationship.following) { menu.findItem(R.id.action_hide_boost).setVisible(false); menu.findItem(R.id.action_endorse).setVisible(false); menu.findItem(R.id.action_mute_home).setVisible(false); } if (relationship.blocking) { menu.findItem(R.id.action_block).setTitle(R.string.action_unblock); Loading @@ -713,6 +721,11 @@ public class ProfileActivity extends BaseActivity { } else { menu.findItem(R.id.action_hide_boost).setTitle(getString(R.string.show_boost, account.username)); } if (homeMuted) { menu.findItem(R.id.action_mute_home).setTitle(getString(R.string.unmute_home)); } else { menu.findItem(R.id.action_mute_home).setTitle(getString(R.string.mute_home)); } } } return true; Loading Loading @@ -989,6 +1002,27 @@ public class ProfileActivity extends BaseActivity { }); builderInner.show(); } } else if (itemId == R.id.action_mute_home) { AlertDialog.Builder builderInner = new AlertDialog.Builder(ProfileActivity.this, Helper.dialogStyle()); builderInner.setMessage(account.acct); builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); if (homeMuted) { builderInner.setTitle(R.string.unmute_home); builderInner.setPositiveButton(R.string.action_unmute, (dialog, which) -> accountsVM.unmuteHome(currentAccount, account) .observe(ProfileActivity.this, account -> { homeMuted = false; Toasty.info(ProfileActivity.this, getString(R.string.toast_unmute), Toasty.LENGTH_LONG).show(); })); } else { builderInner.setTitle(R.string.mute_home); builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> accountsVM.muteHome(currentAccount, account) .observe(ProfileActivity.this, account -> { homeMuted = true; sendAction(ProfileActivity.this, Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, account.id); Toasty.info(ProfileActivity.this, getString(R.string.toast_mute), Toasty.LENGTH_LONG).show(); })); } builderInner.show(); } else if (itemId == R.id.action_timed_mute) { MastodonHelper.scheduleBoost(ProfileActivity.this, MastodonHelper.ScheduleType.TIMED_MUTED, null, account, rs -> { this.relationship = rs; Loading app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java +22 −0 Original line number Diff line number Diff line Loading @@ -180,6 +180,28 @@ public class MutedAccounts implements Serializable { } } /** * Check if an account is muted in db * * @param forAccount {@link BaseAccount} * @param target {@link Account} * @return MutedAccounts - {@link MutedAccounts} */ public boolean isMuted(BaseAccount forAccount, Account target) throws DBException { if (db == null) { throw new DBException("db is null. Wrong initialization."); } MutedAccounts mutedAccounts = getMutedAccount(forAccount); if (mutedAccounts != null && mutedAccounts.accounts != null) { for (Account account : mutedAccounts.accounts) { if (account.id.equals(target.id)) { return true; } } } return false; } /** * Returns the MutedAccounts for an account * Loading app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +11 −0 Original line number Diff line number Diff line Loading @@ -1655,6 +1655,17 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show(); })); builderInner.show(); } else if (itemId == R.id.action_mute_home) { AlertDialog.Builder builderInner = new AlertDialog.Builder(context, Helper.dialogStyle()); builderInner.setTitle(R.string.mute_home); builderInner.setMessage(statusToDeal.account.acct); builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> accountsVM.muteHome(currentAccount, statusToDeal.account) .observe((LifecycleOwner) context, account -> { sendAction(context, Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, statusToDeal.account.id); Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show(); })); builderInner.show(); } else if (itemId == R.id.action_mute_conversation) { if (statusToDeal.muted) { statusesVM.unMute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id).observe((LifecycleOwner) context, status1 -> Toasty.info(context, context.getString(R.string.toast_unmute_conversation)).show()); Loading app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java +67 −0 Original line number Diff line number Diff line Loading @@ -52,7 +52,10 @@ import app.fedilab.android.client.entities.api.Suggestion; import app.fedilab.android.client.entities.api.Suggestions; import app.fedilab.android.client.entities.api.Tag; import app.fedilab.android.client.entities.api.Token; import app.fedilab.android.client.entities.app.BaseAccount; import app.fedilab.android.client.entities.app.MutedAccounts; import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.exception.DBException; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import okhttp3.MultipartBody; Loading Loading @@ -748,6 +751,70 @@ public class AccountsVM extends AndroidViewModel { return relationShipMutableLiveData; } /** * Mute the given account in db * * @return {@link LiveData} containing the {@link Account} to the given account */ public LiveData<Account> isMuted(@NonNull BaseAccount forAccount, @NonNull Account target) { accountMutableLiveData = new MutableLiveData<>(); new Thread(() -> { boolean isMuted = false; try { isMuted = new MutedAccounts(getApplication().getApplicationContext()).isMuted(forAccount, target); } catch (DBException e) { e.printStackTrace(); } Handler mainHandler = new Handler(Looper.getMainLooper()); boolean finalIsMuted = isMuted; Runnable myRunnable = () -> accountMutableLiveData.setValue(finalIsMuted ? target : null); mainHandler.post(myRunnable); }).start(); return accountMutableLiveData; } /** * Mute the given account in db * * @return {@link LiveData} containing the {@link Account} to the given account */ public LiveData<Account> muteHome(@NonNull BaseAccount forAccount, @NonNull Account target) { accountMutableLiveData = new MutableLiveData<>(); new Thread(() -> { try { new MutedAccounts(getApplication().getApplicationContext()).muteAccount(forAccount, target); } catch (DBException e) { e.printStackTrace(); } Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> accountMutableLiveData.setValue(target); mainHandler.post(myRunnable); }).start(); return accountMutableLiveData; } /** * Unmute the given account in db * * @return {@link LiveData} containing the {@link Account} to the given account */ public LiveData<Account> unmuteHome(@NonNull BaseAccount forAccount, @NonNull Account target) { accountMutableLiveData = new MutableLiveData<>(); new Thread(() -> { try { new MutedAccounts(getApplication().getApplicationContext()).unMuteAccount(forAccount, target); } catch (DBException e) { e.printStackTrace(); } Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> accountMutableLiveData.setValue(target); mainHandler.post(myRunnable); }).start(); return accountMutableLiveData; } /** * Unmute the given account. * Loading app/src/main/res/menu/activity_profile.xml +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,11 @@ android:icon="@drawable/ic_baseline_open_with_24" android:title="@string/action_open_in_web" app:showAsAction="never" /> <item android:id="@+id/action_mute_home" android:icon="@drawable/ic_baseline_volume_mute_24" android:title="@string/mute_home" app:showAsAction="never" /> <item android:id="@+id/action_mute" android:icon="@drawable/ic_baseline_volume_mute_24" Loading Loading
app/src/main/java/app/fedilab/android/activities/ProfileActivity.java +34 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package app.fedilab.android.activities; import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction; import android.content.BroadcastReceiver; import android.content.ClipData; Loading Loading @@ -117,6 +118,7 @@ public class ProfileActivity extends BaseActivity { private String mention_str; private WellKnownNodeinfo.NodeInfo nodeInfo; private boolean checkRemotely; private boolean homeMuted; private final BroadcastReceiver broadcast_data = new BroadcastReceiver() { @Override Loading Loading @@ -144,6 +146,7 @@ public class ProfileActivity extends BaseActivity { Bundle b = getIntent().getExtras(); binding.accountFollow.setEnabled(false); checkRemotely = false; homeMuted = false; if (b != null) { account = (Account) b.getSerializable(Helper.ARG_ACCOUNT); account_id = b.getString(Helper.ARG_USER_ID, null); Loading Loading @@ -185,6 +188,8 @@ public class ProfileActivity extends BaseActivity { Toasty.error(ProfileActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); finish(); } //Check if account is homeMuted accountsVM.isMuted(currentAccount, account).observe(ProfileActivity.this, account1 -> homeMuted = account1 != null); LocalBroadcastManager.getInstance(ProfileActivity.this).registerReceiver(broadcast_data, new IntentFilter(Helper.BROADCAST_DATA)); } Loading Loading @@ -685,9 +690,11 @@ public class ProfileActivity extends BaseActivity { menu.findItem(R.id.action_endorse).setVisible(false); menu.findItem(R.id.action_direct_message).setVisible(false); menu.findItem(R.id.action_add_to_list).setVisible(false); menu.findItem(R.id.action_mute_home).setVisible(false); } else { menu.findItem(R.id.action_block).setVisible(true); menu.findItem(R.id.action_mute).setVisible(true); menu.findItem(R.id.action_mute_home).setVisible(true); menu.findItem(R.id.action_timed_mute).setVisible(true); menu.findItem(R.id.action_mention).setVisible(true); } Loading @@ -696,6 +703,7 @@ public class ProfileActivity extends BaseActivity { if (!relationship.following) { menu.findItem(R.id.action_hide_boost).setVisible(false); menu.findItem(R.id.action_endorse).setVisible(false); menu.findItem(R.id.action_mute_home).setVisible(false); } if (relationship.blocking) { menu.findItem(R.id.action_block).setTitle(R.string.action_unblock); Loading @@ -713,6 +721,11 @@ public class ProfileActivity extends BaseActivity { } else { menu.findItem(R.id.action_hide_boost).setTitle(getString(R.string.show_boost, account.username)); } if (homeMuted) { menu.findItem(R.id.action_mute_home).setTitle(getString(R.string.unmute_home)); } else { menu.findItem(R.id.action_mute_home).setTitle(getString(R.string.mute_home)); } } } return true; Loading Loading @@ -989,6 +1002,27 @@ public class ProfileActivity extends BaseActivity { }); builderInner.show(); } } else if (itemId == R.id.action_mute_home) { AlertDialog.Builder builderInner = new AlertDialog.Builder(ProfileActivity.this, Helper.dialogStyle()); builderInner.setMessage(account.acct); builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); if (homeMuted) { builderInner.setTitle(R.string.unmute_home); builderInner.setPositiveButton(R.string.action_unmute, (dialog, which) -> accountsVM.unmuteHome(currentAccount, account) .observe(ProfileActivity.this, account -> { homeMuted = false; Toasty.info(ProfileActivity.this, getString(R.string.toast_unmute), Toasty.LENGTH_LONG).show(); })); } else { builderInner.setTitle(R.string.mute_home); builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> accountsVM.muteHome(currentAccount, account) .observe(ProfileActivity.this, account -> { homeMuted = true; sendAction(ProfileActivity.this, Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, account.id); Toasty.info(ProfileActivity.this, getString(R.string.toast_mute), Toasty.LENGTH_LONG).show(); })); } builderInner.show(); } else if (itemId == R.id.action_timed_mute) { MastodonHelper.scheduleBoost(ProfileActivity.this, MastodonHelper.ScheduleType.TIMED_MUTED, null, account, rs -> { this.relationship = rs; Loading
app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java +22 −0 Original line number Diff line number Diff line Loading @@ -180,6 +180,28 @@ public class MutedAccounts implements Serializable { } } /** * Check if an account is muted in db * * @param forAccount {@link BaseAccount} * @param target {@link Account} * @return MutedAccounts - {@link MutedAccounts} */ public boolean isMuted(BaseAccount forAccount, Account target) throws DBException { if (db == null) { throw new DBException("db is null. Wrong initialization."); } MutedAccounts mutedAccounts = getMutedAccount(forAccount); if (mutedAccounts != null && mutedAccounts.accounts != null) { for (Account account : mutedAccounts.accounts) { if (account.id.equals(target.id)) { return true; } } } return false; } /** * Returns the MutedAccounts for an account * Loading
app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +11 −0 Original line number Diff line number Diff line Loading @@ -1655,6 +1655,17 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show(); })); builderInner.show(); } else if (itemId == R.id.action_mute_home) { AlertDialog.Builder builderInner = new AlertDialog.Builder(context, Helper.dialogStyle()); builderInner.setTitle(R.string.mute_home); builderInner.setMessage(statusToDeal.account.acct); builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> accountsVM.muteHome(currentAccount, statusToDeal.account) .observe((LifecycleOwner) context, account -> { sendAction(context, Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, statusToDeal.account.id); Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show(); })); builderInner.show(); } else if (itemId == R.id.action_mute_conversation) { if (statusToDeal.muted) { statusesVM.unMute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id).observe((LifecycleOwner) context, status1 -> Toasty.info(context, context.getString(R.string.toast_unmute_conversation)).show()); Loading
app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java +67 −0 Original line number Diff line number Diff line Loading @@ -52,7 +52,10 @@ import app.fedilab.android.client.entities.api.Suggestion; import app.fedilab.android.client.entities.api.Suggestions; import app.fedilab.android.client.entities.api.Tag; import app.fedilab.android.client.entities.api.Token; import app.fedilab.android.client.entities.app.BaseAccount; import app.fedilab.android.client.entities.app.MutedAccounts; import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.exception.DBException; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import okhttp3.MultipartBody; Loading Loading @@ -748,6 +751,70 @@ public class AccountsVM extends AndroidViewModel { return relationShipMutableLiveData; } /** * Mute the given account in db * * @return {@link LiveData} containing the {@link Account} to the given account */ public LiveData<Account> isMuted(@NonNull BaseAccount forAccount, @NonNull Account target) { accountMutableLiveData = new MutableLiveData<>(); new Thread(() -> { boolean isMuted = false; try { isMuted = new MutedAccounts(getApplication().getApplicationContext()).isMuted(forAccount, target); } catch (DBException e) { e.printStackTrace(); } Handler mainHandler = new Handler(Looper.getMainLooper()); boolean finalIsMuted = isMuted; Runnable myRunnable = () -> accountMutableLiveData.setValue(finalIsMuted ? target : null); mainHandler.post(myRunnable); }).start(); return accountMutableLiveData; } /** * Mute the given account in db * * @return {@link LiveData} containing the {@link Account} to the given account */ public LiveData<Account> muteHome(@NonNull BaseAccount forAccount, @NonNull Account target) { accountMutableLiveData = new MutableLiveData<>(); new Thread(() -> { try { new MutedAccounts(getApplication().getApplicationContext()).muteAccount(forAccount, target); } catch (DBException e) { e.printStackTrace(); } Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> accountMutableLiveData.setValue(target); mainHandler.post(myRunnable); }).start(); return accountMutableLiveData; } /** * Unmute the given account in db * * @return {@link LiveData} containing the {@link Account} to the given account */ public LiveData<Account> unmuteHome(@NonNull BaseAccount forAccount, @NonNull Account target) { accountMutableLiveData = new MutableLiveData<>(); new Thread(() -> { try { new MutedAccounts(getApplication().getApplicationContext()).unMuteAccount(forAccount, target); } catch (DBException e) { e.printStackTrace(); } Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> accountMutableLiveData.setValue(target); mainHandler.post(myRunnable); }).start(); return accountMutableLiveData; } /** * Unmute the given account. * Loading
app/src/main/res/menu/activity_profile.xml +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,11 @@ android:icon="@drawable/ic_baseline_open_with_24" android:title="@string/action_open_in_web" app:showAsAction="never" /> <item android:id="@+id/action_mute_home" android:icon="@drawable/ic_baseline_volume_mute_24" android:title="@string/mute_home" app:showAsAction="never" /> <item android:id="@+id/action_mute" android:icon="@drawable/ic_baseline_volume_mute_24" Loading