Start splitting notification Fragment
This commit is contained in:
parent
8165f53e1c
commit
7e01c841e1
|
@ -134,6 +134,7 @@ import fr.gouv.etalab.mastodon.fragments.DisplayPeertubeNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayStatusFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayStatusFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.SettingsFragment;
|
import fr.gouv.etalab.mastodon.fragments.SettingsFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.SettingsPeertubeFragment;
|
import fr.gouv.etalab.mastodon.fragments.SettingsPeertubeFragment;
|
||||||
|
import fr.gouv.etalab.mastodon.fragments.TabLayoutNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.TabLayoutScheduleFragment;
|
import fr.gouv.etalab.mastodon.fragments.TabLayoutScheduleFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.TabLayoutSettingsFragment;
|
import fr.gouv.etalab.mastodon.fragments.TabLayoutSettingsFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.WhoToFollowFragment;
|
import fr.gouv.etalab.mastodon.fragments.WhoToFollowFragment;
|
||||||
|
@ -703,11 +704,8 @@ public abstract class BaseMainActivity extends BaseActivity
|
||||||
displayStatusFragment.scrollToTop();
|
displayStatusFragment.scrollToTop();
|
||||||
displayStatusFragment.updateLastReadToot();
|
displayStatusFragment.updateLastReadToot();
|
||||||
} else if( tab.getPosition() == 1) {
|
} else if( tab.getPosition() == 1) {
|
||||||
DisplayNotificationsFragment notificationsFragment = ((DisplayNotificationsFragment) fragment);
|
|
||||||
countNewNotifications = 0;
|
countNewNotifications = 0;
|
||||||
updateNotifCounter();
|
updateNotifCounter();
|
||||||
notificationsFragment.scrollToTop();
|
|
||||||
|
|
||||||
}else if (tab.getPosition() > 1) {
|
}else if (tab.getPosition() > 1) {
|
||||||
if (typePosition.containsKey(tab.getPosition()))
|
if (typePosition.containsKey(tab.getPosition()))
|
||||||
updateTimeLine(typePosition.get(tab.getPosition()), 0);
|
updateTimeLine(typePosition.get(tab.getPosition()), 0);
|
||||||
|
@ -761,8 +759,6 @@ public abstract class BaseMainActivity extends BaseActivity
|
||||||
displayStatusFragment.scrollToTop();
|
displayStatusFragment.scrollToTop();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
DisplayNotificationsFragment displayNotificationsFragment = ((DisplayNotificationsFragment) fragment);
|
|
||||||
displayNotificationsFragment.scrollToTop();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2486,8 +2482,8 @@ public abstract class BaseMainActivity extends BaseActivity
|
||||||
homeFragment.setArguments(bundle);
|
homeFragment.setArguments(bundle);
|
||||||
return homeFragment;
|
return homeFragment;
|
||||||
} else if (position == 1) {
|
} else if (position == 1) {
|
||||||
notificationsFragment = new DisplayNotificationsFragment();
|
TabLayoutNotificationsFragment tabLayoutNotificationsFragment = new TabLayoutNotificationsFragment();
|
||||||
return notificationsFragment;
|
return tabLayoutNotificationsFragment;
|
||||||
} else {
|
} else {
|
||||||
statusFragment = new DisplayStatusFragment();
|
statusFragment = new DisplayStatusFragment();
|
||||||
bundle.putSerializable("type", typePosition.get(position));
|
bundle.putSerializable("type", typePosition.get(position));
|
||||||
|
@ -2589,7 +2585,7 @@ public abstract class BaseMainActivity extends BaseActivity
|
||||||
if (position == 0) {
|
if (position == 0) {
|
||||||
homeFragment = (DisplayStatusFragment) createdFragment;
|
homeFragment = (DisplayStatusFragment) createdFragment;
|
||||||
} else if (position == 1) {
|
} else if (position == 1) {
|
||||||
notificationsFragment = (DisplayNotificationsFragment) createdFragment;
|
tabLayoutNotificationsFragment = (TabLayoutNotificationsFragment) createdFragment;
|
||||||
} else {
|
} else {
|
||||||
if (display_local && position == tabPosition.get("local"))
|
if (display_local && position == tabPosition.get("local"))
|
||||||
localFragment = (DisplayStatusFragment) createdFragment;
|
localFragment = (DisplayStatusFragment) createdFragment;
|
||||||
|
|
|
@ -24,6 +24,7 @@ import fr.gouv.etalab.mastodon.activities.MainActivity;
|
||||||
import fr.gouv.etalab.mastodon.client.API;
|
import fr.gouv.etalab.mastodon.client.API;
|
||||||
import fr.gouv.etalab.mastodon.client.APIResponse;
|
import fr.gouv.etalab.mastodon.client.APIResponse;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
||||||
|
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveMissingNotificationsInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveMissingNotificationsInterface;
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,18 +40,20 @@ public class RetrieveMissingNotificationsAsyncTask extends AsyncTask<Void, Void,
|
||||||
private OnRetrieveMissingNotificationsInterface listener;
|
private OnRetrieveMissingNotificationsInterface listener;
|
||||||
private WeakReference<Context> contextReference;
|
private WeakReference<Context> contextReference;
|
||||||
private List<Notification> notifications;
|
private List<Notification> notifications;
|
||||||
|
private DisplayNotificationsFragment.Type type;
|
||||||
|
|
||||||
public RetrieveMissingNotificationsAsyncTask(Context context, String since_id, OnRetrieveMissingNotificationsInterface onRetrieveMissingNotifications){
|
public RetrieveMissingNotificationsAsyncTask(Context context, DisplayNotificationsFragment.Type type, String since_id, OnRetrieveMissingNotificationsInterface onRetrieveMissingNotifications){
|
||||||
this.contextReference = new WeakReference<>(context);
|
this.contextReference = new WeakReference<>(context);
|
||||||
this.since_id = since_id;
|
this.since_id = since_id;
|
||||||
this.listener = onRetrieveMissingNotifications;
|
this.listener = onRetrieveMissingNotifications;
|
||||||
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(Void... params) {
|
protected Void doInBackground(Void... params) {
|
||||||
API api = new API(this.contextReference.get());
|
API api = new API(this.contextReference.get());
|
||||||
APIResponse apiResponse = api.getNotificationsSince(since_id, 40, false);
|
APIResponse apiResponse = api.getNotificationsSince(type, since_id, 40, false);
|
||||||
since_id = apiResponse.getSince_id();
|
since_id = apiResponse.getSince_id();
|
||||||
notifications = apiResponse.getNotifications();
|
notifications = apiResponse.getNotifications();
|
||||||
if( notifications != null && notifications.size() > 0) {
|
if( notifications != null && notifications.size() > 0) {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import fr.gouv.etalab.mastodon.client.APIResponse;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Account;
|
import fr.gouv.etalab.mastodon.client.Entities.Account;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Error;
|
import fr.gouv.etalab.mastodon.client.Entities.Error;
|
||||||
import fr.gouv.etalab.mastodon.client.GNUAPI;
|
import fr.gouv.etalab.mastodon.client.GNUAPI;
|
||||||
|
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveNotificationsInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveNotificationsInterface;
|
||||||
|
|
||||||
|
@ -46,14 +47,16 @@ public class RetrieveNotificationsAsyncTask extends AsyncTask<Void, Void, Void>
|
||||||
private boolean refreshData;
|
private boolean refreshData;
|
||||||
private WeakReference<Context> contextReference;
|
private WeakReference<Context> contextReference;
|
||||||
private boolean display;
|
private boolean display;
|
||||||
|
private DisplayNotificationsFragment.Type type;
|
||||||
|
|
||||||
public RetrieveNotificationsAsyncTask(Context context, boolean display, Account account, String max_id, OnRetrieveNotificationsInterface onRetrieveNotificationsInterface){
|
public RetrieveNotificationsAsyncTask(Context context, DisplayNotificationsFragment.Type type, boolean display, Account account, String max_id, OnRetrieveNotificationsInterface onRetrieveNotificationsInterface){
|
||||||
this.contextReference = new WeakReference<>(context);
|
this.contextReference = new WeakReference<>(context);
|
||||||
this.max_id = max_id;
|
this.max_id = max_id;
|
||||||
this.listener = onRetrieveNotificationsInterface;
|
this.listener = onRetrieveNotificationsInterface;
|
||||||
this.account = account;
|
this.account = account;
|
||||||
this.refreshData = true;
|
this.refreshData = true;
|
||||||
this.display = display;
|
this.display = display;
|
||||||
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,27 +67,27 @@ public class RetrieveNotificationsAsyncTask extends AsyncTask<Void, Void, Void>
|
||||||
API api;
|
API api;
|
||||||
if (account == null) {
|
if (account == null) {
|
||||||
api = new API(this.contextReference.get());
|
api = new API(this.contextReference.get());
|
||||||
apiResponse = api.getNotifications(max_id, display);
|
apiResponse = api.getNotifications(type, max_id, display);
|
||||||
} else {
|
} else {
|
||||||
if (this.contextReference.get() == null) {
|
if (this.contextReference.get() == null) {
|
||||||
apiResponse.setError(new Error());
|
apiResponse.setError(new Error());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
api = new API(this.contextReference.get(), account.getInstance(), account.getToken());
|
api = new API(this.contextReference.get(), account.getInstance(), account.getToken());
|
||||||
apiResponse = api.getNotificationsSince(max_id, display);
|
apiResponse = api.getNotificationsSince(type, max_id, display);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
GNUAPI gnuapi;
|
GNUAPI gnuapi;
|
||||||
if (account == null) {
|
if (account == null) {
|
||||||
gnuapi = new GNUAPI(this.contextReference.get());
|
gnuapi = new GNUAPI(this.contextReference.get());
|
||||||
apiResponse = gnuapi.getNotifications(max_id, display);
|
apiResponse = gnuapi.getNotifications(type, max_id, display);
|
||||||
} else {
|
} else {
|
||||||
if (this.contextReference.get() == null) {
|
if (this.contextReference.get() == null) {
|
||||||
apiResponse.setError(new Error());
|
apiResponse.setError(new Error());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
gnuapi = new GNUAPI(this.contextReference.get(), account.getInstance(), account.getToken());
|
gnuapi = new GNUAPI(this.contextReference.get(), account.getInstance(), account.getToken());
|
||||||
apiResponse = gnuapi.getNotificationsSince(max_id, display);
|
apiResponse = gnuapi.getNotificationsSince(type, max_id, display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -63,6 +63,7 @@ import fr.gouv.etalab.mastodon.client.Entities.Schedule;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.StoredStatus;
|
import fr.gouv.etalab.mastodon.client.Entities.StoredStatus;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Tag;
|
import fr.gouv.etalab.mastodon.client.Entities.Tag;
|
||||||
|
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
|
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
|
@ -2043,8 +2044,8 @@ public class API {
|
||||||
* @param since_id String since max
|
* @param since_id String since max
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
public APIResponse getNotificationsSince(String since_id, boolean display){
|
public APIResponse getNotificationsSince(DisplayNotificationsFragment.Type type, String since_id, boolean display){
|
||||||
return getNotifications(null, since_id, notificationPerPage, display);
|
return getNotifications(type, null, since_id, notificationPerPage, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2053,8 +2054,8 @@ public class API {
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("SameParameterValue")
|
@SuppressWarnings("SameParameterValue")
|
||||||
public APIResponse getNotificationsSince(String since_id, int notificationPerPage, boolean display){
|
public APIResponse getNotificationsSince(DisplayNotificationsFragment.Type type, String since_id, int notificationPerPage, boolean display){
|
||||||
return getNotifications(null, since_id, notificationPerPage, display);
|
return getNotifications(type, null, since_id, notificationPerPage, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2062,8 +2063,8 @@ public class API {
|
||||||
* @param max_id String id max
|
* @param max_id String id max
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
public APIResponse getNotifications(String max_id, boolean display){
|
public APIResponse getNotifications(DisplayNotificationsFragment.Type type, String max_id, boolean display){
|
||||||
return getNotifications(max_id, null, notificationPerPage, display);
|
return getNotifications(type, max_id, null, notificationPerPage, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2074,7 +2075,7 @@ public class API {
|
||||||
* @param limit int limit - max value 40
|
* @param limit int limit - max value 40
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
private APIResponse getNotifications(String max_id, String since_id, int limit, boolean display){
|
private APIResponse getNotifications(DisplayNotificationsFragment.Type type, String max_id, String since_id, int limit, boolean display){
|
||||||
|
|
||||||
HashMap<String, String> params = new HashMap<>();
|
HashMap<String, String> params = new HashMap<>();
|
||||||
if( max_id != null )
|
if( max_id != null )
|
||||||
|
@ -2087,33 +2088,59 @@ public class API {
|
||||||
|
|
||||||
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||||
boolean notif_follow, notif_add, notif_mention, notif_share;
|
boolean notif_follow, notif_add, notif_mention, notif_share;
|
||||||
if( display) {
|
|
||||||
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);
|
|
||||||
}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);
|
|
||||||
}
|
|
||||||
StringBuilder parameters = new StringBuilder();
|
StringBuilder parameters = new StringBuilder();
|
||||||
|
if( type == DisplayNotificationsFragment.Type.ALL){
|
||||||
|
if( display) {
|
||||||
|
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);
|
||||||
|
}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);
|
||||||
|
}
|
||||||
|
|
||||||
if( !notif_follow )
|
|
||||||
|
if( !notif_follow )
|
||||||
|
parameters.append("exclude_types[]=").append("follow").append("&");
|
||||||
|
if( !notif_add )
|
||||||
|
parameters.append("exclude_types[]=").append("favourite").append("&");
|
||||||
|
if( !notif_share )
|
||||||
|
parameters.append("exclude_types[]=").append("reblog").append("&");
|
||||||
|
if( !notif_mention )
|
||||||
|
parameters.append("exclude_types[]=").append("mention").append("&");
|
||||||
|
if( parameters.length() > 0) {
|
||||||
|
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
|
||||||
|
params.put("exclude_types[]", parameters.toString());
|
||||||
|
}
|
||||||
|
}else if(type == DisplayNotificationsFragment.Type.MENTION){
|
||||||
|
parameters.append("exclude_types[]=").append("follow").append("&");
|
||||||
|
parameters.append("exclude_types[]=").append("favourite").append("&");
|
||||||
|
parameters.append("exclude_types[]=").append("reblog").append("&");
|
||||||
|
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
|
||||||
|
params.put("exclude_types[]", parameters.toString());
|
||||||
|
}else if(type == DisplayNotificationsFragment.Type.FAVORITE){
|
||||||
parameters.append("exclude_types[]=").append("follow").append("&");
|
parameters.append("exclude_types[]=").append("follow").append("&");
|
||||||
if( !notif_add )
|
|
||||||
parameters.append("exclude_types[]=").append("favourite").append("&");
|
|
||||||
if( !notif_share )
|
|
||||||
parameters.append("exclude_types[]=").append("reblog").append("&");
|
|
||||||
if( !notif_mention )
|
|
||||||
parameters.append("exclude_types[]=").append("mention").append("&");
|
parameters.append("exclude_types[]=").append("mention").append("&");
|
||||||
if( parameters.length() > 0) {
|
parameters.append("exclude_types[]=").append("reblog").append("&");
|
||||||
|
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
|
||||||
|
params.put("exclude_types[]", parameters.toString());
|
||||||
|
}else if(type == DisplayNotificationsFragment.Type.BOOST){
|
||||||
|
parameters.append("exclude_types[]=").append("follow").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("reblog").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));
|
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
|
||||||
params.put("exclude_types[]", parameters.toString());
|
params.put("exclude_types[]", parameters.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
List<Notification> notifications = new ArrayList<>();
|
List<Notification> notifications = new ArrayList<>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -50,6 +50,7 @@ import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Relationship;
|
import fr.gouv.etalab.mastodon.client.Entities.Relationship;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Results;
|
import fr.gouv.etalab.mastodon.client.Entities.Results;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
||||||
|
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
|
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
|
@ -1460,8 +1461,8 @@ public class GNUAPI {
|
||||||
* @param since_id String since max
|
* @param since_id String since max
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
public APIResponse getNotificationsSince(String since_id, boolean display){
|
public APIResponse getNotificationsSince(DisplayNotificationsFragment.Type type, String since_id, boolean display){
|
||||||
return getNotifications(null, since_id, notificationPerPage, display);
|
return getNotifications(type, null, since_id, notificationPerPage, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1470,8 +1471,8 @@ public class GNUAPI {
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("SameParameterValue")
|
@SuppressWarnings("SameParameterValue")
|
||||||
public APIResponse getNotificationsSince(String since_id, int notificationPerPage, boolean display){
|
public APIResponse getNotificationsSince(DisplayNotificationsFragment.Type type, String since_id, int notificationPerPage, boolean display){
|
||||||
return getNotifications(null, since_id, notificationPerPage, display);
|
return getNotifications(type, null, since_id, notificationPerPage, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1479,8 +1480,8 @@ public class GNUAPI {
|
||||||
* @param max_id String id max
|
* @param max_id String id max
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
public APIResponse getNotifications(String max_id, boolean display){
|
public APIResponse getNotifications(DisplayNotificationsFragment.Type type, String max_id, boolean display){
|
||||||
return getNotifications(max_id, null, notificationPerPage, display);
|
return getNotifications(type, max_id, null, notificationPerPage, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1491,7 +1492,7 @@ public class GNUAPI {
|
||||||
* @param limit int limit - max value 40
|
* @param limit int limit - max value 40
|
||||||
* @return APIResponse
|
* @return APIResponse
|
||||||
*/
|
*/
|
||||||
private APIResponse getNotifications(String max_id, String since_id, int limit, boolean display){
|
private APIResponse getNotifications(DisplayNotificationsFragment.Type type, String max_id, String since_id, int limit, boolean display){
|
||||||
|
|
||||||
HashMap<String, String> params = new HashMap<>();
|
HashMap<String, String> params = new HashMap<>();
|
||||||
if( max_id != null )
|
if( max_id != null )
|
||||||
|
|
|
@ -84,6 +84,16 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
|
||||||
public DisplayNotificationsFragment(){
|
public DisplayNotificationsFragment(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum Type{
|
||||||
|
ALL,
|
||||||
|
MENTION,
|
||||||
|
FAVORITE,
|
||||||
|
BOOST,
|
||||||
|
FOLLOW
|
||||||
|
}
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
@ -96,7 +106,10 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
|
||||||
swiped = false;
|
swiped = false;
|
||||||
swipeRefreshLayout = rootView.findViewById(R.id.swipeContainer);
|
swipeRefreshLayout = rootView.findViewById(R.id.swipeContainer);
|
||||||
sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||||
|
Bundle bundle = this.getArguments();
|
||||||
|
if (bundle != null) {
|
||||||
|
type = (Type) bundle.get("type");
|
||||||
|
}
|
||||||
|
|
||||||
lv_notifications = rootView.findViewById(R.id.lv_notifications);
|
lv_notifications = rootView.findViewById(R.id.lv_notifications);
|
||||||
mainLoader = rootView.findViewById(R.id.loader);
|
mainLoader = rootView.findViewById(R.id.loader);
|
||||||
|
@ -122,7 +135,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
|
||||||
if (firstVisibleItem + visibleItemCount == totalItemCount && context != null) {
|
if (firstVisibleItem + visibleItemCount == totalItemCount && context != null) {
|
||||||
if (!flag_loading) {
|
if (!flag_loading) {
|
||||||
flag_loading = true;
|
flag_loading = true;
|
||||||
asyncTask = new RetrieveNotificationsAsyncTask(context, true, null, max_id, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
asyncTask = new RetrieveNotificationsAsyncTask(context, type,true, null, max_id, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
nextElementLoader.setVisibility(View.VISIBLE);
|
nextElementLoader.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -184,7 +197,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
|
||||||
if( notifications != null && notifications.size() > 0 )
|
if( notifications != null && notifications.size() > 0 )
|
||||||
sinceId = notifications.get(0).getId();
|
sinceId = notifications.get(0).getId();
|
||||||
if( context != null)
|
if( context != null)
|
||||||
asyncTask = new RetrieveMissingNotificationsAsyncTask(context, sinceId, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
asyncTask = new RetrieveMissingNotificationsAsyncTask(context, type, sinceId, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||||
|
@ -210,13 +223,13 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( context != null)
|
if( context != null)
|
||||||
asyncTask = new RetrieveNotificationsAsyncTask(context, true, null, max_id, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
asyncTask = new RetrieveNotificationsAsyncTask(context, type,true, null, max_id, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
else
|
else
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if( context != null)
|
if( context != null)
|
||||||
asyncTask = new RetrieveNotificationsAsyncTask(context, true, null, max_id, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
asyncTask = new RetrieveNotificationsAsyncTask(context, type,true, null, max_id, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
}, 500);
|
}, 500);
|
||||||
return rootView;
|
return rootView;
|
||||||
|
@ -316,7 +329,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
|
||||||
* @param sinceId String
|
* @param sinceId String
|
||||||
*/
|
*/
|
||||||
public void retrieveMissingNotifications(String sinceId){
|
public void retrieveMissingNotifications(String sinceId){
|
||||||
asyncTask = new RetrieveMissingNotificationsAsyncTask(context, sinceId, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
asyncTask = new RetrieveMissingNotificationsAsyncTask(context, type, sinceId, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -348,7 +361,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
|
||||||
flag_loading = true;
|
flag_loading = true;
|
||||||
swiped = true;
|
swiped = true;
|
||||||
MainActivity.countNewNotifications = 0;
|
MainActivity.countNewNotifications = 0;
|
||||||
asyncTask = new RetrieveNotificationsAsyncTask(context, true, null, null, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
asyncTask = new RetrieveNotificationsAsyncTask(context, type,true, null, null, DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,200 @@
|
||||||
|
package fr.gouv.etalab.mastodon.fragments;
|
||||||
|
/* Copyright 2017 Thomas Schneider
|
||||||
|
*
|
||||||
|
* This file is a part of Mastalab
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||||||
|
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||||
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with Mastalab; if not,
|
||||||
|
* see <http://www.gnu.org/licenses>. */
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.design.widget.TabLayout;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
|
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||||
|
import android.support.v4.content.ContextCompat;
|
||||||
|
import android.support.v4.view.ViewPager;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import fr.gouv.etalab.mastodon.R;
|
||||||
|
import fr.gouv.etalab.mastodon.activities.MainActivity;
|
||||||
|
import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoAsyncTask;
|
||||||
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
|
|
||||||
|
import static fr.gouv.etalab.mastodon.helper.Helper.THEME_BLACK;
|
||||||
|
import static fr.gouv.etalab.mastodon.helper.Helper.THEME_LIGHT;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Thomas on 03/02/2019.
|
||||||
|
* Tablayout for notifications
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TabLayoutNotificationsFragment extends Fragment {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
context = getContext();
|
||||||
|
View inflatedView = inflater.inflate(R.layout.tablayout_settings, container, false);
|
||||||
|
|
||||||
|
TabLayout tabLayout = inflatedView.findViewById(R.id.tabLayout);
|
||||||
|
|
||||||
|
if(MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU)
|
||||||
|
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.all)));
|
||||||
|
|
||||||
|
TabLayout.Tab tabMention = tabLayout.newTab();
|
||||||
|
TabLayout.Tab tabFav = tabLayout.newTab();
|
||||||
|
TabLayout.Tab tabBoost = tabLayout.newTab();
|
||||||
|
TabLayout.Tab tabFollow = tabLayout.newTab();
|
||||||
|
|
||||||
|
tabMention.setCustomView(R.layout.tab_badge);
|
||||||
|
tabFav.setCustomView(R.layout.tab_badge);
|
||||||
|
tabBoost.setCustomView(R.layout.tab_badge);
|
||||||
|
tabFollow.setCustomView(R.layout.tab_badge);
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||||
|
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
|
||||||
|
ImageView iconMention = tabMention.getCustomView().findViewById(R.id.tab_icon);
|
||||||
|
iconMention.setImageResource(R.drawable.ic_mention_notif_tab);
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
|
||||||
|
ImageView iconFav = tabMention.getCustomView().findViewById(R.id.tab_icon);
|
||||||
|
iconFav.setImageResource(R.drawable.ic_star_notif_tab);
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
|
||||||
|
ImageView iconBoost = tabMention.getCustomView().findViewById(R.id.tab_icon);
|
||||||
|
iconBoost.setImageResource(R.drawable.ic_repeat_notif_tab);
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
|
||||||
|
ImageView iconFollow = tabMention.getCustomView().findViewById(R.id.tab_icon);
|
||||||
|
iconFollow.setImageResource(R.drawable.ic_follow_notif_tab);
|
||||||
|
|
||||||
|
if (theme == THEME_BLACK)
|
||||||
|
iconMention.setColorFilter(ContextCompat.getColor(context, R.color.dark_icon), PorterDuff.Mode.SRC_IN);
|
||||||
|
else
|
||||||
|
iconMention.setColorFilter(ContextCompat.getColor(context, R.color.mastodonC4), PorterDuff.Mode.SRC_IN);
|
||||||
|
|
||||||
|
if (theme == THEME_LIGHT) {
|
||||||
|
iconMention.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN);
|
||||||
|
iconFav.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN);
|
||||||
|
iconBoost.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);
|
||||||
|
iconFav.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN);
|
||||||
|
iconBoost.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
final ViewPager viewPager = inflatedView.findViewById(R.id.viewpager);
|
||||||
|
|
||||||
|
viewPager.setAdapter(new PagerAdapter
|
||||||
|
(getChildFragmentManager(), tabLayout.getTabCount()));
|
||||||
|
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
|
||||||
|
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
|
||||||
|
@Override
|
||||||
|
public void onTabSelected(TabLayout.Tab tab) {
|
||||||
|
viewPager.setCurrentItem(tab.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTabUnselected(TabLayout.Tab tab) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTabReselected(TabLayout.Tab tab) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return inflatedView;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Context context) {
|
||||||
|
super.onAttach(context);
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Page Adapter for settings
|
||||||
|
*/
|
||||||
|
private class PagerAdapter extends FragmentStatePagerAdapter {
|
||||||
|
int mNumOfTabs;
|
||||||
|
|
||||||
|
private PagerAdapter(FragmentManager fm, int NumOfTabs) {
|
||||||
|
super(fm);
|
||||||
|
this.mNumOfTabs = NumOfTabs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Fragment getItem(int position) {
|
||||||
|
DisplayNotificationsFragment displayNotificationsFragment = new DisplayNotificationsFragment();
|
||||||
|
DisplayNotificationsFragment.Type type = null;
|
||||||
|
switch (position) {
|
||||||
|
case 0:
|
||||||
|
if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU )
|
||||||
|
type = DisplayNotificationsFragment.Type.ALL;
|
||||||
|
else
|
||||||
|
type = DisplayNotificationsFragment.Type.MENTION;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU )
|
||||||
|
type = DisplayNotificationsFragment.Type.MENTION;
|
||||||
|
else
|
||||||
|
type = DisplayNotificationsFragment.Type.FAVORITE;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU )
|
||||||
|
type = DisplayNotificationsFragment.Type.FAVORITE;
|
||||||
|
else
|
||||||
|
type = DisplayNotificationsFragment.Type.BOOST;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU )
|
||||||
|
type = DisplayNotificationsFragment.Type.BOOST;
|
||||||
|
else
|
||||||
|
type = DisplayNotificationsFragment.Type.FOLLOW;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
type = DisplayNotificationsFragment.Type.FOLLOW;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putSerializable("type", type);
|
||||||
|
displayNotificationsFragment.setArguments(bundle);
|
||||||
|
return displayNotificationsFragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return mNumOfTabs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -47,6 +47,7 @@ import fr.gouv.etalab.mastodon.client.API;
|
||||||
import fr.gouv.etalab.mastodon.client.APIResponse;
|
import fr.gouv.etalab.mastodon.client.APIResponse;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Account;
|
import fr.gouv.etalab.mastodon.client.Entities.Account;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
||||||
|
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
|
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
|
@ -133,7 +134,7 @@ public class NotificationsSyncJob extends Job {
|
||||||
for (Account account: accounts) {
|
for (Account account: accounts) {
|
||||||
if( account.getSocial() == null || account.getSocial().equals("MASTODON")|| account.getSocial().equals("PLEROMA")) {
|
if( account.getSocial() == null || account.getSocial().equals("MASTODON")|| account.getSocial().equals("PLEROMA")) {
|
||||||
API api = new API(getContext(), account.getInstance(), account.getToken());
|
API api = new API(getContext(), account.getInstance(), account.getToken());
|
||||||
APIResponse apiResponse = api.getNotificationsSince(null, false);
|
APIResponse apiResponse = api.getNotificationsSince(DisplayNotificationsFragment.Type.ALL, null, false);
|
||||||
onRetrieveNotifications(apiResponse, account);
|
onRetrieveNotifications(apiResponse, account);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M20,2H4c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2z"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4z"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
|
||||||
|
</vector>
|
|
@ -868,6 +868,7 @@
|
||||||
<string name="action_markdown">Markdown</string>
|
<string name="action_markdown">Markdown</string>
|
||||||
<string name="action_logout_account">Logout account</string>
|
<string name="action_logout_account">Logout account</string>
|
||||||
<string name="set_optimize_loading">Optimize loading time</string>
|
<string name="set_optimize_loading">Optimize loading time</string>
|
||||||
|
<string name="all">All</string>
|
||||||
<!-- end languages -->
|
<!-- end languages -->
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue