diff --git a/app/src/main/java/org/nuclearfog/twidda/MainActivity.java b/app/src/main/java/org/nuclearfog/twidda/MainActivity.java index 594c79a8..a42b65c2 100644 --- a/app/src/main/java/org/nuclearfog/twidda/MainActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/MainActivity.java @@ -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()); diff --git a/app/src/main/java/org/nuclearfog/twidda/adapter/TimelineAdapter.java b/app/src/main/java/org/nuclearfog/twidda/adapter/TweetAdapter.java similarity index 97% rename from app/src/main/java/org/nuclearfog/twidda/adapter/TimelineAdapter.java rename to app/src/main/java/org/nuclearfog/twidda/adapter/TweetAdapter.java index 0fe76c92..759c3123 100644 --- a/app/src/main/java/org/nuclearfog/twidda/adapter/TimelineAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/adapter/TweetAdapter.java @@ -26,10 +26,10 @@ import java.util.Calendar; import java.util.Date; import java.util.List; -public class TimelineAdapter extends Adapter { +public class TweetAdapter extends Adapter { private WeakReference itemClickListener; - private Tweet tweets[]; + private Tweet[] tweets; private NumberFormat formatter; private int highlight; @@ -37,7 +37,7 @@ public class TimelineAdapter extends Adapter { private boolean img_ldr = true; - public TimelineAdapter(OnItemClickListener l) { + public TweetAdapter(OnItemClickListener l) { itemClickListener = new WeakReference<>(l); formatter = NumberFormat.getIntegerInstance(); tweets = new Tweet[0]; diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/ErrorHandler.java b/app/src/main/java/org/nuclearfog/twidda/backend/ErrorHandler.java index 960b93a4..b7a0a971 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/ErrorHandler.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/ErrorHandler.java @@ -10,7 +10,7 @@ import org.nuclearfog.twidda.R; import twitter4j.TwitterException; -abstract class ErrorHandler { +public abstract class ErrorHandler { /** * Print twitter error message diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/ProfileLoader.java b/app/src/main/java/org/nuclearfog/twidda/backend/ProfileLoader.java index 9ab16439..7fa2221f 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/ProfileLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/ProfileLoader.java @@ -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 { private final Mode mode; private boolean failure = false; - private TimelineAdapter homeTl, homeFav; + private TweetAdapter homeTl, homeFav; private WeakReference ui; private SimpleDateFormat sdf; private TwitterEngine mTwitter; @@ -92,8 +92,8 @@ public class ProfileLoader extends AsyncTask { 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 { db.storeUser(user); if (!isHome) { - boolean connection[] = mTwitter.getConnection(UID); + boolean[] connection = mTwitter.getConnection(UID); isFollowing = connection[0]; isFollowed = connection[1]; isBlocked = connection[2]; diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/StartPage.java b/app/src/main/java/org/nuclearfog/twidda/backend/StartPage.java index 92d289d7..98696737 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/StartPage.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/StartPage.java @@ -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 { private TwitterEngine mTwitter; private TwitterException err; - private TimelineAdapter timelineAdapter, mentionAdapter; + private TweetAdapter timelineAdapter, mentionAdapter; private TrendAdapter trendsAdapter; private List tweets, mention; private List trends; @@ -59,9 +59,9 @@ public class StartPage extends AsyncTask { 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(); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/StatusLoader.java b/app/src/main/java/org/nuclearfog/twidda/backend/StatusLoader.java index 09e6d7a2..098da041 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/StatusLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/StatusLoader.java @@ -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 { private TwitterEngine mTwitter; private TwitterException err; private WeakReference ui; - private TimelineAdapter answerAdapter; + private TweetAdapter answerAdapter; private SimpleDateFormat sdf; private NumberFormat formatter; private List answers; @@ -65,7 +65,7 @@ public class StatusLoader extends AsyncTask { 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(); diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterEngine.java b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterEngine.java index 1d7a2557..5b10e33e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterEngine.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterEngine.java @@ -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); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterSearch.java b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterSearch.java index b3b112b9..a34997f3 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterSearch.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterSearch.java @@ -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 { - private TimelineAdapter searchAdapter; + private TweetAdapter searchAdapter; private UserAdapter userAdapter; private List tweets; private List users; @@ -38,7 +38,7 @@ public class TwitterSearch extends AsyncTask { 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(); } diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/MessageListFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/MessageListFragment.java index fb1d84e7..ade9d4f6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/MessageListFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/MessageListFragment.java @@ -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) { - } + + + } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/TrendListFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/TrendListFragment.java index 7f8a26f3..ce565dae 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/TrendListFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/TrendListFragment.java @@ -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); + } } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/TweetListFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/TweetListFragment.java index 3e46efcd..c9624777 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/TweetListFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/TweetListFragment.java @@ -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); + } } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/MessageLoader.java b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/MessageLoader.java index 5ed7a02c..19c625b4 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/MessageLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/MessageLoader.java @@ -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 { - private WeakReference ui; + + public enum Mode { + LOAD, + DEL + } + private Mode mode; + private WeakReference ui; + private TwitterEngine mTwitter; + private TwitterException err; + private DatabaseAdapter db; + private MessageAdapter adapter; + private List 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); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TrendLoader.java b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TrendLoader.java index 8a23b7f5..912c89a6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TrendLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TrendLoader.java @@ -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 { - - private WeakReference ui; +import twitter4j.TwitterException; - public TrendLoader(@NonNull TrendListFragment frag) { - ui = new WeakReference<>(frag); +public class TrendLoader extends AsyncTask { + + public enum Mode { + DB_TRND, + LD_TRND + } + private Mode mode; + private WeakReference ui; + private TwitterException err; + private TwitterEngine mTwitter; + private DatabaseAdapter db; + private TrendAdapter adapter; + private List 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); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TweetLoader.java b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TweetLoader.java index f9ed837b..d4c44bd8 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TweetLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/TweetLoader.java @@ -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 { +public class TweetLoader extends AsyncTask { - private WeakReference 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 ui; + private TweetAdapter adapter; + private TwitterEngine mTwitter; + private GlobalSettings settings; + private TwitterException err; + private DatabaseAdapter db; + private List 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); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/UserLoader.java b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/UserLoader.java index 6771dd08..913cf87c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/backend/UserLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/backend/UserLoader.java @@ -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 { - private WeakReference ui; + public enum Mode { + FOLLOWS, + FRIENDS, + RETWEET, + FAVORIT + } + private Mode mode; + private WeakReference ui; + private TwitterEngine mTwitter; + private TwitterException err; + private UserAdapter adapter; + private List 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); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/window/SearchPage.java b/app/src/main/java/org/nuclearfog/twidda/window/SearchPage.java index a94041b6..14b925d6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/window/SearchPage.java +++ b/app/src/main/java/org/nuclearfog/twidda/window/SearchPage.java @@ -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); diff --git a/app/src/main/java/org/nuclearfog/twidda/window/TweetDetail.java b/app/src/main/java/org/nuclearfog/twidda/window/TweetDetail.java index 5d370a99..6b4cf171 100644 --- a/app/src/main/java/org/nuclearfog/twidda/window/TweetDetail.java +++ b/app/src/main/java/org/nuclearfog/twidda/window/TweetDetail.java @@ -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); diff --git a/app/src/main/java/org/nuclearfog/twidda/window/UserProfile.java b/app/src/main/java/org/nuclearfog/twidda/window/UserProfile.java index 71a638aa..a9224ddf 100644 --- a/app/src/main/java/org/nuclearfog/twidda/window/UserProfile.java +++ b/app/src/main/java/org/nuclearfog/twidda/window/UserProfile.java @@ -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);