mirror of
https://github.com/nuclearfog/Shitter.git
synced 2025-01-30 19:05:02 +01:00
added function to get more users in the list
This commit is contained in:
parent
51031dcd44
commit
54e389441c
@ -24,7 +24,7 @@ import org.nuclearfog.twidda.backend.MessageUploader;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
|
||||
import org.nuclearfog.twidda.backend.helper.FontTool;
|
||||
import org.nuclearfog.twidda.backend.items.MessageHolder;
|
||||
import org.nuclearfog.twidda.backend.holder.MessageHolder;
|
||||
import org.nuclearfog.twidda.database.GlobalSettings;
|
||||
|
||||
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
|
||||
|
@ -33,8 +33,8 @@ import org.nuclearfog.twidda.backend.ProfileUpdater;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
|
||||
import org.nuclearfog.twidda.backend.helper.FontTool;
|
||||
import org.nuclearfog.twidda.backend.holder.UserHolder;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.backend.items.UserHolder;
|
||||
import org.nuclearfog.twidda.database.GlobalSettings;
|
||||
|
||||
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
|
||||
|
@ -29,7 +29,7 @@ import org.nuclearfog.twidda.backend.TweetUploader;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
|
||||
import org.nuclearfog.twidda.backend.helper.FontTool;
|
||||
import org.nuclearfog.twidda.backend.items.TweetHolder;
|
||||
import org.nuclearfog.twidda.backend.holder.TweetHolder;
|
||||
import org.nuclearfog.twidda.database.GlobalSettings;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
@ -37,7 +37,7 @@ import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
|
||||
import org.nuclearfog.twidda.backend.helper.FontTool;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.backend.items.UserProperties;
|
||||
import org.nuclearfog.twidda.backend.items.UserConnection;
|
||||
import org.nuclearfog.twidda.database.GlobalSettings;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
@ -88,7 +88,7 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
|
||||
private TabLayout tabLayout;
|
||||
|
||||
private ProfileLoader profileAsync;
|
||||
private UserProperties properties;
|
||||
private UserConnection properties;
|
||||
private TwitterUser user;
|
||||
|
||||
@Override
|
||||
@ -523,9 +523,10 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
|
||||
|
||||
/**
|
||||
* Set User Relationship
|
||||
*
|
||||
* @param properties relationship to the current user
|
||||
*/
|
||||
public void setConnection(UserProperties properties) {
|
||||
public void setConnection(UserConnection properties) {
|
||||
this.properties = properties;
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
@ -536,7 +537,7 @@ public class UserProfile extends AppCompatActivity implements OnClickListener,
|
||||
* @param properties connection to an user
|
||||
* @param action Action on the user profile
|
||||
*/
|
||||
public void onAction(UserProperties properties, ProfileLoader.Action action) {
|
||||
public void onAction(UserConnection properties, ProfileLoader.Action action) {
|
||||
switch (action) {
|
||||
case ACTION_FOLLOW:
|
||||
if (properties.isFriend())
|
||||
|
@ -4,6 +4,7 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
@ -16,6 +17,7 @@ import com.squareup.picasso.Picasso;
|
||||
|
||||
import org.nuclearfog.twidda.R;
|
||||
import org.nuclearfog.twidda.backend.helper.FontTool;
|
||||
import org.nuclearfog.twidda.backend.holder.UserListHolder;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.database.GlobalSettings;
|
||||
|
||||
@ -23,14 +25,20 @@ import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static androidx.recyclerview.widget.RecyclerView.NO_ID;
|
||||
import static androidx.recyclerview.widget.RecyclerView.NO_POSITION;
|
||||
|
||||
public class UserAdapter extends Adapter<UserAdapter.ItemHolder> {
|
||||
public class UserAdapter extends Adapter<ViewHolder> {
|
||||
|
||||
private static final int ITEM_USER = 0;
|
||||
private static final int ITEM_GAP = 1;
|
||||
|
||||
private WeakReference<UserClickListener> itemClickListener;
|
||||
private List<TwitterUser> users;
|
||||
private GlobalSettings settings;
|
||||
|
||||
private long nextCursor;
|
||||
|
||||
|
||||
public UserAdapter(UserClickListener l, GlobalSettings settings) {
|
||||
itemClickListener = new WeakReference<>(l);
|
||||
@ -40,10 +48,23 @@ public class UserAdapter extends Adapter<UserAdapter.ItemHolder> {
|
||||
|
||||
|
||||
@MainThread
|
||||
public void replaceAll(@NonNull List<TwitterUser> userList) {
|
||||
users.clear();
|
||||
users.addAll(userList);
|
||||
notifyDataSetChanged();
|
||||
public void setData(@NonNull UserListHolder data) {
|
||||
if (users.isEmpty() || !data.hasPrevious()) {
|
||||
if (!users.isEmpty())
|
||||
users.clear();
|
||||
users.addAll(data.getUsers());
|
||||
if (data.hasNext())
|
||||
users.add(null);
|
||||
notifyDataSetChanged();
|
||||
} else {
|
||||
int insertAt = users.size() - 1;
|
||||
int end = insertAt + data.getSize();
|
||||
users.addAll(insertAt, data.getUsers());
|
||||
if (!data.hasNext())
|
||||
users.remove(end);
|
||||
notifyItemRangeChanged(insertAt, end);
|
||||
}
|
||||
nextCursor = data.getNext();
|
||||
}
|
||||
|
||||
|
||||
@ -55,56 +76,87 @@ public class UserAdapter extends Adapter<UserAdapter.ItemHolder> {
|
||||
|
||||
@Override
|
||||
public long getItemId(int index) {
|
||||
return users.get(index).getId();
|
||||
if (users.get(index) != null)
|
||||
return users.get(index).getId();
|
||||
return NO_ID;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int index) {
|
||||
if (users.get(index) == null)
|
||||
return ITEM_GAP;
|
||||
return ITEM_USER;
|
||||
}
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user, parent, false);
|
||||
final ItemHolder vh = new ItemHolder(v);
|
||||
FontTool.setViewFontAndColor(settings, v);
|
||||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
if (viewType == ITEM_USER) {
|
||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user, parent, false);
|
||||
final ItemHolder vh = new ItemHolder(v);
|
||||
FontTool.setViewFontAndColor(settings, v);
|
||||
|
||||
v.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (itemClickListener.get() != null) {
|
||||
int position = vh.getLayoutPosition();
|
||||
if (position != NO_POSITION)
|
||||
itemClickListener.get().onUserClick(users.get(position));
|
||||
v.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (itemClickListener.get() != null) {
|
||||
int position = vh.getLayoutPosition();
|
||||
TwitterUser user = users.get(position);
|
||||
if (position != NO_POSITION && user != null) {
|
||||
itemClickListener.get().onUserClick(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return vh;
|
||||
});
|
||||
return vh;
|
||||
} else {
|
||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_placeholder, parent, false);
|
||||
final UserAdapter.PlaceHolder vh = new UserAdapter.PlaceHolder(v);
|
||||
vh.loadBtn.setTypeface(settings.getFontFace());
|
||||
vh.loadBtn.setTextColor(settings.getFontColor());
|
||||
vh.loadBtn.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (itemClickListener.get() != null) {
|
||||
itemClickListener.get().onFooterClick(nextCursor);
|
||||
}
|
||||
}
|
||||
});
|
||||
return vh;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull ItemHolder vh, int index) {
|
||||
public void onBindViewHolder(@NonNull ViewHolder holder, int index) {
|
||||
TwitterUser user = users.get(index);
|
||||
vh.username.setText(user.getUsername());
|
||||
vh.screenname.setText(user.getScreenname());
|
||||
if (settings.getImageLoad()) {
|
||||
String pbLink = user.getImageLink();
|
||||
if (!user.hasDefaultProfileImage())
|
||||
pbLink += "_mini";
|
||||
Picasso.get().load(pbLink).into(vh.profileImg);
|
||||
}
|
||||
if (user.isVerified()) {
|
||||
vh.username.setCompoundDrawablesWithIntrinsicBounds(R.drawable.verify, 0, 0, 0);
|
||||
} else {
|
||||
vh.username.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
}
|
||||
if (user.isLocked()) {
|
||||
vh.screenname.setCompoundDrawablesWithIntrinsicBounds(R.drawable.lock, 0, 0, 0);
|
||||
} else {
|
||||
vh.screenname.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
if (holder instanceof ItemHolder && user != null) {
|
||||
ItemHolder vh = (ItemHolder) holder;
|
||||
vh.username.setText(user.getUsername());
|
||||
vh.screenname.setText(user.getScreenname());
|
||||
if (settings.getImageLoad()) {
|
||||
String pbLink = user.getImageLink();
|
||||
if (!user.hasDefaultProfileImage())
|
||||
pbLink += "_mini";
|
||||
Picasso.get().load(pbLink).into(vh.profileImg);
|
||||
}
|
||||
if (user.isVerified()) {
|
||||
vh.username.setCompoundDrawablesWithIntrinsicBounds(R.drawable.verify, 0, 0, 0);
|
||||
} else {
|
||||
vh.username.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
}
|
||||
if (user.isLocked()) {
|
||||
vh.screenname.setCompoundDrawablesWithIntrinsicBounds(R.drawable.lock, 0, 0, 0);
|
||||
} else {
|
||||
vh.screenname.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static class ItemHolder extends ViewHolder {
|
||||
class ItemHolder extends ViewHolder {
|
||||
final ImageView profileImg;
|
||||
final TextView username, screenname;
|
||||
|
||||
@ -116,6 +168,16 @@ public class UserAdapter extends Adapter<UserAdapter.ItemHolder> {
|
||||
}
|
||||
}
|
||||
|
||||
class PlaceHolder extends ViewHolder {
|
||||
|
||||
final Button loadBtn;
|
||||
|
||||
PlaceHolder(@NonNull View v) {
|
||||
super(v);
|
||||
loadBtn = v.findViewById(R.id.item_placeholder);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Listener for list click
|
||||
@ -128,5 +190,7 @@ public class UserAdapter extends Adapter<UserAdapter.ItemHolder> {
|
||||
* @param user user item
|
||||
*/
|
||||
void onUserClick(TwitterUser user);
|
||||
|
||||
void onFooterClick(long cursor);
|
||||
}
|
||||
}
|
@ -8,7 +8,7 @@ import androidx.annotation.Nullable;
|
||||
import org.nuclearfog.twidda.activity.MessagePopup;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.engine.TwitterEngine;
|
||||
import org.nuclearfog.twidda.backend.items.MessageHolder;
|
||||
import org.nuclearfog.twidda.backend.holder.MessageHolder;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
|
@ -8,7 +8,7 @@ import org.nuclearfog.twidda.activity.UserProfile;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.engine.TwitterEngine;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.backend.items.UserProperties;
|
||||
import org.nuclearfog.twidda.backend.items.UserConnection;
|
||||
import org.nuclearfog.twidda.database.AppDatabase;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
@ -18,7 +18,7 @@ import java.lang.ref.WeakReference;
|
||||
*
|
||||
* @see UserProfile
|
||||
*/
|
||||
public class ProfileLoader extends AsyncTask<Object, TwitterUser, UserProperties> {
|
||||
public class ProfileLoader extends AsyncTask<Object, TwitterUser, UserConnection> {
|
||||
|
||||
public enum Action {
|
||||
LDR_PROFILE,
|
||||
@ -44,8 +44,8 @@ public class ProfileLoader extends AsyncTask<Object, TwitterUser, UserProperties
|
||||
|
||||
|
||||
@Override
|
||||
protected UserProperties doInBackground(Object[] args) {
|
||||
UserProperties connection;
|
||||
protected UserConnection doInBackground(Object[] args) {
|
||||
UserConnection connection;
|
||||
TwitterUser user;
|
||||
long userId = 0;
|
||||
String username = "";
|
||||
@ -136,7 +136,7 @@ public class ProfileLoader extends AsyncTask<Object, TwitterUser, UserProperties
|
||||
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(UserProperties properties) {
|
||||
protected void onPostExecute(UserConnection properties) {
|
||||
if (callback.get() != null) {
|
||||
if (properties != null) {
|
||||
callback.get().setConnection(properties);
|
||||
|
@ -7,8 +7,8 @@ import androidx.annotation.Nullable;
|
||||
import org.nuclearfog.twidda.activity.ProfileEditor;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.engine.TwitterEngine;
|
||||
import org.nuclearfog.twidda.backend.holder.UserHolder;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.backend.items.UserHolder;
|
||||
import org.nuclearfog.twidda.database.AppDatabase;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
@ -74,16 +74,16 @@ public class TweetListLoader extends AsyncTask<Long, Void, List<Tweet>> {
|
||||
try {
|
||||
switch (action) {
|
||||
case TL_HOME:
|
||||
if (sinceId == 0 && maxId == 0) { // add tweets to the list
|
||||
if (sinceId == 0 && maxId == 0) {
|
||||
tweets = db.getHomeTimeline();
|
||||
if (tweets.isEmpty()) {
|
||||
tweets = mTwitter.getHome(sinceId, maxId);
|
||||
db.storeHomeTimeline(tweets);
|
||||
}
|
||||
} else if (sinceId > 0) { // add new tweets to the top
|
||||
} else if (sinceId > 0) {
|
||||
tweets = mTwitter.getHome(sinceId, maxId);
|
||||
db.storeHomeTimeline(tweets);
|
||||
} else if (maxId > 0) { // add old tweets to the bottom
|
||||
} else if (maxId > 1) {
|
||||
tweets = mTwitter.getHome(sinceId, maxId);
|
||||
}
|
||||
break;
|
||||
@ -98,7 +98,7 @@ public class TweetListLoader extends AsyncTask<Long, Void, List<Tweet>> {
|
||||
} else if (sinceId > 0) {
|
||||
tweets = mTwitter.getMention(sinceId, maxId);
|
||||
db.storeMentions(tweets);
|
||||
} else if (maxId > 0) {
|
||||
} else if (maxId > 1) {
|
||||
tweets = mTwitter.getMention(sinceId, maxId);
|
||||
}
|
||||
break;
|
||||
@ -116,7 +116,7 @@ public class TweetListLoader extends AsyncTask<Long, Void, List<Tweet>> {
|
||||
} else if (sinceId > 0) {
|
||||
tweets = mTwitter.getUserTweets(id, sinceId, maxId);
|
||||
db.storeUserTweets(tweets);
|
||||
} else if (maxId > 0) {
|
||||
} else if (maxId > 1) {
|
||||
tweets = mTwitter.getUserTweets(id, sinceId, maxId);
|
||||
}
|
||||
}
|
||||
@ -136,7 +136,7 @@ public class TweetListLoader extends AsyncTask<Long, Void, List<Tweet>> {
|
||||
tweets = mTwitter.getUserFavs(id, 0, maxId);
|
||||
db.storeUserFavs(tweets, id);
|
||||
pos = CLEAR_LIST; // set flag to clear previous data
|
||||
} else if (maxId > 0) {
|
||||
} else if (maxId > 1) {
|
||||
tweets = mTwitter.getUserFavs(id, sinceId, maxId);
|
||||
}
|
||||
}
|
||||
@ -151,14 +151,16 @@ public class TweetListLoader extends AsyncTask<Long, Void, List<Tweet>> {
|
||||
tweets = db.getAnswers(id);
|
||||
if (tweets.isEmpty()) {
|
||||
tweets = mTwitter.getAnswers(search, id, sinceId, maxId);
|
||||
if (!tweets.isEmpty() && db.containStatus(id))
|
||||
if (!tweets.isEmpty() && db.containStatus(id)) {
|
||||
db.storeReplies(tweets);
|
||||
}
|
||||
}
|
||||
} else if (sinceId > 0) {
|
||||
tweets = mTwitter.getAnswers(search, id, sinceId, maxId);
|
||||
if (!tweets.isEmpty() && db.containStatus(id))
|
||||
if (!tweets.isEmpty() && db.containStatus(id)) {
|
||||
db.storeReplies(tweets);
|
||||
} else if (maxId > 0) {
|
||||
}
|
||||
} else if (maxId > 1) {
|
||||
tweets = mTwitter.getAnswers(search, id, sinceId, maxId);
|
||||
}
|
||||
break;
|
||||
|
@ -7,7 +7,7 @@ import androidx.annotation.Nullable;
|
||||
import org.nuclearfog.twidda.activity.TweetPopup;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.engine.TwitterEngine;
|
||||
import org.nuclearfog.twidda.backend.items.TweetHolder;
|
||||
import org.nuclearfog.twidda.backend.holder.TweetHolder;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
|
@ -6,74 +6,83 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.engine.TwitterEngine;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.backend.holder.UserListHolder;
|
||||
import org.nuclearfog.twidda.fragment.UserFragment;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* download a list of user such as follower, following or searched users
|
||||
*
|
||||
* @see UserFragment
|
||||
*/
|
||||
public class UserListLoader extends AsyncTask<Object, Void, List<TwitterUser>> {
|
||||
public class UserListLoader extends AsyncTask<Long, Void, UserListHolder> {
|
||||
|
||||
public enum Mode {
|
||||
public static final long NO_CURSOR = -1;
|
||||
|
||||
public enum Action {
|
||||
FOLLOWS,
|
||||
FRIENDS,
|
||||
RETWEET,
|
||||
FAVORIT,
|
||||
SEARCH,
|
||||
SUBSCRIBER,
|
||||
LIST
|
||||
LIST,
|
||||
NONE
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private EngineException twException;
|
||||
private WeakReference<UserFragment> callback;
|
||||
private TwitterEngine mTwitter;
|
||||
private final Mode action;
|
||||
|
||||
private final Action action;
|
||||
private String search;
|
||||
private long id;
|
||||
|
||||
|
||||
public UserListLoader(UserFragment callback, Mode action) {
|
||||
public UserListLoader(UserFragment callback, Action action, long id, String search) {
|
||||
this.callback = new WeakReference<>(callback);
|
||||
mTwitter = TwitterEngine.getInstance(callback.getContext());
|
||||
this.action = action;
|
||||
this.search = search;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onPreExecute() {
|
||||
if (callback.get() != null)
|
||||
if (callback.get() != null) {
|
||||
callback.get().setRefresh(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected List<TwitterUser> doInBackground(Object[] param) {
|
||||
protected UserListHolder doInBackground(Long[] param) {
|
||||
long cursor = param[0];
|
||||
try {
|
||||
switch (action) {
|
||||
case FOLLOWS:
|
||||
return mTwitter.getFollower((long) param[0]);
|
||||
return mTwitter.getFollower(id, cursor);
|
||||
|
||||
case FRIENDS:
|
||||
return mTwitter.getFollowing((long) param[0]);
|
||||
return mTwitter.getFollowing(id, cursor);
|
||||
|
||||
case RETWEET:
|
||||
return mTwitter.getRetweeter((long) param[0]);
|
||||
return mTwitter.getRetweeter(id, cursor);
|
||||
|
||||
case FAVORIT:
|
||||
return new LinkedList<>(); // TODO not jet implemented in Twitter4J
|
||||
break;
|
||||
|
||||
case SEARCH:
|
||||
return mTwitter.searchUsers((String) param[0]);
|
||||
return mTwitter.searchUsers(search, cursor);
|
||||
|
||||
case SUBSCRIBER:
|
||||
return mTwitter.getListFollower((long) param[0]);
|
||||
return mTwitter.getListFollower(id, cursor);
|
||||
|
||||
case LIST:
|
||||
return mTwitter.getListMember((long) param[0]);
|
||||
return mTwitter.getListMember(id, cursor);
|
||||
|
||||
}
|
||||
} catch (EngineException twException) {
|
||||
@ -86,7 +95,7 @@ public class UserListLoader extends AsyncTask<Object, Void, List<TwitterUser>> {
|
||||
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(List<TwitterUser> users) {
|
||||
protected void onPostExecute(UserListHolder users) {
|
||||
if (callback.get() != null) {
|
||||
callback.get().setRefresh(false);
|
||||
if (users != null) {
|
||||
|
@ -5,16 +5,17 @@ import android.content.Context;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.nuclearfog.twidda.BuildConfig;
|
||||
import org.nuclearfog.twidda.backend.holder.MessageHolder;
|
||||
import org.nuclearfog.twidda.backend.holder.TweetHolder;
|
||||
import org.nuclearfog.twidda.backend.holder.UserHolder;
|
||||
import org.nuclearfog.twidda.backend.holder.UserListHolder;
|
||||
import org.nuclearfog.twidda.backend.items.Message;
|
||||
import org.nuclearfog.twidda.backend.items.MessageHolder;
|
||||
import org.nuclearfog.twidda.backend.items.TrendLocation;
|
||||
import org.nuclearfog.twidda.backend.items.Tweet;
|
||||
import org.nuclearfog.twidda.backend.items.TweetHolder;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterList;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterTrend;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.backend.items.UserHolder;
|
||||
import org.nuclearfog.twidda.backend.items.UserProperties;
|
||||
import org.nuclearfog.twidda.backend.items.UserConnection;
|
||||
import org.nuclearfog.twidda.database.GlobalSettings;
|
||||
|
||||
import java.io.File;
|
||||
@ -22,6 +23,7 @@ import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.net.Authenticator;
|
||||
import java.net.PasswordAuthentication;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
@ -29,6 +31,7 @@ import twitter4j.DirectMessage;
|
||||
import twitter4j.GeoLocation;
|
||||
import twitter4j.IDs;
|
||||
import twitter4j.Location;
|
||||
import twitter4j.PagableResponseList;
|
||||
import twitter4j.Paging;
|
||||
import twitter4j.Query;
|
||||
import twitter4j.QueryResult;
|
||||
@ -204,7 +207,7 @@ public class TwitterEngine {
|
||||
paging.setCount(settings.getRowLimit());
|
||||
if (sinceId > 0)
|
||||
paging.setSinceId(sinceId);
|
||||
if (maxId > 0)
|
||||
if (maxId > 1)
|
||||
paging.setMaxId(maxId - 1);
|
||||
List<Status> homeTweets = twitter.getHomeTimeline(paging);
|
||||
return convertStatusList(homeTweets);
|
||||
@ -228,7 +231,7 @@ public class TwitterEngine {
|
||||
paging.setCount(settings.getRowLimit());
|
||||
if (sinceId > 0)
|
||||
paging.setSinceId(sinceId);
|
||||
if (maxId > 0)
|
||||
if (maxId > 1)
|
||||
paging.setMaxId(maxId - 1);
|
||||
List<Status> mentions = twitter.getMentionsTimeline(paging);
|
||||
return convertStatusList(mentions);
|
||||
@ -253,8 +256,10 @@ public class TwitterEngine {
|
||||
Query q = new Query();
|
||||
q.setQuery(search + " +exclude:retweets");
|
||||
q.setCount(load);
|
||||
q.setSinceId(sinceId);
|
||||
q.setMaxId(maxId);
|
||||
if (sinceId > 0)
|
||||
q.setSinceId(sinceId);
|
||||
if (maxId > 1)
|
||||
q.setMaxId(maxId - 1);
|
||||
QueryResult result = twitter.search(q);
|
||||
List<Status> results = result.getTweets();
|
||||
return convertStatusList(results);
|
||||
@ -311,9 +316,18 @@ public class TwitterEngine {
|
||||
* @return List of Users
|
||||
* @throws EngineException if access is unavailable
|
||||
*/
|
||||
public List<TwitterUser> searchUsers(String search) throws EngineException {
|
||||
public UserListHolder searchUsers(String search, long cursor) throws EngineException {
|
||||
try {
|
||||
return convertUserList(twitter.searchUsers(search, -1));
|
||||
int currentPage = 1;
|
||||
if (cursor > 0)
|
||||
currentPage = (int) cursor;
|
||||
long prevPage = currentPage - 1;
|
||||
long nextPage = currentPage + 1;
|
||||
|
||||
List<TwitterUser> users = convertUserList(twitter.searchUsers(search, currentPage));
|
||||
if (users.size() < 20)
|
||||
nextPage = 0;
|
||||
return new UserListHolder(users, prevPage, nextPage);
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -335,7 +349,7 @@ public class TwitterEngine {
|
||||
paging.setCount(settings.getRowLimit());
|
||||
if (sinceId > 0)
|
||||
paging.setSinceId(sinceId);
|
||||
if (maxId > 0)
|
||||
if (maxId > 1)
|
||||
paging.setMaxId(maxId - 1);
|
||||
return convertStatusList(twitter.getUserTimeline(userId, paging));
|
||||
} catch (TwitterException err) {
|
||||
@ -383,7 +397,7 @@ public class TwitterEngine {
|
||||
paging.setCount(settings.getRowLimit());
|
||||
if (sinceId > 0)
|
||||
paging.setSinceId(sinceId);
|
||||
if (maxId > 0)
|
||||
if (maxId > 1)
|
||||
paging.setMaxId(maxId - 1);
|
||||
return convertStatusList(twitter.getFavorites(userId, paging));
|
||||
} catch (TwitterException err) {
|
||||
@ -471,9 +485,9 @@ public class TwitterEngine {
|
||||
* @return User Properties
|
||||
* @throws EngineException if Connection is unavailable
|
||||
*/
|
||||
public UserProperties getConnection(long userId) throws EngineException {
|
||||
public UserConnection getConnection(long userId) throws EngineException {
|
||||
try {
|
||||
return new UserProperties(twitter.showFriendship(twitterID, userId));
|
||||
return new UserConnection(twitter.showFriendship(twitterID, userId));
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -487,9 +501,9 @@ public class TwitterEngine {
|
||||
* @return User Properties
|
||||
* @throws EngineException if Connection is unavailable
|
||||
*/
|
||||
public UserProperties getConnection(String username) throws EngineException {
|
||||
public UserConnection getConnection(String username) throws EngineException {
|
||||
try {
|
||||
return new UserProperties(twitter.showFriendship(twitter.getScreenName(), username));
|
||||
return new UserConnection(twitter.showFriendship(twitter.getScreenName(), username));
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -596,17 +610,23 @@ public class TwitterEngine {
|
||||
* get Following User List
|
||||
*
|
||||
* @param userId User ID
|
||||
* @return List of Following User
|
||||
* @return List of Following User with cursors
|
||||
* @throws EngineException if Access is unavailable
|
||||
*/
|
||||
public List<TwitterUser> getFollowing(long userId) throws EngineException {
|
||||
public UserListHolder getFollowing(long userId, long cursor) throws EngineException {
|
||||
try {
|
||||
int load = settings.getRowLimit();
|
||||
IDs userIDs = twitter.getFriendsIDs(userId, -1, load);
|
||||
IDs userIDs = twitter.getFriendsIDs(userId, cursor, load);
|
||||
long[] ids = userIDs.getIDs();
|
||||
if (ids.length == 0)
|
||||
return new LinkedList<>();
|
||||
return convertUserList(twitter.lookupUsers(ids));
|
||||
long prevCursor = cursor > 0 ? cursor : 0;
|
||||
long nextCursor = userIDs.getNextCursor();
|
||||
List<TwitterUser> users;
|
||||
if (ids.length > 0) {
|
||||
users = convertUserList(twitter.lookupUsers(ids));
|
||||
} else {
|
||||
users = new ArrayList<>(0);
|
||||
}
|
||||
return new UserListHolder(users, prevCursor, nextCursor);
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -617,17 +637,23 @@ public class TwitterEngine {
|
||||
* get Follower
|
||||
*
|
||||
* @param userId User ID
|
||||
* @return List of Follower
|
||||
* @return List of Follower with cursors attached
|
||||
* @throws EngineException if Access is unavailable
|
||||
*/
|
||||
public List<TwitterUser> getFollower(long userId) throws EngineException {
|
||||
public UserListHolder getFollower(long userId, long cursor) throws EngineException {
|
||||
try {
|
||||
int load = settings.getRowLimit();
|
||||
IDs userIDs = twitter.getFollowersIDs(userId, -1, load);
|
||||
IDs userIDs = twitter.getFollowersIDs(userId, cursor, load);
|
||||
long[] ids = userIDs.getIDs();
|
||||
if (ids.length == 0)
|
||||
return new LinkedList<>();
|
||||
return convertUserList(twitter.lookupUsers(userIDs.getIDs()));
|
||||
long prevCursor = cursor > 0 ? cursor : 0;
|
||||
long nextCursor = userIDs.getNextCursor();
|
||||
List<TwitterUser> users;
|
||||
if (ids.length > 0) {
|
||||
users = convertUserList(twitter.lookupUsers(ids));
|
||||
} else {
|
||||
users = new ArrayList<>(0);
|
||||
}
|
||||
return new UserListHolder(users, prevCursor, nextCursor);
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -694,8 +720,10 @@ public class TwitterEngine {
|
||||
List<Status> answers = new LinkedList<>();
|
||||
Query query = new Query("to:" + name + " +exclude:retweets");
|
||||
query.setCount(load);
|
||||
query.setMaxId(maxId);
|
||||
query.setSinceId(sinceId);
|
||||
if (sinceId > 0)
|
||||
query.setSinceId(sinceId);
|
||||
if (maxId > 1)
|
||||
query.setMaxId(maxId - 1);
|
||||
query.setResultType(Query.RECENT);
|
||||
QueryResult result = twitter.search(query);
|
||||
List<Status> stats = result.getTweets();
|
||||
@ -787,19 +815,24 @@ public class TwitterEngine {
|
||||
* Get User who retweeted a Tweet
|
||||
*
|
||||
* @param tweetID Tweet ID
|
||||
*
|
||||
* @return List of users or empty list if no match
|
||||
* @throws EngineException if Access is unavailable
|
||||
*/
|
||||
public List<TwitterUser> getRetweeter(long tweetID) throws EngineException {
|
||||
public UserListHolder getRetweeter(long tweetID, long cursor) throws EngineException {
|
||||
try {
|
||||
int load = settings.getRowLimit();
|
||||
Tweet embeddedStat = getStatus(tweetID).getEmbeddedTweet();
|
||||
if (embeddedStat != null)
|
||||
tweetID = embeddedStat.getId();
|
||||
long[] userIds = twitter.getRetweeterIds(tweetID, load, -1).getIDs();
|
||||
if (userIds.length == 0)
|
||||
return new LinkedList<>();
|
||||
return convertUserList(twitter.lookupUsers(userIds));
|
||||
IDs userIDs = twitter.getRetweeterIds(tweetID, load, cursor);
|
||||
long[] ids = userIDs.getIDs();
|
||||
long prevCursor = cursor > 0 ? cursor : 0;
|
||||
long nextCursor = userIDs.getNextCursor();
|
||||
List<TwitterUser> users;
|
||||
if (ids.length > 0) {
|
||||
users = convertUserList(twitter.lookupUsers(ids));
|
||||
} else {
|
||||
users = new ArrayList<>(0);
|
||||
}
|
||||
return new UserListHolder(users, prevCursor, nextCursor);
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -976,9 +1009,13 @@ public class TwitterEngine {
|
||||
* @return list of users following the list
|
||||
* @throws EngineException if access is unavailable
|
||||
*/
|
||||
public List<TwitterUser> getListFollower(long listId) throws EngineException {
|
||||
public UserListHolder getListFollower(long listId, long cursor) throws EngineException {
|
||||
try {
|
||||
return convertUserList(twitter.getUserListSubscribers(listId, -1));
|
||||
PagableResponseList<User> result = twitter.getUserListSubscribers(listId, cursor);
|
||||
List<TwitterUser> users = convertUserList(result);
|
||||
long prevCursor = cursor > 0 ? cursor : 0;
|
||||
long nextCursor = result.getNextCursor();
|
||||
return new UserListHolder(users, prevCursor, nextCursor);
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -991,9 +1028,13 @@ public class TwitterEngine {
|
||||
* @return list of users
|
||||
* @throws EngineException if access is unavailable
|
||||
*/
|
||||
public List<TwitterUser> getListMember(long listId) throws EngineException {
|
||||
public UserListHolder getListMember(long listId, long cursor) throws EngineException {
|
||||
try {
|
||||
return convertUserList(twitter.getUserListMembers(listId, -1));
|
||||
PagableResponseList<User> result = twitter.getUserListMembers(listId, cursor);
|
||||
List<TwitterUser> users = convertUserList(result);
|
||||
long prevCursor = cursor > 0 ? cursor : 0;
|
||||
long nextCursor = result.getNextCursor();
|
||||
return new UserListHolder(users, prevCursor, nextCursor);
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
}
|
||||
@ -1015,8 +1056,8 @@ public class TwitterEngine {
|
||||
paging.setCount(settings.getRowLimit());
|
||||
if (sinceId > 0)
|
||||
paging.setSinceId(sinceId);
|
||||
if (maxId > 0)
|
||||
paging.setMaxId(maxId);
|
||||
if (maxId > 1)
|
||||
paging.setMaxId(maxId - 1);
|
||||
return convertStatusList(twitter.getUserListStatuses(listId, paging));
|
||||
} catch (TwitterException err) {
|
||||
throw new EngineException(err);
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.nuclearfog.twidda.backend.items;
|
||||
package org.nuclearfog.twidda.backend.holder;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
@ -1,4 +1,4 @@
|
||||
package org.nuclearfog.twidda.backend.items;
|
||||
package org.nuclearfog.twidda.backend.holder;
|
||||
|
||||
import android.location.Location;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.nuclearfog.twidda.backend.items;
|
||||
package org.nuclearfog.twidda.backend.holder;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
@ -0,0 +1,73 @@
|
||||
package org.nuclearfog.twidda.backend.holder;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Container class for user list information
|
||||
*/
|
||||
public class UserListHolder {
|
||||
|
||||
private final List<TwitterUser> users;
|
||||
private final long prevCursor, nextCursor;
|
||||
|
||||
public UserListHolder(List<TwitterUser> users, long prevCursor, long nextCursor) {
|
||||
this.users = users;
|
||||
this.prevCursor = prevCursor;
|
||||
this.nextCursor = nextCursor;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if list is linked to a previous list
|
||||
*
|
||||
* @return true if list is linked
|
||||
*/
|
||||
public boolean hasPrevious() {
|
||||
return prevCursor != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if list has a successor
|
||||
*
|
||||
* @return true if list has a successor
|
||||
*/
|
||||
public boolean hasNext() {
|
||||
return nextCursor != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* get next link to a list
|
||||
*
|
||||
* @return cursor
|
||||
*/
|
||||
public long getNext() {
|
||||
return nextCursor;
|
||||
}
|
||||
|
||||
/**
|
||||
* get size of the attached list
|
||||
*
|
||||
* @return size of the list
|
||||
*/
|
||||
public int getSize() {
|
||||
return users.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* get attached list
|
||||
*
|
||||
* @return list
|
||||
*/
|
||||
public List<TwitterUser> getUsers() {
|
||||
return users;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public String toString() {
|
||||
return "size=" + getSize() + " pre=" + prevCursor + " pos=" + nextCursor;
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@ import twitter4j.Relationship;
|
||||
/**
|
||||
* Holder for relationship information between the current user and another user
|
||||
*/
|
||||
public class UserProperties {
|
||||
public class UserConnection {
|
||||
|
||||
private final String targetScreenname;
|
||||
private final boolean isHome;
|
||||
@ -22,7 +22,7 @@ public class UserProperties {
|
||||
*
|
||||
* @param connect twitter4j relationship information
|
||||
*/
|
||||
public UserProperties(Relationship connect) {
|
||||
public UserConnection(Relationship connect) {
|
||||
targetScreenname = '@' + connect.getTargetUserScreenName();
|
||||
isHome = connect.getSourceUserId() == connect.getTargetUserId();
|
||||
isFriend = connect.isSourceFollowingTarget();
|
@ -20,17 +20,17 @@ import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
|
||||
import org.nuclearfog.twidda.adapter.UserAdapter;
|
||||
import org.nuclearfog.twidda.adapter.UserAdapter.UserClickListener;
|
||||
import org.nuclearfog.twidda.backend.UserListLoader;
|
||||
import org.nuclearfog.twidda.backend.UserListLoader.Mode;
|
||||
import org.nuclearfog.twidda.backend.UserListLoader.Action;
|
||||
import org.nuclearfog.twidda.backend.engine.EngineException;
|
||||
import org.nuclearfog.twidda.backend.helper.ErrorHandler;
|
||||
import org.nuclearfog.twidda.backend.holder.UserListHolder;
|
||||
import org.nuclearfog.twidda.backend.items.TwitterUser;
|
||||
import org.nuclearfog.twidda.database.GlobalSettings;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static android.os.AsyncTask.Status.FINISHED;
|
||||
import static android.os.AsyncTask.Status.RUNNING;
|
||||
import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID;
|
||||
import static org.nuclearfog.twidda.backend.UserListLoader.NO_CURSOR;
|
||||
|
||||
public class UserFragment extends Fragment implements OnRefreshListener, UserClickListener, FragmentChangeObserver {
|
||||
|
||||
@ -74,7 +74,7 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (userTask == null) {
|
||||
load();
|
||||
load(NO_CURSOR);
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
|
||||
@Override
|
||||
public void onRefresh() {
|
||||
if (userTask != null && userTask.getStatus() != RUNNING) {
|
||||
load();
|
||||
load(NO_CURSOR);
|
||||
}
|
||||
}
|
||||
|
||||
@ -104,6 +104,11 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFooterClick(long cursor) {
|
||||
load(cursor);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onTabChange() {
|
||||
@ -122,8 +127,8 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
|
||||
*
|
||||
* @param data list of twitter users
|
||||
*/
|
||||
public void setData(List<TwitterUser> data) {
|
||||
adapter.replaceAll(data);
|
||||
public void setData(UserListHolder data) {
|
||||
adapter.setData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -156,49 +161,44 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
|
||||
}
|
||||
|
||||
|
||||
private void load() {
|
||||
private void load(long cursor) {
|
||||
Bundle param = getArguments();
|
||||
if (param != null) {
|
||||
int mode = param.getInt(KEY_FRAG_USER_MODE, 0);
|
||||
long id = param.getLong(KEY_FRAG_USER_ID, 1);
|
||||
String search = param.getString(KEY_FRAG_USER_SEARCH, "");
|
||||
|
||||
Action action = Action.NONE;
|
||||
switch (mode) {
|
||||
case USER_FRAG_FOLLOWS:
|
||||
userTask = new UserListLoader(this, Mode.FOLLOWS);
|
||||
userTask.execute(id);
|
||||
action = Action.FOLLOWS;
|
||||
break;
|
||||
|
||||
case USER_FRAG_FRIENDS:
|
||||
userTask = new UserListLoader(this, Mode.FRIENDS);
|
||||
userTask.execute(id);
|
||||
action = Action.FRIENDS;
|
||||
break;
|
||||
|
||||
case USER_FRAG_RETWEET:
|
||||
userTask = new UserListLoader(this, Mode.RETWEET);
|
||||
userTask.execute(id);
|
||||
action = Action.RETWEET;
|
||||
break;
|
||||
|
||||
case USER_FRAG_FAVORIT:
|
||||
userTask = new UserListLoader(this, Mode.FAVORIT);
|
||||
userTask.execute(id);
|
||||
action = Action.FAVORIT;
|
||||
break;
|
||||
|
||||
case USER_FRAG_SEARCH:
|
||||
userTask = new UserListLoader(this, Mode.SEARCH);
|
||||
userTask.execute(search);
|
||||
action = Action.SEARCH;
|
||||
break;
|
||||
|
||||
case USER_FRAG_SUBSCR:
|
||||
userTask = new UserListLoader(this, Mode.SUBSCRIBER);
|
||||
userTask.execute(id);
|
||||
action = Action.SUBSCRIBER;
|
||||
break;
|
||||
|
||||
case USER_FRAG_LISTS:
|
||||
userTask = new UserListLoader(this, Mode.LIST);
|
||||
userTask.execute(id);
|
||||
action = Action.LIST;
|
||||
break;
|
||||
}
|
||||
userTask = new UserListLoader(this, action, id, search);
|
||||
userTask.execute(cursor);
|
||||
}
|
||||
}
|
||||
}
|
@ -10,6 +10,6 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/item_placeholder_margin"
|
||||
android:background="@drawable/button"
|
||||
android:text="@string/item_load_more_tweets" />
|
||||
android:text="@string/item_load_more" />
|
||||
|
||||
</androidx.cardview.widget.CardView>
|
@ -145,5 +145,5 @@
|
||||
<string name="error_rate_limit">Zu viele Anfragen! Bitte 15 Minuten warten!</string>
|
||||
<string name="info_cant_add_video">Video konnte nicht hinzugefügt werden!</string>
|
||||
<string name="error_file_not_found">Datei nicht gefunden!</string>
|
||||
<string name="item_load_more_tweets">Tweets laden</string>
|
||||
<string name="item_load_more">Mehr laden</string>
|
||||
</resources>
|
@ -148,5 +148,5 @@
|
||||
<string name="info_cant_add_video">Can\'t add video!</string>
|
||||
<string name="badge_twitter4j" translatable="false">Twitter4J Badge</string>
|
||||
<string name="error_file_not_found">File not found!</string>
|
||||
<string name="item_load_more_tweets">Load tweets</string>
|
||||
<string name="item_load_more">Load more</string>
|
||||
</resources>
|
Loading…
x
Reference in New Issue
Block a user