restructured classes, bug fix

added RegEx for Syntax highlighting
This commit is contained in:
NudeDude 2018-09-21 17:37:19 +02:00
parent db8ca5c46a
commit 2353535311
19 changed files with 158 additions and 160 deletions

View File

@ -19,11 +19,11 @@ import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.backend.MainPage;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.viewadapter.TrendAdapter;
import org.nuclearfog.twidda.window.AppSettings;
import org.nuclearfog.twidda.window.LoginPage;
import org.nuclearfog.twidda.window.SearchPage;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.viewadapter;
package org.nuclearfog.twidda.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;

View File

@ -1,12 +1,10 @@
package org.nuclearfog.twidda.viewadapter;
package org.nuclearfog.twidda.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@ -17,6 +15,7 @@ import android.widget.TextView;
import com.squareup.picasso.Picasso;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.clickable.Tagger;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import java.text.SimpleDateFormat;
@ -102,10 +101,10 @@ public class TimelineAdapter extends Adapter<TimelineAdapter.ItemHolder> {
} else {
vh.retweeter.setText("");
}
Spanned text = Tagger.makeText(tweet.tweet, highlight);
vh.username.setText(tweet.user.username);
vh.screenname.setText(tweet.user.screenname);
vh.tweet.setText(highlight(tweet.tweet));
vh.tweet.setText(text);
vh.retweet.setText(retweet);
vh.favorite.setText(favorit);
vh.time.setText(stringTime(tweet.time));
@ -151,47 +150,6 @@ public class TimelineAdapter extends Adapter<TimelineAdapter.ItemHolder> {
}
public SpannableStringBuilder highlight(String tweet) {
SpannableStringBuilder sTweet = new SpannableStringBuilder(tweet);
int start = 0;
boolean marked = false;
for (int i = 0; i < tweet.length(); i++) {
char current = tweet.charAt(i);
switch (current) {
case '@':
start = i;
marked = true;
break;
case '#':
start = i;
marked = true;
break;
case '\'':
case '\"':
case '\n':
case ')':
case '(':
case ':':
case ' ':
case '.':
case ',':
case '!':
case '?':
case '-':
if (marked)
sTweet.setSpan(new ForegroundColorSpan(highlight), start, i, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
marked = false;
break;
}
if (i == tweet.length() - 1 && marked) {
sTweet.setSpan(new ForegroundColorSpan(highlight), start, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return sTweet;
}
/**
* Custom Click Listener
*/

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.viewadapter;
package org.nuclearfog.twidda.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.viewadapter;
package org.nuclearfog.twidda.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;

View File

@ -1,4 +1,4 @@
package org.nuclearfog.twidda.viewadapter;
package org.nuclearfog.twidda.adapter;
import android.content.Context;
import android.content.res.Resources;

View File

@ -8,12 +8,12 @@ import android.widget.Toast;
import org.nuclearfog.twidda.MainActivity;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.backend.listitems.Trend;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.viewadapter.TrendAdapter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;

View File

@ -7,9 +7,9 @@ import android.util.Log;
import android.widget.Toast;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.backend.listitems.Message;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.viewadapter.MessageAdapter;
import org.nuclearfog.twidda.window.DirectMessage;
import java.lang.ref.WeakReference;

View File

@ -13,11 +13,11 @@ import android.widget.Toast;
import com.squareup.picasso.Picasso;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.backend.listitems.TwitterUser;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.window.UserDetail;
import org.nuclearfog.twidda.window.UserProfile;

View File

@ -5,10 +5,6 @@ import android.os.AsyncTask;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.view.View;
import android.widget.Button;
@ -19,11 +15,11 @@ import android.widget.Toast;
import com.squareup.picasso.Picasso;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.backend.clickable.Tagger;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.window.SearchPage;
import org.nuclearfog.twidda.window.TweetDetail;
import java.lang.ref.WeakReference;
@ -154,7 +150,8 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
View mediaButton = ui.get().findViewById(R.id.image_attach);
View tweet_verify = ui.get().findViewById(R.id.tweet_verify);
tweetText.setText(highlight(tweet.tweet));
Spannable sTweet = Tagger.makeText(tweet.tweet, highlight, ui.get());
tweetText.setText(sTweet);
tweetText.setTextColor(font_color);
username.setText(tweet.user.username);
username.setTextColor(font_color);
@ -218,6 +215,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
answerAdapter.notifyDataSetChanged();
}
@Override
protected void onPostExecute(Long mode) {
if (ui.get() == null) return;
@ -225,10 +223,14 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
SwipeRefreshLayout ansReload = ui.get().findViewById(R.id.answer_reload);
ansReload.setRefreshing(false);
if (mode == DELETE) {
if (mode == FAVORITE || mode == RETWEET) {
ui.get().setResult(TweetDetail.CHANGED);
} else if (mode == DELETE) {
Toast.makeText(ui.get(), R.string.tweet_removed, Toast.LENGTH_SHORT).show();
ui.get().setResult(ui.get().CHANGED);
ui.get().setResult(TweetDetail.CHANGED);
ui.get().finish();
} else if (mode == ERROR) {
switch (returnCode) {
case 136:
@ -244,64 +246,4 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
}
}
}
private Spannable highlight(String tweet) {
Spannable sTweet = new SpannableStringBuilder(tweet);
int start = 0;
boolean marked = false;
for (int i = 0; i < tweet.length(); i++) {
char current = tweet.charAt(i);
switch (current) {
case '@':
case '#':
start = i;
marked = true;
break;
case '\'':
case '\"':
case '\n':
case ')':
case '(':
case ':':
case ' ':
case '.':
case ',':
case '!':
case '?':
case '-':
if (marked && start != i - 1)
sTweet = spanning(sTweet, start, i);
marked = false;
break;
}
}
if (marked && start != tweet.length() - 1) {
sTweet = spanning(sTweet, start, tweet.length());
}
return sTweet;
}
private Spannable spanning(Spannable sTweet, final int start, final int end) {
sTweet.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
TextView tv = (TextView) widget;
Spanned s = (Spanned) tv.getText();
String search = s.subSequence(start, end).toString();
Intent intent = new Intent(ui.get(), SearchPage.class);
if (search.startsWith("#"))
intent.putExtra("Addition", search);
intent.putExtra("search", search);
ui.get().startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(highlight);
ds.setUnderlineText(false);
}
}, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sTweet;
}
}

View File

@ -7,10 +7,10 @@ import android.util.Log;
import android.widget.Toast;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.backend.listitems.TwitterUser;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.viewadapter.UserAdapter;
import org.nuclearfog.twidda.window.SearchPage;
import java.lang.ref.WeakReference;

View File

@ -8,8 +8,8 @@ import android.util.Log;
import android.widget.Toast;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.listitems.TwitterUser;
import org.nuclearfog.twidda.viewadapter.UserAdapter;
import org.nuclearfog.twidda.window.UserDetail;
import java.lang.ref.WeakReference;

View File

@ -0,0 +1,65 @@
package org.nuclearfog.twidda.backend.clickable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Tagger {
private static final String PATTERN = "[@#][^\\s@#\\.\\,]+";
private static final int MODE = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
private Tagger() {
}
public static Spannable makeText(final String text, final int color, final OnTagClickListener l) {
SpannableStringBuilder sText = new SpannableStringBuilder(text);
Pattern p = Pattern.compile(PATTERN);
Matcher m = p.matcher(text);
while (m.find()) {
final int start = m.start();
final int end = m.end();
sText.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
l.onClick(text.substring(start, end));
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(color);
ds.setUnderlineText(false);
}
}, start, end, MODE);
}
return sText;
}
public static Spannable makeText(String text, int color) {
SpannableStringBuilder sText = new SpannableStringBuilder(text);
Pattern p = Pattern.compile(PATTERN);
Matcher m = p.matcher(text);
while (m.find()) {
final int start = m.start();
final int end = m.end();
ForegroundColorSpan sColor = new ForegroundColorSpan(color);
sText.setSpan(sColor, start, end, MODE);
}
return sText;
}
public interface OnTagClickListener {
void onClick(String text);
}
}

View File

@ -22,9 +22,9 @@ import com.flask.colorpicker.OnColorChangedListener;
import com.flask.colorpicker.builder.ColorPickerDialogBuilder;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.WorldIdAdapter;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.WorldIdAdapter;
/**
* App settings page

View File

@ -13,11 +13,11 @@ import android.view.MenuItem;
import android.view.View;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.adapter.MessageAdapter.OnItemSelected;
import org.nuclearfog.twidda.backend.MessageLoader;
import org.nuclearfog.twidda.backend.listitems.TwitterUser;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.MessageAdapter;
import org.nuclearfog.twidda.viewadapter.MessageAdapter.OnItemSelected;
import static android.os.AsyncTask.Status.RUNNING;

View File

@ -19,13 +19,13 @@ import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TimelineAdapter.OnItemClicked;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.backend.TwitterSearch;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.backend.listitems.TwitterUser;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter.OnItemClicked;
import org.nuclearfog.twidda.viewadapter.UserAdapter;
import static android.os.AsyncTask.Status.RUNNING;

View File

@ -21,12 +21,13 @@ import android.view.ViewGroup;
import android.widget.Toast;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TimelineAdapter.OnItemClicked;
import org.nuclearfog.twidda.backend.ImagePopup;
import org.nuclearfog.twidda.backend.StatusLoader;
import org.nuclearfog.twidda.backend.clickable.Tagger;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter.OnItemClicked;
import static android.os.AsyncTask.Status.RUNNING;
@ -37,12 +38,14 @@ import static android.os.AsyncTask.Status.RUNNING;
* @see ImagePopup
*/
public class TweetDetail extends AppCompatActivity implements OnClickListener,
OnItemClicked, OnRefreshListener {
OnItemClicked, OnRefreshListener, Tagger.OnTagClickListener {
public static final int CHANGED = 1;
private static final int TWEET = 2;
private RecyclerView answer_list;
private StatusLoader mStat;
private GlobalSettings settings;
private SwipeRefreshLayout answerReload;
private ConnectivityManager mConnect;
private String username = "";
@ -68,7 +71,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayShowTitleEnabled(false);
GlobalSettings settings = GlobalSettings.getInstance(this);
settings = GlobalSettings.getInstance(this);
isHome = userID == settings.getUserId();
mConnect = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
@ -85,10 +88,6 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
answer_list.setLayoutManager(new LinearLayoutManager(this));
root.setBackgroundColor(settings.getBackgroundColor());
TimelineAdapter answerAdapter = new TimelineAdapter(this);
answerAdapter.toggleImage(settings.loadImages());
answerAdapter.setColor(settings.getHighlightColor(), settings.getFontColor());
answer_list.setAdapter(answerAdapter);
favorite.setOnClickListener(this);
retweet.setOnClickListener(this);
@ -103,6 +102,11 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
protected void onStart() {
super.onStart();
if (mStat == null) {
TimelineAdapter answerAdapter = new TimelineAdapter(this);
answerAdapter.toggleImage(settings.loadImages());
answerAdapter.setColor(settings.getHighlightColor(), settings.getFontColor());
answer_list.setAdapter(answerAdapter);
answerReload.setRefreshing(true);
mStat = new StatusLoader(this);
mStat.execute(tweetID, StatusLoader.LOAD);
@ -120,6 +124,14 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
}
@Override
protected void onActivityResult(int reqCode, int returnCode, Intent i) {
if (reqCode == TWEET && returnCode == CHANGED) {
mStat = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu m) {
getMenuInflater().inflate(R.menu.tweet, m);
@ -209,6 +221,16 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
}
@Override
public void onClick(String text) {
Intent intent = new Intent(this, SearchPage.class);
if (text.startsWith("#"))
intent.putExtra("Addition", text);
intent.putExtra("search", text);
startActivity(intent);
}
@Override
public void onItemClick(ViewGroup parent, int position) {
TimelineAdapter timeLineAdapter = (TimelineAdapter) answer_list.getAdapter();
@ -218,7 +240,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
intent.putExtra("tweetID", tweet.tweetID);
intent.putExtra("userID", tweet.user.userID);
intent.putExtra("username", tweet.user.screenname);
startActivity(intent);
startActivityForResult(intent, TWEET);
}
}

View File

@ -12,11 +12,11 @@ import android.view.View;
import android.view.ViewGroup;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.adapter.UserAdapter.OnItemClicked;
import org.nuclearfog.twidda.backend.UserLists;
import org.nuclearfog.twidda.backend.listitems.TwitterUser;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.UserAdapter;
import org.nuclearfog.twidda.viewadapter.UserAdapter.OnItemClicked;
import static android.os.AsyncTask.Status.RUNNING;

View File

@ -20,11 +20,11 @@ import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.TimelineAdapter;
import org.nuclearfog.twidda.adapter.TimelineAdapter.OnItemClicked;
import org.nuclearfog.twidda.backend.ProfileLoader;
import org.nuclearfog.twidda.backend.listitems.Tweet;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter.OnItemClicked;
import static android.os.AsyncTask.Status.RUNNING;
@ -36,7 +36,10 @@ import static android.os.AsyncTask.Status.RUNNING;
public class UserProfile extends AppCompatActivity implements
OnRefreshListener, OnTabChangeListener, OnItemClicked {
private static final int TWEET = 1;
private ProfileLoader mProfile;
private GlobalSettings settings;
private SwipeRefreshLayout homeReload, favoriteReload;
private RecyclerView homeList, favoriteList;
private TabHost mTab;
@ -72,7 +75,7 @@ public class UserProfile extends AppCompatActivity implements
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayShowTitleEnabled(false);
GlobalSettings settings = GlobalSettings.getInstance(this);
settings = GlobalSettings.getInstance(this);
home = userId == settings.getUserId();
homeList.setLayoutManager(new LinearLayoutManager(this));
@ -90,16 +93,6 @@ public class UserProfile extends AppCompatActivity implements
mTab.addTab(tab2);
lastTab = mTab.getCurrentView();
TimelineAdapter homeTl = new TimelineAdapter(this);
homeTl.setColor(settings.getHighlightColor(), settings.getFontColor());
homeTl.toggleImage(settings.loadImages());
homeList.setAdapter(homeTl);
TimelineAdapter homeFav = new TimelineAdapter(this);
homeFav.setColor(settings.getHighlightColor(), settings.getFontColor());
homeFav.toggleImage(settings.loadImages());
favoriteList.setAdapter(homeFav);
mTab.setOnTabChangedListener(this);
homeReload.setOnRefreshListener(this);
favoriteReload.setOnRefreshListener(this);
@ -110,6 +103,16 @@ public class UserProfile extends AppCompatActivity implements
protected void onStart() {
super.onStart();
if (mProfile == null) {
TimelineAdapter homeTl = new TimelineAdapter(this);
homeTl.setColor(settings.getHighlightColor(), settings.getFontColor());
homeTl.toggleImage(settings.loadImages());
homeList.setAdapter(homeTl);
TimelineAdapter homeFav = new TimelineAdapter(this);
homeFav.setColor(settings.getHighlightColor(), settings.getFontColor());
homeFav.toggleImage(settings.loadImages());
favoriteList.setAdapter(homeFav);
mProfile = new ProfileLoader(this);
mProfile.execute(userId, 0L);
homeReload.setRefreshing(true);
@ -129,6 +132,14 @@ public class UserProfile extends AppCompatActivity implements
}
@Override
protected void onActivityResult(int reqCode, int returnCode, Intent i) {
if (reqCode == TWEET && returnCode == TweetDetail.CHANGED) {
mProfile = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu m) {
getMenuInflater().inflate(R.menu.profile, m);
@ -293,7 +304,7 @@ public class UserProfile extends AppCompatActivity implements
intent.putExtra("tweetID", tweet.tweetID);
intent.putExtra("userID", tweet.user.userID);
intent.putExtra("username", tweet.user.screenname);
startActivity(intent);
startActivityForResult(intent, TWEET);
}
} else {
TimelineAdapter tweetAdapter = (TimelineAdapter) favoriteList.getAdapter();
@ -305,7 +316,7 @@ public class UserProfile extends AppCompatActivity implements
intent.putExtra("tweetID", tweet.tweetID);
intent.putExtra("userID", tweet.user.userID);
intent.putExtra("username", tweet.user.screenname);
startActivity(intent);
startActivityForResult(intent, TWEET);
}
}
}