diff --git a/README.md b/README.md
index ea42ffc1c..157d1a88a 100644
--- a/README.md
+++ b/README.md
@@ -38,6 +38,6 @@ For reporting issues, visit [Framagit](https://framagit.org/tom79/fedilab/issues
-Lead developer: [toot.fedilab.app/@fedilab](https://toot.fedilab.app/@fedilab)
+Lead developer: [toot.fedilab.app/@apps](https://toot.fedilab.app/@apps)
diff --git a/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java b/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java
index e079def11..f0065dad5 100644
--- a/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java
+++ b/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java
@@ -162,6 +162,7 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
private ScheduledExecutorService scheduledExecutorService;
private action doAction;
private API.StatusAction doActionAccount;
+ ImageButton account_notification;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -191,6 +192,7 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
account_dn = findViewById(R.id.account_dn);
account_un = findViewById(R.id.account_un);
account_bot = findViewById(R.id.account_bot);
+ account_notification = findViewById(R.id.account_notification);
addToList = null;
account_pp.setBackgroundResource(R.drawable.account_pp_border);
if (b != null) {
@@ -740,11 +742,17 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
startActivity(intent);
}
});
+
//Follow button
String target = account.getId();
if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE)
target = account.getAcct();
String finalTarget = target;
+ account_notification.setOnClickListener(v -> {
+ if (relationship != null) {
+ new PostActionAsyncTask(ShowAccountActivity.this, relationship.isNotifying() ? API.StatusAction.UNNOTIFY_FOR_ACCOUNT : API.StatusAction.NOTIFY_FOR_ACCOUNT, finalTarget, ShowAccountActivity.this);
+ }
+ });
account_follow.setOnClickListener(v -> {
if (doAction == action.NOTHING) {
Toasty.info(ShowAccountActivity.this, getString(R.string.nothing_to_do), Toast.LENGTH_LONG).show();
@@ -951,6 +959,17 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
account_follow.setVisibility(View.GONE);
doAction = action.NOTHING;
}
+ if (!relationship.isFollowing()) {
+ account_notification.setVisibility(View.GONE);
+ } else {
+ account_notification.setVisibility(View.VISIBLE);
+ }
+ if (relationship.isNotifying()) {
+ account_notification.setImageResource(R.drawable.ic_baseline_notifications_account_yes);
+ } else {
+ account_notification.setImageResource(R.drawable.ic_baseline_notifications_account_none);
+ }
+
}
@Override
@@ -1520,24 +1539,21 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
return displayStatusFragment;
}
case 1:
+ DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment();
if (peertubeAccount) {
- DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment();
bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.CHANNELS);
bundle.putString("targetedid", account.getId());
bundle.putString("instance", Helper.getLiveInstance(ShowAccountActivity.this));
bundle.putString("name", account.getAcct());
- displayAccountsFragment.setArguments(bundle);
- return displayAccountsFragment;
} else {
- DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment();
bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.FOLLOWING);
bundle.putString("targetedid", account.getId());
- displayAccountsFragment.setArguments(bundle);
- return displayAccountsFragment;
}
+ displayAccountsFragment.setArguments(bundle);
+ return displayAccountsFragment;
default:
- DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment();
+ displayAccountsFragment = new DisplayAccountsFragment();
bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.FOLLOWERS);
bundle.putString("targetedid", account.getId());
displayAccountsFragment.setArguments(bundle);
diff --git a/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java
index 1b4765332..8a068f110 100644
--- a/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java
+++ b/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java
@@ -264,9 +264,11 @@ public class PostActionAsyncTask {
statusCode = gnuapi.postAction(apiAction, targetedId);
error = gnuapi.getError();
}
- Handler mainHandler = new Handler(Looper.getMainLooper());
- Runnable myRunnable = () -> listener.onPostAction(statusCode, apiAction, targetedId, error);
- mainHandler.post(myRunnable);
+ if (listener != null) {
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ Runnable myRunnable = () -> listener.onPostAction(statusCode, apiAction, targetedId, error);
+ mainHandler.post(myRunnable);
+ }
}).start();
}
diff --git a/app/src/main/java/app/fedilab/android/client/API.java b/app/src/main/java/app/fedilab/android/client/API.java
index 005825669..8603fb454 100644
--- a/app/src/main/java/app/fedilab/android/client/API.java
+++ b/app/src/main/java/app/fedilab/android/client/API.java
@@ -3642,7 +3642,7 @@ public class API {
List tmp_status = parseStatuses(context, new JSONArray(response));
if (tmp_status.size() > 0) {
for (Status status : tmp_status) {
- if (status.getAccount().getAcct().equals("fedilab")) {
+ if (status.getAccount().getAcct().equals("apps")) {
statuses.add(status);
}
}
@@ -4274,6 +4274,16 @@ public class API {
case FOLLOW:
action = String.format("/accounts/%s/follow", targetedId);
break;
+ case NOTIFY_FOR_ACCOUNT:
+ params = new HashMap<>();
+ params.put("notify", "true");
+ action = String.format("/accounts/%s/follow", targetedId);
+ break;
+ case UNNOTIFY_FOR_ACCOUNT:
+ params = new HashMap<>();
+ params.put("notify", "false");
+ action = String.format("/accounts/%s/follow", targetedId);
+ break;
case REMOTE_FOLLOW:
action = "/follows";
params = new HashMap<>();
@@ -4801,7 +4811,7 @@ public class API {
return apiResponse;
}
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
- boolean notif_follow, notif_add, notif_mention, notif_share, notif_poll;
+ boolean notif_follow, notif_add, notif_mention, notif_share, notif_poll, notif_status;
StringBuilder parameters = new StringBuilder();
//TODO: If pixelfed supports exclude_types this condition needs to be changed
if (type == DisplayNotificationsFragment.Type.ALL && MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) {
@@ -4811,12 +4821,14 @@ public class API {
notif_mention = sharedpreferences.getBoolean(Helper.SET_NOTIF_MENTION_FILTER, true);
notif_share = sharedpreferences.getBoolean(Helper.SET_NOTIF_SHARE_FILTER, true);
notif_poll = sharedpreferences.getBoolean(Helper.SET_NOTIF_POLL_FILTER, true);
+ notif_status = sharedpreferences.getBoolean(Helper.SET_NOTIF_STATUS_FILTER, true);
} else {
notif_follow = sharedpreferences.getBoolean(Helper.SET_NOTIF_FOLLOW, true);
notif_add = sharedpreferences.getBoolean(Helper.SET_NOTIF_ADD, true);
notif_mention = sharedpreferences.getBoolean(Helper.SET_NOTIF_MENTION, true);
notif_share = sharedpreferences.getBoolean(Helper.SET_NOTIF_SHARE, true);
notif_poll = sharedpreferences.getBoolean(Helper.SET_NOTIF_POLL, true);
+ notif_status = sharedpreferences.getBoolean(Helper.SET_NOTIF_STATUS, true);
}
@@ -4828,6 +4840,8 @@ public class API {
parameters.append("exclude_types[]=").append("favourite").append("&");
if (!notif_share)
parameters.append("exclude_types[]=").append("reblog").append("&");
+ if (!notif_status)
+ parameters.append("exclude_types[]=").append("status").append("&");
if (!notif_mention)
parameters.append("exclude_types[]=").append("mention").append("&");
if (!notif_poll)
@@ -4841,6 +4855,7 @@ public class API {
parameters.append("exclude_types[]=").append("follow_request").append("&");
parameters.append("exclude_types[]=").append("favourite").append("&");
parameters.append("exclude_types[]=").append("reblog").append("&");
+ parameters.append("exclude_types[]=").append("status").append("&");
parameters.append("exclude_types[]=").append("poll").append("&");
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
params.put("exclude_types[]", parameters.toString());
@@ -4848,6 +4863,7 @@ public class API {
parameters.append("exclude_types[]=").append("follow").append("&");
parameters.append("exclude_types[]=").append("follow_request").append("&");
parameters.append("exclude_types[]=").append("mention").append("&");
+ parameters.append("exclude_types[]=").append("status").append("&");
parameters.append("exclude_types[]=").append("reblog").append("&");
parameters.append("exclude_types[]=").append("poll").append("&");
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
@@ -4855,6 +4871,7 @@ public class API {
} else if (type == DisplayNotificationsFragment.Type.BOOST) {
parameters.append("exclude_types[]=").append("follow").append("&");
parameters.append("exclude_types[]=").append("follow_request").append("&");
+ parameters.append("exclude_types[]=").append("status").append("&");
parameters.append("exclude_types[]=").append("mention").append("&");
parameters.append("exclude_types[]=").append("favourite").append("&");
parameters.append("exclude_types[]=").append("poll").append("&");
@@ -4863,12 +4880,22 @@ public class API {
} else if (type == DisplayNotificationsFragment.Type.POLL) {
parameters.append("exclude_types[]=").append("reblog").append("&");
parameters.append("exclude_types[]=").append("follow").append("&");
+ parameters.append("exclude_types[]=").append("status").append("&");
parameters.append("exclude_types[]=").append("follow_request").append("&");
parameters.append("exclude_types[]=").append("mention").append("&");
parameters.append("exclude_types[]=").append("favourite").append("&");
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
params.put("exclude_types[]", parameters.toString());
} else if (type == DisplayNotificationsFragment.Type.FOLLOW) {
+ parameters.append("exclude_types[]=").append("status").append("&");
+ parameters.append("exclude_types[]=").append("reblog").append("&");
+ parameters.append("exclude_types[]=").append("mention").append("&");
+ parameters.append("exclude_types[]=").append("favourite").append("&");
+ parameters.append("exclude_types[]=").append("poll").append("&");
+ parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
+ params.put("exclude_types[]", parameters.toString());
+ } else if (type == DisplayNotificationsFragment.Type.STATUS) {
+ parameters.append("exclude_types[]=").append("follow").append("&");
parameters.append("exclude_types[]=").append("reblog").append("&");
parameters.append("exclude_types[]=").append("mention").append("&");
parameters.append("exclude_types[]=").append("favourite").append("&");
@@ -6081,6 +6108,17 @@ public class API {
} catch (Exception ignored) {
relationship.setBlocked_by(false);
}
+ try {
+ relationship.setDomain_blocking(resobj.getBoolean("domain_blocking"));
+ } catch (Exception ignored) {
+ relationship.setDomain_blocking(false);
+ }
+ relationship.setNote(resobj.getString("note"));
+ try {
+ relationship.setNotifying(resobj.getBoolean("notifying"));
+ } catch (Exception ignored) {
+ relationship.setNotifying(false);
+ }
relationship.setRequested(resobj.getBoolean("requested"));
} catch (JSONException e) {
setDefaultError(e);
@@ -6257,6 +6295,8 @@ public class API {
UNBLOCK,
FOLLOW,
UNFOLLOW,
+ NOTIFY_FOR_ACCOUNT,
+ UNNOTIFY_FOR_ACCOUNT,
CREATESTATUS,
UNSTATUS,
AUTHORIZE,
diff --git a/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java b/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java
index a59f94d7d..0487e5f3d 100644
--- a/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java
+++ b/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java
@@ -76,7 +76,7 @@ public class ManageTimelines {
private String currentFilter;
- private boolean notif_follow, notif_add, notif_mention, notif_share, notif_poll;
+ private boolean notif_follow, notif_add, notif_mention, notif_share, notif_poll, notif_status;
public static Type typeFromDb(String value) {
switch (value) {
@@ -387,18 +387,21 @@ public class ManageTimelines {
final MenuItem itemMention = menu.findItem(R.id.action_mention);
final MenuItem itemBoost = menu.findItem(R.id.action_boost);
final MenuItem itemPoll = menu.findItem(R.id.action_poll);
+ final MenuItem itemStatus = menu.findItem(R.id.action_status);
notif_follow = sharedpreferences.getBoolean(Helper.SET_NOTIF_FOLLOW_FILTER, true);
notif_add = sharedpreferences.getBoolean(Helper.SET_NOTIF_ADD_FILTER, true);
notif_mention = sharedpreferences.getBoolean(Helper.SET_NOTIF_MENTION_FILTER, true);
notif_share = sharedpreferences.getBoolean(Helper.SET_NOTIF_SHARE_FILTER, true);
notif_poll = sharedpreferences.getBoolean(Helper.SET_NOTIF_POLL_FILTER, true);
+ notif_status = sharedpreferences.getBoolean(Helper.SET_NOTIF_STATUS_FILTER, true);
itemFavourite.setChecked(notif_add);
itemFollow.setChecked(notif_follow);
itemMention.setChecked(notif_mention);
itemBoost.setChecked(notif_share);
- if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON)
+ if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) {
itemPoll.setChecked(notif_poll);
- else
+ itemStatus.setChecked(notif_status);
+ } else
itemPoll.setVisible(false);
popup.setOnDismissListener(menu1 -> {
@@ -423,42 +426,48 @@ public class ManageTimelines {
return false;
}
});
- switch (item.getItemId()) {
- case R.id.action_favorite:
- SharedPreferences.Editor editor = sharedpreferences.edit();
- notif_add = !notif_add;
- editor.putBoolean(Helper.SET_NOTIF_ADD_FILTER, notif_add);
- itemFavourite.setChecked(notif_add);
- editor.apply();
- break;
- case R.id.action_follow:
- editor = sharedpreferences.edit();
- notif_follow = !notif_follow;
- editor.putBoolean(Helper.SET_NOTIF_FOLLOW_FILTER, notif_follow);
- itemFollow.setChecked(notif_follow);
- editor.apply();
- break;
- case R.id.action_mention:
- editor = sharedpreferences.edit();
- notif_mention = !notif_mention;
- editor.putBoolean(Helper.SET_NOTIF_MENTION_FILTER, notif_mention);
- itemMention.setChecked(notif_mention);
- editor.apply();
- break;
- case R.id.action_boost:
- editor = sharedpreferences.edit();
- notif_share = !notif_share;
- editor.putBoolean(Helper.SET_NOTIF_SHARE_FILTER, notif_share);
- itemBoost.setChecked(notif_share);
- editor.apply();
- break;
- case R.id.action_poll:
- editor = sharedpreferences.edit();
- notif_poll = !notif_poll;
- editor.putBoolean(Helper.SET_NOTIF_POLL_FILTER, notif_poll);
- itemPoll.setChecked(notif_poll);
- editor.apply();
- break;
+ int itemId = item.getItemId();
+ if (itemId == R.id.action_favorite) {
+ SharedPreferences.Editor editor = sharedpreferences.edit();
+ notif_add = !notif_add;
+ editor.putBoolean(Helper.SET_NOTIF_ADD_FILTER, notif_add);
+ itemFavourite.setChecked(notif_add);
+ editor.apply();
+ } else if (itemId == R.id.action_follow) {
+ SharedPreferences.Editor editor;
+ editor = sharedpreferences.edit();
+ notif_follow = !notif_follow;
+ editor.putBoolean(Helper.SET_NOTIF_FOLLOW_FILTER, notif_follow);
+ itemFollow.setChecked(notif_follow);
+ editor.apply();
+ } else if (itemId == R.id.action_mention) {
+ SharedPreferences.Editor editor;
+ editor = sharedpreferences.edit();
+ notif_mention = !notif_mention;
+ editor.putBoolean(Helper.SET_NOTIF_MENTION_FILTER, notif_mention);
+ itemMention.setChecked(notif_mention);
+ editor.apply();
+ } else if (itemId == R.id.action_boost) {
+ SharedPreferences.Editor editor;
+ editor = sharedpreferences.edit();
+ notif_share = !notif_share;
+ editor.putBoolean(Helper.SET_NOTIF_SHARE_FILTER, notif_share);
+ itemBoost.setChecked(notif_share);
+ editor.apply();
+ } else if (itemId == R.id.action_poll) {
+ SharedPreferences.Editor editor;
+ editor = sharedpreferences.edit();
+ notif_poll = !notif_poll;
+ editor.putBoolean(Helper.SET_NOTIF_POLL_FILTER, notif_poll);
+ itemPoll.setChecked(notif_poll);
+ editor.apply();
+ } else if (itemId == R.id.action_status) {
+ SharedPreferences.Editor editor;
+ editor = sharedpreferences.edit();
+ notif_status = !notif_status;
+ editor.putBoolean(Helper.SET_NOTIF_STATUS_FILTER, notif_status);
+ itemStatus.setChecked(notif_status);
+ editor.apply();
}
return false;
});
diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Relationship.java b/app/src/main/java/app/fedilab/android/client/Entities/Relationship.java
index b57b7e472..14eae977e 100644
--- a/app/src/main/java/app/fedilab/android/client/Entities/Relationship.java
+++ b/app/src/main/java/app/fedilab/android/client/Entities/Relationship.java
@@ -25,12 +25,15 @@ public class Relationship {
private boolean following;
private boolean followed_by;
private boolean blocking;
+ private boolean domain_blocking;
private boolean muting;
private boolean requested;
private boolean muting_notifications;
private boolean endorsed;
private boolean showing_reblogs;
private boolean blocked_by;
+ private String note;
+ private boolean notifying;
public String getId() {
@@ -112,4 +115,28 @@ public class Relationship {
public void setBlocked_by(boolean blocked_by) {
this.blocked_by = blocked_by;
}
+
+ public boolean isDomain_blocking() {
+ return domain_blocking;
+ }
+
+ public void setDomain_blocking(boolean domain_blocking) {
+ this.domain_blocking = domain_blocking;
+ }
+
+ public String getNote() {
+ return note;
+ }
+
+ public void setNote(String note) {
+ this.note = note;
+ }
+
+ public boolean isNotifying() {
+ return notifying;
+ }
+
+ public void setNotifying(boolean notifying) {
+ this.notifying = notifying;
+ }
}
diff --git a/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java b/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java
index dbb7dbd3c..893082aa7 100644
--- a/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java
+++ b/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java
@@ -607,6 +607,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot
boolean notif_mention = sharedpreferences.getBoolean(Helper.SET_NOTIF_MENTION, true);
boolean notif_share = sharedpreferences.getBoolean(Helper.SET_NOTIF_SHARE, true);
boolean notif_poll = sharedpreferences.getBoolean(Helper.SET_NOTIF_POLL, true);
+ boolean notif_status = sharedpreferences.getBoolean(Helper.SET_NOTIF_STATUS, true);
boolean notif_wifi = sharedpreferences.getBoolean(Helper.SET_WIFI_ONLY, false);
boolean notif_silent = sharedpreferences.getBoolean(Helper.SET_NOTIF_SILENT, false);
@@ -621,7 +622,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot
final SwitchCompat set_notif_follow_mention = rootView.findViewById(R.id.set_notif_follow_mention);
final SwitchCompat set_notif_follow_share = rootView.findViewById(R.id.set_notif_follow_share);
final SwitchCompat set_notif_follow_poll = rootView.findViewById(R.id.set_notif_follow_poll);
-
+ final SwitchCompat set_notif_status = rootView.findViewById(R.id.set_notif_status);
final SwitchCompat switchCompatWIFI = rootView.findViewById(R.id.set_wifi_only);
final SwitchCompat switchCompatSilent = rootView.findViewById(R.id.set_silence);
@@ -637,6 +638,8 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot
final Button sound_poll = rootView.findViewById(R.id.sound_poll);
final Button sound_backup = rootView.findViewById(R.id.sound_backup);
final Button sound_media = rootView.findViewById(R.id.sound_media);
+ final Button sound_status = rootView.findViewById(R.id.sound_status);
+
final ImageButton set_hide_status_bar = rootView.findViewById(R.id.set_hide_status_bar);
Button set_notif_sound = rootView.findViewById(R.id.set_notif_sound);
@@ -703,6 +706,12 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot
intent.putExtra(Settings.EXTRA_CHANNEL_ID, "channel_store");
startActivity(intent);
});
+ sound_status.setOnClickListener(v -> {
+ Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
+ intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
+ intent.putExtra(Settings.EXTRA_CHANNEL_ID, "channel_status");
+ startActivity(intent);
+ });
} else {
set_notif_sound.setVisibility(View.VISIBLE);
channels_container.setVisibility(View.GONE);
@@ -817,7 +826,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot
set_notif_follow_mention.setChecked(notif_mention);
set_notif_follow_share.setChecked(notif_share);
set_notif_follow_poll.setChecked(notif_poll);
-
+ set_notif_status.setChecked(notif_status);
switchCompatWIFI.setChecked(notif_wifi);
switchCompatSilent.setChecked(notif_silent);
@@ -848,7 +857,11 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot
editor.putBoolean(Helper.SET_NOTIF_POLL, set_notif_follow_poll.isChecked());
editor.apply();
});
-
+ set_notif_status.setOnClickListener(v -> {
+ SharedPreferences.Editor editor = sharedpreferences.edit();
+ editor.putBoolean(Helper.SET_NOTIF_STATUS, set_notif_status.isChecked());
+ editor.apply();
+ });
switchCompatWIFI.setOnCheckedChangeListener((buttonView, isChecked) -> {
// Save the state here
@@ -2112,7 +2125,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot
update_tracking_domains.setOnClickListener(v -> {
update_tracking_domains.setEnabled(false);
Intent scriptIntent = new Intent(context, DownloadTrackingDBScriptsService.class);
- ((Activity) context).startService(scriptIntent);
+ context.startService(scriptIntent);
}
);
diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java
index d7b598de2..054b8ba9c 100644
--- a/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java
+++ b/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java
@@ -501,6 +501,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
MENTION,
FAVORITE,
BOOST,
+ STATUS,
POLL,
FOLLOW
}
diff --git a/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java b/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java
index 49c67216f..57a60bf57 100644
--- a/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java
+++ b/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java
@@ -33,6 +33,8 @@ import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
+import org.jetbrains.annotations.NotNull;
+
import java.util.Objects;
import app.fedilab.android.R;
@@ -67,6 +69,7 @@ public class TabLayoutNotificationsFragment extends Fragment {
TabLayout.Tab tabMention = tabLayout.newTab();
TabLayout.Tab tabFav = tabLayout.newTab();
TabLayout.Tab tabBoost = tabLayout.newTab();
+ TabLayout.Tab tabStatus = tabLayout.newTab();
TabLayout.Tab tabPoll = tabLayout.newTab();
TabLayout.Tab tabFollow = tabLayout.newTab();
@@ -75,8 +78,10 @@ public class TabLayoutNotificationsFragment extends Fragment {
tabFav.setCustomView(R.layout.tab_badge);
if (MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA)
tabBoost.setCustomView(R.layout.tab_badge);
- if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON)
+ if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) {
tabPoll.setCustomView(R.layout.tab_badge);
+ tabStatus.setCustomView(R.layout.tab_badge);
+ }
tabFollow.setCustomView(R.layout.tab_badge);
@@ -100,13 +105,19 @@ public class TabLayoutNotificationsFragment extends Fragment {
iconBoost.setImageResource(R.drawable.ic_repeat_notif_tab);
}
+ ImageView iconStatus = null;
+ if (tabStatus.getCustomView() != null) {
+ iconStatus = tabStatus.getCustomView().findViewById(R.id.tab_icon);
+ iconStatus.setImageResource(R.drawable.ic_baseline_home_notif);
+ }
+
ImageView iconPoll = null;
if (tabPoll.getCustomView() != null) {
iconPoll = tabPoll.getCustomView().findViewById(R.id.tab_icon);
iconPoll.setImageResource(R.drawable.ic_view_list_poll_notif);
}
- @SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
+ @SuppressLint("CutPasteId")
ImageView iconFollow = tabFollow.getCustomView().findViewById(R.id.tab_icon);
iconFollow.setImageResource(R.drawable.ic_follow_notif_tab);
@@ -118,6 +129,8 @@ public class TabLayoutNotificationsFragment extends Fragment {
tabLayout.addTab(tabBoost);
if (tabPoll.getCustomView() != null)
tabLayout.addTab(tabPoll);
+ if (tabStatus.getCustomView() != null)
+ tabLayout.addTab(tabStatus);
tabLayout.addTab(tabFollow);
if (theme == Helper.THEME_BLACK)
@@ -133,6 +146,8 @@ public class TabLayoutNotificationsFragment extends Fragment {
iconBoost.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN);
if (iconPoll != null)
iconPoll.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN);
+ if (iconStatus != null)
+ iconStatus.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN);
iconFollow.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN);
} else {
iconMention.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN);
@@ -142,14 +157,15 @@ public class TabLayoutNotificationsFragment extends Fragment {
iconBoost.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN);
if (iconPoll != null)
iconPoll.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN);
+ if (iconStatus != null)
+ iconStatus.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN);
iconFollow.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN);
}
viewPager = inflatedView.findViewById(R.id.viewpager);
viewPager.setEnableSwipe(false);
- viewPager.setAdapter(new PagerAdapter
- (getChildFragmentManager(), tabLayout.getTabCount()));
+ viewPager.setAdapter(new PagerAdapter(getChildFragmentManager(), tabLayout.getTabCount()));
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
@@ -206,7 +222,7 @@ public class TabLayoutNotificationsFragment extends Fragment {
/**
* Page Adapter for settings
*/
- private class PagerAdapter extends FragmentStatePagerAdapter {
+ private static class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
private PagerAdapter(FragmentManager fm, int NumOfTabs) {
@@ -215,7 +231,7 @@ public class TabLayoutNotificationsFragment extends Fragment {
}
@Override
- public Fragment getItem(int position) {
+ public @NotNull Fragment getItem(int position) {
DisplayNotificationsFragment displayNotificationsFragment = new DisplayNotificationsFragment();
DisplayNotificationsFragment.Type type = null;
String tag = "";
@@ -244,12 +260,15 @@ public class TabLayoutNotificationsFragment extends Fragment {
type = DisplayNotificationsFragment.Type.BOOST;
break;
case 4:
+ type = DisplayNotificationsFragment.Type.STATUS;
+ break;
+ case 5:
if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON)
type = DisplayNotificationsFragment.Type.POLL;
else
type = DisplayNotificationsFragment.Type.FOLLOW;
break;
- case 5:
+ case 6:
if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON)
type = DisplayNotificationsFragment.Type.FOLLOW;
default:
diff --git a/app/src/main/java/app/fedilab/android/helper/BaseHelper.java b/app/src/main/java/app/fedilab/android/helper/BaseHelper.java
index 82baa0ef0..05f80c42c 100644
--- a/app/src/main/java/app/fedilab/android/helper/BaseHelper.java
+++ b/app/src/main/java/app/fedilab/android/helper/BaseHelper.java
@@ -426,11 +426,13 @@ public class BaseHelper {
public static final String SET_NOTIF_MENTION = "set_notif_follow_mention";
public static final String SET_NOTIF_SHARE = "set_notif_follow_share";
public static final String SET_NOTIF_POLL = "set_notif_follow_poll";
+ public static final String SET_NOTIF_STATUS = "set_notif_follow_status";
public static final String SET_NOTIF_FOLLOW_FILTER = "set_notif_follow_filter";
public static final String SET_NOTIF_ADD_FILTER = "set_notif_follow_add_filter";
public static final String SET_NOTIF_MENTION_FILTER = "set_notif_follow_mention_filter";
public static final String SET_NOTIF_SHARE_FILTER = "set_notif_follow_share_filter";
public static final String SET_NOTIF_POLL_FILTER = "set_notif_follow_poll_filter";
+ public static final String SET_NOTIF_STATUS_FILTER = "set_notif_follow_status_filter";
public static final String SET_FILTER_REGEX_HOME = "set_filter_regex_home";
public static final String SET_FILTER_REGEX_LOCAL = "set_filter_regex_local";
public static final String SET_FILTER_REGEX_PUBLIC = "set_filter_regex_public";
@@ -4482,6 +4484,7 @@ public class BaseHelper {
BOOST,
FAV,
POLL,
+ STATUS,
BACKUP,
STORE,
TOOT
diff --git a/app/src/main/java/app/fedilab/android/services/BaseLiveNotificationService.java b/app/src/main/java/app/fedilab/android/services/BaseLiveNotificationService.java
index 5eadc548f..f749cae0c 100644
--- a/app/src/main/java/app/fedilab/android/services/BaseLiveNotificationService.java
+++ b/app/src/main/java/app/fedilab/android/services/BaseLiveNotificationService.java
@@ -56,8 +56,6 @@ import com.koushikdutta.async.http.WebSocket;
import org.json.JSONException;
import org.json.JSONObject;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
@@ -67,7 +65,6 @@ import app.fedilab.android.activities.MainActivity;
import app.fedilab.android.client.API;
import app.fedilab.android.client.Entities.Account;
import app.fedilab.android.client.Entities.Notification;
-import app.fedilab.android.client.TLSSocketFactory;
import app.fedilab.android.helper.Helper;
import app.fedilab.android.sqlite.AccountDAO;
import app.fedilab.android.sqlite.Sqlite;
@@ -231,14 +228,6 @@ public abstract class BaseLiveNotificationService extends Service implements Net
String urlKey = "wss://" + account.getInstance() + "/api/v1/streaming/?stream=" + notif_url + "&access_token=" + account.getToken();
Uri url = Uri.parse(urlKey);
AsyncHttpRequest.setDefaultHeaders(headers, url);
- if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
- try {
- AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setSSLContext(new TLSSocketFactory(account.getInstance()).getSSLContext());
- AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setConnectAllAddresses(true);
- } catch (KeyManagementException | NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- }
String key = account.getAcct() + "@" + account.getInstance();
if (webSocketFutures.get(key) == null || !Objects.requireNonNull(webSocketFutures.get(key)).isOpen()) {
AsyncHttpClient.getDefaultInstance().websocket("wss://" + account.getInstance() + "/api/v1/streaming/?stream=" + notif_url + "&access_token=" + account.getToken(), "wss", (ex, webSocket) -> {
@@ -382,6 +371,30 @@ public abstract class BaseLiveNotificationService extends Service implements Net
canSendBroadCast = false;
}
break;
+ case "status":
+ notifType = Helper.NotifType.STATUS;
+ if (notif_mention) {
+ if (notification.getAccount().getDisplay_name() != null && notification.getAccount().getDisplay_name().length() > 0)
+ message = String.format("%s %s", notification.getAccount().getDisplay_name(), getString(R.string.notif_status));
+ else
+ message = String.format("@%s %s", notification.getAccount().getAcct(), getString(R.string.notif_status));
+ if (notification.getStatus() != null) {
+ if (notification.getStatus().getSpoiler_text() != null && notification.getStatus().getSpoiler_text().length() > 0) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
+ message = "\n" + new SpannableString(Html.fromHtml(notification.getStatus().getSpoiler_text(), FROM_HTML_MODE_LEGACY));
+ else
+ message = "\n" + new SpannableString(Html.fromHtml(notification.getStatus().getSpoiler_text()));
+ } else {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
+ message = "\n" + new SpannableString(Html.fromHtml(notification.getStatus().getContent(), FROM_HTML_MODE_LEGACY));
+ else
+ message = "\n" + new SpannableString(Html.fromHtml(notification.getStatus().getContent()));
+ }
+ }
+ } else {
+ canSendBroadCast = false;
+ }
+ break;
case "reblog":
notifType = Helper.NotifType.BOOST;
if (notif_share) {
diff --git a/app/src/main/res/layout-sw600dp/activity_show_account.xml b/app/src/main/res/layout-sw600dp/activity_show_account.xml
index 14c2d99db..75c96179e 100644
--- a/app/src/main/res/layout-sw600dp/activity_show_account.xml
+++ b/app/src/main/res/layout-sw600dp/activity_show_account.xml
@@ -77,6 +77,7 @@
android:layout_height="45dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
+ android:contentDescription="@string/make_an_action"
android:scaleType="fitCenter"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/account_pp"
@@ -90,6 +91,7 @@
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:scaleType="fitCenter"
+ android:contentDescription="@string/edit_profile"
android:src="@drawable/ic_edit"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/account_pp"
@@ -104,10 +106,25 @@
android:layout_marginTop="10dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_note"
+ android:contentDescription="@string/action_add_notes"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/account_follow"
app:layout_constraintTop_toBottomOf="@id/banner_pp" />
+
+
+ android:visibility="gone"
+ tools:ignore="HardcodedText" />
+
+
+
+ android:gravity="center"
+ android:singleLine="true"
+ android:text="@string/channel_notif_status"
+ android:tint="@android:color/white" />
@@ -492,6 +497,30 @@
+
+
+
+
+
+
+
+
+
+
-
No notification to display
mentioned you
+ wrote a new message
boosted your status
favourited your status
followed you
@@ -306,6 +307,7 @@
Notify when someone favourites your status
Notify when someone mentions you
Notify when a poll ended
+ Notify for new posts
Show confirmation dialog before boosting
Show confirmation dialog before adding to favourites
Notify in WIFI only
@@ -589,6 +591,7 @@
Poll Ended
New Toot
Toots Backup
+ New post
Media Download
Change notification sound
Select Tone