This commit is contained in:
NudeDude 2019-05-02 19:13:30 +02:00
parent 1e0accc412
commit f36e7f4f91
18 changed files with 619 additions and 86 deletions

View File

@ -20,7 +20,7 @@ import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.backend.StartPage;
import org.nuclearfog.twidda.backend.items.Tweet;
@ -53,7 +53,7 @@ public class MainActivity extends AppCompatActivity implements OnRefreshListener
private SwipeRefreshLayout timelineReload, trendReload, mentionReload;
private RecyclerView timelineList, trendList, mentionList;
private TimelineAdapter timelineAdapter, mentionAdapter;
private TweetAdapter timelineAdapter, mentionAdapter;
private View tlUnderline, trUnderline, mnUnderline;
private View lastTab, root;
private TrendAdapter trendsAdapter;
@ -126,9 +126,9 @@ public class MainActivity extends AppCompatActivity implements OnRefreshListener
Intent i = new Intent(this, LoginPage.class);
startActivityForResult(i, LOGIN);
} else if (mainAsync == null) {
timelineAdapter = new TimelineAdapter(this);
timelineAdapter = new TweetAdapter(this);
trendsAdapter = new TrendAdapter(this);
mentionAdapter = new TimelineAdapter(this);
mentionAdapter = new TweetAdapter(this);
root.setBackgroundColor(settings.getBackgroundColor());
timelineAdapter.setColor(settings.getHighlightColor(), settings.getFontColor());

View File

@ -26,10 +26,10 @@ import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class TimelineAdapter extends Adapter<TimelineAdapter.ItemHolder> {
public class TweetAdapter extends Adapter<TweetAdapter.ItemHolder> {
private WeakReference<OnItemClickListener> itemClickListener;
private Tweet tweets[];
private Tweet[] tweets;
private NumberFormat formatter;
private int highlight;
@ -37,7 +37,7 @@ public class TimelineAdapter extends Adapter<TimelineAdapter.ItemHolder> {
private boolean img_ldr = true;
public TimelineAdapter(OnItemClickListener l) {
public TweetAdapter(OnItemClickListener l) {
itemClickListener = new WeakReference<>(l);
formatter = NumberFormat.getIntegerInstance();
tweets = new Tweet[0];

View File

@ -10,7 +10,7 @@ import org.nuclearfog.twidda.R;
import twitter4j.TwitterException;
abstract class ErrorHandler {
public abstract class ErrorHandler {
/**
* Print twitter error message

View File

@ -17,7 +17,7 @@ import com.squareup.picasso.Picasso;
import org.nuclearfog.tag.Tagger;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import org.nuclearfog.twidda.database.DatabaseAdapter;
@ -53,7 +53,7 @@ public class ProfileLoader extends AsyncTask<Long, Void, Void> {
private final Mode mode;
private boolean failure = false;
private TimelineAdapter homeTl, homeFav;
private TweetAdapter homeTl, homeFav;
private WeakReference<UserProfile> ui;
private SimpleDateFormat sdf;
private TwitterEngine mTwitter;
@ -92,8 +92,8 @@ public class ProfileLoader extends AsyncTask<Long, Void, Void> {
RecyclerView profileTweets = context.findViewById(R.id.ht_list);
RecyclerView profileFavors = context.findViewById(R.id.hf_list);
homeTl = (TimelineAdapter) profileTweets.getAdapter();
homeFav = (TimelineAdapter) profileFavors.getAdapter();
homeTl = (TweetAdapter) profileTweets.getAdapter();
homeFav = (TweetAdapter) profileFavors.getAdapter();
}
@ -132,7 +132,7 @@ public class ProfileLoader extends AsyncTask<Long, Void, Void> {
db.storeUser(user);
if (!isHome) {
boolean connection[] = mTwitter.getConnection(UID);
boolean[] connection = mTwitter.getConnection(UID);
isFollowing = connection[0];
isFollowed = connection[1];
isBlocked = connection[2];

View File

@ -8,7 +8,7 @@ import android.util.Log;
import org.nuclearfog.twidda.MainActivity;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.backend.items.Trend;
import org.nuclearfog.twidda.backend.items.Tweet;
@ -37,7 +37,7 @@ public class StartPage extends AsyncTask<Integer, Void, Void> {
private TwitterEngine mTwitter;
private TwitterException err;
private TimelineAdapter timelineAdapter, mentionAdapter;
private TweetAdapter timelineAdapter, mentionAdapter;
private TrendAdapter trendsAdapter;
private List<Tweet> tweets, mention;
private List<Trend> trends;
@ -59,9 +59,9 @@ public class StartPage extends AsyncTask<Integer, Void, Void> {
RecyclerView trendList = context.findViewById(R.id.tr_list);
RecyclerView mentionList = context.findViewById(R.id.m_list);
timelineAdapter = (TimelineAdapter) timelineList.getAdapter();
timelineAdapter = (TweetAdapter) timelineList.getAdapter();
trendsAdapter = (TrendAdapter) trendList.getAdapter();
mentionAdapter = (TimelineAdapter) mentionList.getAdapter();
mentionAdapter = (TweetAdapter) mentionList.getAdapter();
}

View File

@ -17,7 +17,7 @@ import com.squareup.picasso.Picasso;
import org.nuclearfog.tag.Tagger;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
@ -51,7 +51,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
private TwitterEngine mTwitter;
private TwitterException err;
private WeakReference<TweetDetail> ui;
private TimelineAdapter answerAdapter;
private TweetAdapter answerAdapter;
private SimpleDateFormat sdf;
private NumberFormat formatter;
private List<Tweet> answers;
@ -65,7 +65,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Void> {
mTwitter = TwitterEngine.getInstance(context);
GlobalSettings settings = GlobalSettings.getInstance(context);
RecyclerView replyList = context.findViewById(R.id.answer_list);
answerAdapter = (TimelineAdapter) replyList.getAdapter();
answerAdapter = (TweetAdapter) replyList.getAdapter();
sdf = settings.getDateFormatter();
formatter = NumberFormat.getIntegerInstance();
font_color = settings.getFontColor();

View File

@ -72,7 +72,7 @@ public class TwitterEngine {
* @param context Main Thread Context
* @return TwitterEngine Instance
*/
static TwitterEngine getInstance(Context context) {
public static TwitterEngine getInstance(Context context) {
if (mTwitter == null) {
mTwitter = new TwitterEngine(context);
}

View File

@ -7,7 +7,7 @@ import android.support.v7.widget.RecyclerView;
import android.util.Log;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.backend.items.TwitterUser;
@ -21,7 +21,7 @@ import twitter4j.TwitterException;
public class TwitterSearch extends AsyncTask<String, Void, Void> {
private TimelineAdapter searchAdapter;
private TweetAdapter searchAdapter;
private UserAdapter userAdapter;
private List<Tweet> tweets;
private List<TwitterUser> users;
@ -38,7 +38,7 @@ public class TwitterSearch extends AsyncTask<String, Void, Void> {
RecyclerView tweetSearch = context.findViewById(R.id.tweet_result);
RecyclerView userSearch = context.findViewById(R.id.user_result);
searchAdapter = (TimelineAdapter) tweetSearch.getAdapter();
searchAdapter = (TweetAdapter) tweetSearch.getAdapter();
userAdapter = (UserAdapter) userSearch.getAdapter();
}

View File

@ -10,41 +10,56 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.fragment.backend.MessageLoader;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.fragment.backend.MessageLoader.Mode.LOAD;
public class MessageListFragment extends Fragment implements OnRefreshListener{
private MessageLoader messageTask;
private SwipeRefreshLayout root;
public class MessageListFragment extends Fragment implements OnRefreshListener, OnItemClickListener {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
SwipeRefreshLayout reload = new SwipeRefreshLayout(inflater.getContext());
root = new SwipeRefreshLayout(inflater.getContext());
RecyclerView list = new RecyclerView(inflater.getContext());
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
root.setOnRefreshListener(this);
root.addView(list);
return root;
}
@Override
public void onStart() {
super.onStart();
if(messageTask == null) {
messageTask = new MessageLoader(root, LOAD);
messageTask.execute();
}
}
@Override
public void onStop() {
super.onStop();
if(messageTask != null && messageTask.getStatus() == RUNNING)
messageTask.cancel(true);
}
@Override
public void onRefresh() {
messageTask = new MessageLoader(root, LOAD);
messageTask.execute();
}
@Override
public void onItemClick(RecyclerView rv, int pos) {
}
}

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
@ -11,40 +12,75 @@ import android.view.View;
import android.view.ViewGroup;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.fragment.backend.TrendLoader;
import org.nuclearfog.twidda.window.SearchPage;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.fragment.backend.TrendLoader.Mode.DB_TRND;
import static org.nuclearfog.twidda.fragment.backend.TrendLoader.Mode.LD_TRND;
public class TrendListFragment extends Fragment implements OnRefreshListener, OnItemClickListener {
private TrendLoader trendTask;
private SwipeRefreshLayout reload;
private TrendAdapter adapter;
private ViewGroup root;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
SwipeRefreshLayout reload = new SwipeRefreshLayout(inflater.getContext());
reload = new SwipeRefreshLayout(inflater.getContext());
RecyclerView list = new RecyclerView(inflater.getContext());
adapter = new TrendAdapter(this);
list.setAdapter(adapter);
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
}
@Override
public void onViewCreated(@NonNull View v, Bundle param) {
super.onViewCreated(v,param);
root = (ViewGroup) v;
}
@Override
public void onStart() {
super.onStart();
if (trendTask == null) {
trendTask = new TrendLoader(root, DB_TRND);
trendTask.execute();
}
}
@Override
public void onStop() {
if(trendTask != null && trendTask.getStatus() == RUNNING)
trendTask.cancel(true);
super.onStop();
}
@Override
public void onRefresh() {
trendTask = new TrendLoader(root, LD_TRND);
trendTask.execute();
}
@Override
public void onItemClick(RecyclerView rv, int pos) {
if (!reload.isRefreshing()) {
String search = adapter.getData(pos).getName();
Intent intent = new Intent(getContext(), SearchPage.class);
if (!search.startsWith("#"))
search = '\"' + search + '\"';
intent.putExtra("search", search);
startActivity(intent);
}
}
}

View File

@ -1,5 +1,7 @@
package org.nuclearfog.twidda.fragment;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
@ -11,40 +13,159 @@ import android.view.View;
import android.view.ViewGroup;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.fragment.backend.TweetLoader;
import org.nuclearfog.twidda.window.TweetDetail;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.DB_ANS;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.DB_FAVORS;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.DB_HOME;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.DB_MENT;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.DB_TWEETS;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.TL_HOME;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.TL_MENT;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.TWEET_ANS;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.TWEET_SEARCH;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.USR_FAVORS;
import static org.nuclearfog.twidda.fragment.backend.TweetLoader.Mode.USR_TWEETS;
public class TweetListFragment extends Fragment implements OnRefreshListener, OnItemClickListener {
public static final int HOME = 0;
public static final int MENT = 1;
public static final int USER_TWEET = 2;
public static final int USER_FAVOR = 3;
public static final int TWEET_ANSR = 4;
public static final int SEARCH = 5;
private TweetLoader tweetTask;
private SwipeRefreshLayout reload;
private TweetAdapter adapter;
private ViewGroup root;
private long id;
private int mode;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle param) {
SwipeRefreshLayout reload = new SwipeRefreshLayout(inflater.getContext());
super.onCreateView(inflater,parent,param);
reload = new SwipeRefreshLayout(inflater.getContext());
RecyclerView list = new RecyclerView(inflater.getContext());
adapter = new TweetAdapter(this);
list.setAdapter(adapter);
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
}
@Override
public void onViewCreated(@NonNull View v, Bundle param) {
Bundle b = getArguments();
if(b != null) {
mode = b.getInt("mode");
id = b.getInt("id");
}
root = (ViewGroup) v;
}
@Override
public void onStart() {
super.onStart();
if(tweetTask == null) {
switch(mode) {
case HOME:
tweetTask = new TweetLoader(root, DB_HOME);
tweetTask.execute();
break;
case MENT:
tweetTask = new TweetLoader(root, DB_MENT);
tweetTask.execute();
break;
case USER_TWEET:
tweetTask = new TweetLoader(root, DB_TWEETS);
tweetTask.execute();
break;
case USER_FAVOR:
tweetTask = new TweetLoader(root, DB_FAVORS);
tweetTask.execute(id);
break;
case TWEET_ANSR:
tweetTask = new TweetLoader(root, DB_ANS);
tweetTask.execute(id);
break;
case SEARCH:
tweetTask = new TweetLoader(root, TWEET_SEARCH);
tweetTask.execute(id);
break;
}
}
}
@Override
public void onStop() {
if(tweetTask != null && tweetTask.getStatus() == RUNNING)
tweetTask.cancel(true);
super.onStop();
}
@Override
public void onRefresh() {
switch(mode) {
case HOME:
tweetTask = new TweetLoader(root, TL_HOME);
tweetTask.execute();
break;
case MENT:
tweetTask = new TweetLoader(root, TL_MENT);
tweetTask.execute();
break;
case USER_TWEET:
tweetTask = new TweetLoader(root, USR_TWEETS);
tweetTask.execute();
break;
case USER_FAVOR:
tweetTask = new TweetLoader(root, USR_FAVORS);
tweetTask.execute();
break;
case TWEET_ANSR:
tweetTask = new TweetLoader(root, TWEET_ANS);
tweetTask.execute();
break;
case SEARCH:
tweetTask = new TweetLoader(root, TWEET_SEARCH);
tweetTask.execute();
break;
}
}
@Override
public void onItemClick(RecyclerView rv, int pos) {
if (!reload.isRefreshing()) {
Tweet tweet = adapter.getData(pos);
if (tweet.getEmbeddedTweet() != null)
tweet = tweet.getEmbeddedTweet();
Intent intent = new Intent(getContext(), TweetDetail.class);//,
intent.putExtra("tweetID", tweet.getId());
intent.putExtra("username", tweet.getUser().getScreenname());
startActivity(intent);
}
}
}
}

View File

@ -2,36 +2,110 @@ package org.nuclearfog.twidda.fragment.backend;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import org.nuclearfog.twidda.fragment.MessageListFragment;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.items.Message;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import java.lang.ref.WeakReference;
import java.util.List;
import twitter4j.TwitterException;
public class MessageLoader extends AsyncTask<Long, Void, Boolean> {
private WeakReference<MessageListFragment> ui;
public enum Mode {
LOAD,
DEL
}
private Mode mode;
private WeakReference<ViewGroup> ui;
private TwitterEngine mTwitter;
private TwitterException err;
private DatabaseAdapter db;
private MessageAdapter adapter;
private List<Message> messages;
public MessageLoader(@NonNull MessageListFragment frag) {
ui = new WeakReference<>(frag);
public MessageLoader(@NonNull ViewGroup root, Mode mode) {
ui = new WeakReference<>(root);
RecyclerView rv = (RecyclerView) root.getChildAt(0);
adapter = (MessageAdapter) rv.getAdapter();
mTwitter = TwitterEngine.getInstance(root.getContext());
db = new DatabaseAdapter(root.getContext());
this.mode = mode;
}
@Override
protected java.lang.Boolean doInBackground(java.lang.Long[] objects) {
protected void onPreExecute() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(true);
}
@Override
protected Boolean doInBackground(Long[] param) {
long messageId = 0;
try {
switch(mode) {
case LOAD:
messages = mTwitter.getMessages();
db.storeMessage(messages);
break;
case DEL:
messageId = param[0];
mTwitter.deleteMessage(messageId);
db.deleteDm(messageId);
messages = db.getMessages();
break;
}
} catch(TwitterException err) {
if (err.getErrorCode() == 34) {
db.deleteDm(messageId);
} else {
this.err = err;
}
return false;
} catch(Exception err) {
return false;
}
return true;
}
@Override
protected void onProgressUpdate(java.lang.Void[] v) {
protected void onPostExecute(Boolean success) {
if(ui.get() == null)
return;
if(success) {
adapter.setData(messages);
adapter.notifyDataSetChanged();
} else {
if(err != null)
ErrorHandler.printError(ui.get().getContext(), err);
}
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(false);
}
@Override
protected void onPostExecute(java.lang.Boolean success) {
protected void onCancelled() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(false);
}
}

View File

@ -2,35 +2,107 @@ package org.nuclearfog.twidda.fragment.backend;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import org.nuclearfog.twidda.fragment.TrendListFragment;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.items.Trend;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import java.lang.ref.WeakReference;
import java.util.List;
public class TrendLoader extends AsyncTask<Long, Void, Boolean> {
private WeakReference<TrendListFragment> ui;
import twitter4j.TwitterException;
public TrendLoader(@NonNull TrendListFragment frag) {
ui = new WeakReference<>(frag);
public class TrendLoader extends AsyncTask<Void, Void, Boolean> {
public enum Mode {
DB_TRND,
LD_TRND
}
private Mode mode;
private WeakReference<ViewGroup> ui;
private TwitterException err;
private TwitterEngine mTwitter;
private DatabaseAdapter db;
private TrendAdapter adapter;
private List<Trend> trends;
private int woeId;
public TrendLoader(@NonNull ViewGroup root, Mode mode) {
ui = new WeakReference<>(root);
mTwitter = TwitterEngine.getInstance(root.getContext());
db = new DatabaseAdapter(root.getContext());
GlobalSettings settings = GlobalSettings.getInstance(root.getContext());
woeId = settings.getWoeId();
RecyclerView list = (RecyclerView)root.getChildAt(0);
adapter = (TrendAdapter) list.getAdapter();
this.mode = mode;
}
@Override
protected java.lang.Boolean doInBackground(java.lang.Long[] objects) {
protected void onPreExecute() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(true);
}
@Override
protected Boolean doInBackground(Void[] v) {
try {
switch(mode) {
case DB_TRND:
trends = db.getTrends(woeId);
if(!trends.isEmpty())
break;
case LD_TRND:
trends = mTwitter.getTrends(woeId);
db.storeTrends(trends, woeId);
break;
}
} catch(TwitterException err) {
this.err = err;
return false;
} catch(Exception err) {
return false;
}
return true;
}
@Override
protected void onProgressUpdate(java.lang.Void[] v) {
protected void onPostExecute(Boolean success) {
if(ui.get() == null)
return;
if(success) {
adapter.setData(trends);
adapter.notifyDataSetChanged();
} else {
if(err != null)
ErrorHandler.printError(ui.get().getContext(), err);
}
SwipeRefreshLayout reload = (SwipeRefreshLayout) ui.get();
reload.setRefreshing(false);
}
@Override
protected void onPostExecute(java.lang.Boolean success) {
protected void onCancelled() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout) ui.get();
reload.setRefreshing(false);
}
}

View File

@ -2,35 +2,178 @@ package org.nuclearfog.twidda.fragment.backend;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.fragment.TweetListFragment;
import java.lang.ref.WeakReference;
import java.util.List;
import twitter4j.TwitterException;
public class TweetLoader extends AsyncTask<Long, Void, Boolean> {
public class TweetLoader extends AsyncTask<Object, Void, Boolean> {
private WeakReference<TweetListFragment> ui;
public enum Mode {
TL_HOME, DB_HOME,
TL_MENT, DB_MENT,
USR_TWEETS, DB_TWEETS,
USR_FAVORS, DB_FAVORS,
TWEET_ANS, DB_ANS,
TWEET_SEARCH
}
private Mode mode;
private WeakReference<ViewGroup> ui;
private TweetAdapter adapter;
private TwitterEngine mTwitter;
private GlobalSettings settings;
private TwitterException err;
private DatabaseAdapter db;
private List<Tweet> tweets;
public TweetLoader(@NonNull TweetListFragment frag) {
ui = new WeakReference<>(frag);
public TweetLoader(@NonNull ViewGroup root, Mode mode) {
ui = new WeakReference<>(root);
settings = GlobalSettings.getInstance(root.getContext());
RecyclerView list = (RecyclerView)root.getChildAt(0);
adapter = (TweetAdapter)list.getAdapter();
mTwitter = TwitterEngine.getInstance(root.getContext());
db = new DatabaseAdapter(root.getContext());
this.mode = mode;
}
@Override
protected Boolean doInBackground(Long[] objects) {
protected void onPreExecute() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(true);
}
@Override
protected Boolean doInBackground(Object[] param) {
long sinceId = 1;
try {
switch(mode) {
case DB_HOME:
tweets = db.getHomeTimeline();
if(!tweets.isEmpty())
break;
case TL_HOME:
if (adapter.getItemCount() > 0)
sinceId = adapter.getItemId(0);
tweets = mTwitter.getHome(1, sinceId);
db.storeHomeTimeline(tweets);
tweets.addAll(adapter.getData());
break;
case DB_MENT:
tweets = db.getMentions();
if(!tweets.isEmpty())
break;
case TL_MENT:
if (adapter.getItemCount() > 0)
sinceId = adapter.getItemId(0);
tweets = mTwitter.getMention(1, sinceId);
tweets.addAll(adapter.getData());
db.storeMentions(tweets);
publishProgress();
break;
case DB_TWEETS:
tweets = db.getUserTweets((long)param[0]);
if(!tweets.isEmpty())
break;
case USR_TWEETS:
if (adapter.getItemCount() > 0)
sinceId = adapter.getItemId(0);
tweets = mTwitter.getUserTweets((long)param[0], sinceId, 1);
db.storeUserTweets(tweets);
tweets.addAll(adapter.getData());
break;
case DB_FAVORS:
tweets = db.getUserFavs((long)param[0]);
if(!tweets.isEmpty())
break;
case USR_FAVORS:
if (adapter.getItemCount() > 0)
sinceId = adapter.getItemId(0);
tweets = mTwitter.getUserFavs((long)param[0], sinceId, 1);
db.storeUserFavs(tweets, (long)param[0]);
tweets.addAll(adapter.getData());
break;
case DB_ANS:
tweets = db.getAnswers((long)param[0]);
if(tweets.isEmpty() || !settings.getAnswerLoad())
break;
case TWEET_ANS:
if (adapter.getItemCount() > 0)
sinceId = adapter.getItemId(0);
tweets = mTwitter.getAnswers((String)param[1], (long)param[0], sinceId);
if (!tweets.isEmpty() && db.containStatus((long)param[0]))
db.storeReplies(tweets);
tweets.addAll(adapter.getData());
break;
case TWEET_SEARCH:
if (adapter.getItemCount() > 0)
sinceId = adapter.getItemId(0);
tweets = mTwitter.searchTweets((String)param[0], sinceId);
break;
}
} catch(TwitterException err) {
this.err = err;
return false;
}
catch(Exception err) {
return false;
}
return true;
}
@Override
protected void onProgressUpdate(Void[] v) {
protected void onPostExecute(Boolean success) {
if(ui.get() == null)
return;
if(success) {
int range = tweets.size();
adapter.setData(tweets);
adapter.notifyItemRangeChanged(0, range);
} else {
if(err != null)
ErrorHandler.printError(ui.get().getContext(), err);
}
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(false);
}
@Override
protected void onPostExecute(Boolean success) {
protected void onCancelled() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(false);
}
}

View File

@ -2,35 +2,107 @@ package org.nuclearfog.twidda.fragment.backend;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import org.nuclearfog.twidda.fragment.UserListFragment;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.ErrorHandler;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.backend.items.TwitterUser;
import java.lang.ref.WeakReference;
import java.util.List;
import twitter4j.TwitterException;
public class UserLoader extends AsyncTask<Long, Void, Boolean> {
private WeakReference<UserListFragment> ui;
public enum Mode {
FOLLOWS,
FRIENDS,
RETWEET,
FAVORIT
}
private Mode mode;
private WeakReference<ViewGroup> ui;
private TwitterEngine mTwitter;
private TwitterException err;
private UserAdapter adapter;
private List<TwitterUser> users;
public UserLoader(@NonNull UserListFragment frag) {
ui = new WeakReference<>(frag);
public UserLoader(@NonNull ViewGroup root) {
ui = new WeakReference<>(root);
mTwitter = TwitterEngine.getInstance(root.getContext());
RecyclerView list = (RecyclerView)root.getChildAt(0);
adapter = (UserAdapter) list.getAdapter();
}
@Override
protected java.lang.Boolean doInBackground(java.lang.Long[] objects) {
protected void onPreExecute() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout)ui.get();
reload.setRefreshing(true);
}
@Override
protected Boolean doInBackground(Long[] param) {
try {
switch(mode) {
case FOLLOWS:
users = mTwitter.getFollower(param[0], -1);
break;
case FRIENDS:
users = mTwitter.getFollowing(param[0], -1);
break;
case RETWEET:
users = mTwitter.getRetweeter(param[0], -1);
break;
case FAVORIT:
break;
}
} catch(TwitterException err) {
this.err = err;
return false;
} catch(Exception err) {
return false;
}
return true;
}
@Override
protected void onProgressUpdate(java.lang.Void[] v) {
protected void onPostExecute(Boolean success) {
if(ui.get() == null)
return;
if(success) {
adapter.setData(users);
adapter.notifyDataSetChanged();
} else {
if(err != null)
ErrorHandler.printError(ui.get().getContext(), err);
}
SwipeRefreshLayout reload = (SwipeRefreshLayout) ui.get();
reload.setRefreshing(false);
}
@Override
protected void onPostExecute(java.lang.Boolean success) {
protected void onCancelled() {
if(ui.get() == null)
return;
SwipeRefreshLayout reload = (SwipeRefreshLayout) ui.get();
reload.setRefreshing(false);
}
}

View File

@ -21,7 +21,7 @@ import android.widget.TabHost.OnTabChangeListener;
import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.TwitterSearch;
import org.nuclearfog.twidda.backend.items.Tweet;
@ -39,7 +39,7 @@ public class SearchPage extends AppCompatActivity implements OnRefreshListener,
OnTabChangeListener, OnItemClickListener {
private RecyclerView tweetSearch, userSearch;
private TimelineAdapter searchAdapter;
private TweetAdapter searchAdapter;
private UserAdapter userAdapter;
private SwipeRefreshLayout tweetReload;
private GlobalSettings settings;
@ -106,7 +106,7 @@ public class SearchPage extends AppCompatActivity implements OnRefreshListener,
protected void onStart() {
super.onStart();
if (searchAsync == null) {
searchAdapter = new TimelineAdapter(this);
searchAdapter = new TweetAdapter(this);
searchAdapter.setColor(settings.getHighlightColor(), settings.getFontColor());
searchAdapter.toggleImage(settings.getImageLoad());
tweetSearch.setAdapter(searchAdapter);

View File

@ -28,7 +28,7 @@ import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.MainActivity;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.StatusLoader;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.GlobalSettings;
@ -55,7 +55,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
private static final int TWEET = 2;
private RecyclerView answer_list;
private TimelineAdapter answerAdapter;
private TweetAdapter answerAdapter;
private StatusLoader statusAsync;
private GlobalSettings settings;
private SwipeRefreshLayout answerReload;
@ -120,7 +120,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
protected void onStart() {
super.onStart();
if (statusAsync == null) {
answerAdapter = new TimelineAdapter(this);
answerAdapter = new TweetAdapter(this);
answerAdapter.toggleImage(settings.getImageLoad());
answerAdapter.setColor(settings.getHighlightColor(), settings.getFontColor());
answer_list.setAdapter(answerAdapter);
@ -278,7 +278,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
}
public void imageClick(String mediaLinks[]) {
public void imageClick(String[] mediaLinks) {
Intent image = new Intent(this, ImageDetail.class);
image.putExtra("link", mediaLinks);
image.putExtra("storable", true);

View File

@ -25,7 +25,7 @@ import org.nuclearfog.tag.Tagger.OnTagClickListener;
import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.OnItemClickListener;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.backend.ProfileLoader;
import org.nuclearfog.twidda.backend.items.Tweet;
import org.nuclearfog.twidda.database.GlobalSettings;
@ -48,7 +48,7 @@ public class UserProfile extends AppCompatActivity implements OnRefreshListener,
private ProfileLoader profileAsync;
private GlobalSettings settings;
private RecyclerView homeList, favoriteList;
private TimelineAdapter tweetAdapter, favAdapter;
private TweetAdapter tweetAdapter, favAdapter;
private SwipeRefreshLayout homeReload, favoriteReload;
private View lastTab, tweetUnderline, favorUnderline;
private TextView tweetCount, favorCount;
@ -131,12 +131,12 @@ public class UserProfile extends AppCompatActivity implements OnRefreshListener,
protected void onStart() {
super.onStart();
if (profileAsync == null) {
tweetAdapter = new TimelineAdapter(this);
tweetAdapter = new TweetAdapter(this);
tweetAdapter.setColor(settings.getHighlightColor(), settings.getFontColor());
tweetAdapter.toggleImage(settings.getImageLoad());
homeList.setAdapter(tweetAdapter);
favAdapter = new TimelineAdapter(this);
favAdapter = new TweetAdapter(this);
favAdapter.setColor(settings.getHighlightColor(), settings.getFontColor());
favAdapter.toggleImage(settings.getImageLoad());
favoriteList.setAdapter(favAdapter);