diff --git a/app/src/main/java/org/nuclearfog/twidda/MainActivity.java b/app/src/main/java/org/nuclearfog/twidda/MainActivity.java index 162fd138..002cb189 100644 --- a/app/src/main/java/org/nuclearfog/twidda/MainActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/MainActivity.java @@ -1,7 +1,6 @@ package org.nuclearfog.twidda; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v4.widget.SwipeRefreshLayout; @@ -17,6 +16,7 @@ import android.view.ViewGroup; import android.widget.TabHost; import android.widget.TabHost.TabSpec; +import org.nuclearfog.twidda.backend.TwitterEngine; import org.nuclearfog.twidda.backend.listitems.*; import org.nuclearfog.twidda.database.TrendDatabase; import org.nuclearfog.twidda.database.DatabaseAdapter; @@ -46,22 +46,23 @@ public class MainActivity extends AppCompatActivity implements private SwipeRefreshLayout timelineReload,trendReload,mentionReload; private RecyclerView timelineList, trendList,mentionList; private MenuItem profile, tweet, search, setting; - private SharedPreferences settings; private SearchView searchQuery; private Toolbar toolbar; private TabHost tabhost; private String currentTab = "timeline"; private int background, font_color, highlight; + private long homeId = 0L; + private final int REQCODE = 666; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mainpage); - settings = getSharedPreferences("settings", 0); - boolean login = settings.getBoolean("login", false); + TwitterEngine mTwitter = TwitterEngine.getInstance(this); + boolean login = mTwitter.loggedIn(); if( !login ) { Intent i = new Intent(this, LoginPage.class); - startActivityForResult(i,1); + startActivityForResult(i,REQCODE); } else { login(); } @@ -70,10 +71,12 @@ public class MainActivity extends AppCompatActivity implements @Override protected void onActivityResult(int reqCode, int returnCode, Intent i) { super.onActivityResult(reqCode,returnCode,i); - if(returnCode == RESULT_OK) { - login(); - } else { - finish(); + if(reqCode == REQCODE) { + if(returnCode == RESULT_OK) { + login(); + } else { + finish(); + } } } @@ -110,7 +113,7 @@ public class MainActivity extends AppCompatActivity implements case R.id.action_profile: intent = new Intent(this, UserProfile.class); Bundle bundle = new Bundle(); - bundle.putLong("userID",settings.getLong("userID", -1)); + bundle.putLong("userID",homeId); bundle.putBoolean("home", true); intent.putExtras(bundle); startActivity(intent); @@ -269,6 +272,7 @@ public class MainActivity extends AppCompatActivity implements * Login Handle */ private void login() { + homeId = TwitterEngine.getHomeId(); timelineList = (RecyclerView) findViewById(R.id.tl_list); trendList = (RecyclerView) findViewById(R.id.tr_list); mentionList = (RecyclerView) findViewById(R.id.m_list); 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 405442fb..ced5996b 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/ProfileLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/ProfileLoader.java @@ -1,7 +1,6 @@ package org.nuclearfog.twidda.backend; import android.content.Context; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; @@ -35,7 +34,7 @@ public class ProfileLoader extends AsyncTask { private String screenName, username, description, location, follower, following; private RecyclerView profileTweets, profileFavorits; - private String imageLink,/* bannerLink,*/ fullPbLink, link, dateString; + private String /* bannerLink,*/ profileImage, link, dateString; private TimelineRecycler homeTl, homeFav; private WeakReference ui; private TwitterEngine mTwitter; @@ -57,13 +56,14 @@ public class ProfileLoader extends AsyncTask { profileTweets = (RecyclerView) ui.get().findViewById(R.id.ht_list); profileFavorits = (RecyclerView) ui.get().findViewById(R.id.hf_list); mTwitter = TwitterEngine.getInstance(context); - SharedPreferences settings = context.getSharedPreferences("settings", 0); - imgEnabled = settings.getBoolean("image_load",true); ColorPreferences mColor = ColorPreferences.getInstance(ui.get()); highlight = mColor.getColor(ColorPreferences.HIGHLIGHTING); font = mColor.getColor(ColorPreferences.FONT_COLOR); + imgEnabled = mColor.loadImage(); } + + @Override protected Long doInBackground(Long... args) { long userId = args[0]; @@ -80,10 +80,7 @@ public class ProfileLoader extends AsyncTask { } if(MODE == GET_INFORMATION) { - DatabaseAdapter userdb = new DatabaseAdapter(ui.get()); - TwitterUser user = userdb.getUser(userId); - if(user == null) - user = mTwitter.getUser(userId); + TwitterUser user = mTwitter.getUser(userId); screenName = user.screenname; username = user.username; description = user.bio; @@ -93,9 +90,8 @@ public class ProfileLoader extends AsyncTask { link = user.link; follower = Integer.toString(user.follower); following = Integer.toString(user.following); - imageLink = user.profileImg; // bannerLink = user.bannerImg; - fullPbLink = user.fullpb; + profileImage = user.profileImg; Date d = new Date(user.created); dateString = "seit "+ DateFormat.getDateTimeInstance().format(d); } @@ -206,16 +202,14 @@ public class ProfileLoader extends AsyncTask { connect.findViewById(R.id.followback).setVisibility(View.VISIBLE); } if(imgEnabled) { - Picasso.with(context).load(imageLink).into(profile); - // Picasso.with(context).load(bannerLink).into(banner); // TODO + Picasso.with(context).load(profileImage+"_bigger").into(profile); profile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - new ImagePopup(context).execute(fullPbLink); + new ImagePopup(context).execute(profileImage); } }); } - ui.get().onLoaded(); } else if(mode == GET_TWEETS) { @@ -246,8 +240,4 @@ public class ProfileLoader extends AsyncTask { } } } - - public interface OnProfileFinished { - void onLoaded(); - } } \ No newline at end of file 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 aafa49d9..b33c329e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/StatusLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/StatusLoader.java @@ -2,9 +2,6 @@ package org.nuclearfog.twidda.backend; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; @@ -21,9 +18,8 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import java.io.InputStream; +import com.squareup.picasso.Picasso; import java.lang.ref.WeakReference; -import java.net.URL; import java.text.DateFormat; import java.util.Date; import java.util.List; @@ -51,10 +47,9 @@ public class StatusLoader extends AsyncTask implements View.On private TwitterEngine mTwitter; private TimelineRecycler tlAdp; private RecyclerView replyList; - private Bitmap profile_btm; private String usernameStr, scrNameStr, tweetStr, dateString; private String repliedUsername, apiName, retweeter; - private String medialinks[]; + private String medialinks[], profile_pb; private String errMSG = ""; private boolean retweeted, favorited, toggleImg, verified; private boolean rtFlag = false; @@ -66,12 +61,10 @@ public class StatusLoader extends AsyncTask implements View.On public StatusLoader(Context c) { mTwitter = TwitterEngine.getInstance(c); - SharedPreferences settings = c.getSharedPreferences("settings", 0); - toggleImg = settings.getBoolean("image_load", true); ColorPreferences mColor = ColorPreferences.getInstance(c); highlight = mColor.getColor(ColorPreferences.HIGHLIGHTING); font = mColor.getColor(ColorPreferences.FONT_COLOR); - + toggleImg = mColor.loadImage(); ui = new WeakReference<>((TweetDetail)c); replyList = (RecyclerView) ui.get().findViewById(R.id.answer_list); } @@ -86,12 +79,11 @@ public class StatusLoader extends AsyncTask implements View.On long mode = data[1]; try { Tweet tweet = mTwitter.getStatus(tweetID); - Tweet embeddedTweet = tweet.embedded; - if(embeddedTweet != null) { + if(tweet.embedded != null) { retweeter = "Retweet "+tweet.user.screenname; retweeterID = tweet.user.userID; - tweet = mTwitter.getStatus(embeddedTweet.tweetID); - tweetID = embeddedTweet.tweetID; + tweet = tweet.embedded; + tweetID = tweet.tweetID; rtFlag = true; } rt = tweet.retweet; @@ -109,13 +101,8 @@ public class StatusLoader extends AsyncTask implements View.On apiName = formatString(tweet.source); dateString = DateFormat.getDateTimeInstance().format(new Date(tweet.time)); repliedUsername = tweet.replyName; - - if(toggleImg) { - String pbLink = tweet.user.profileImg; - InputStream iStream = new URL(pbLink).openStream(); - profile_btm = BitmapFactory.decodeStream(iStream); - medialinks = tweet.media; - } + profile_pb = tweet.user.profileImg+"_bigger"; + medialinks = tweet.media; } else if(mode == RETWEET) { if(retweeted) { @@ -223,8 +210,8 @@ public class StatusLoader extends AsyncTask implements View.On tweet_verify.setVisibility(View.VISIBLE); } if(toggleImg) { - profile_img.setImageBitmap(profile_btm); - if(medialinks.length != 0) { + Picasso.with(ui.get()).load(profile_pb).into(profile_img); + if(medialinks != null && medialinks.length != 0) { mediabutton.setVisibility(View.VISIBLE); mediabutton.setOnClickListener(this); } @@ -260,6 +247,7 @@ public class StatusLoader extends AsyncTask implements View.On } } + private String formatString(String input) { StringBuilder output = new StringBuilder("gesendet von: "); boolean openTag = false; @@ -276,6 +264,7 @@ public class StatusLoader extends AsyncTask implements View.On return output.toString(); } + private Spannable highlight(String tweet) { Spannable sTweet = new SpannableStringBuilder(tweet); int start = 0; @@ -313,6 +302,7 @@ public class StatusLoader extends AsyncTask implements View.On return sTweet; } + private Spannable spanning(Spannable sTweet, final int start, final int end) { sTweet.setSpan(new ClickableSpan() { @Override @@ -364,7 +354,7 @@ public class StatusLoader extends AsyncTask implements View.On case R.id.answer_reference_detail: Intent tweet = new Intent(ui.get(), TweetDetail.class); tweet.putExtra("tweetID",tweetReplyID); - tweet.putExtra("username", repliedUsername); + tweet.putExtra("username", '@'+repliedUsername); ui.get().startActivity(tweet); break; 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 93502370..821e88dc 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterEngine.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterEngine.java @@ -45,6 +45,7 @@ public class TwitterEngine { private Context context; private SharedPreferences settings; private RequestToken reqToken; + private boolean login; private int load; @@ -55,6 +56,7 @@ public class TwitterEngine { */ private TwitterEngine(Context context) { settings = context.getSharedPreferences("settings", 0); + login = settings.getBoolean("login", false); ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); @@ -108,6 +110,7 @@ public class TwitterEngine { builder.setTweetModeExtended(true); AccessToken token = new AccessToken(key1,key2); twitter = new TwitterFactory( builder.build() ).getInstance(token); + login = true; } @@ -134,12 +137,19 @@ public class TwitterEngine { */ private void init() { String key1,key2; - if( settings.getBoolean("login", false) ) { + if( login ) { key1 = settings.getString("key1", " "); key2 = settings.getString("key2", " "); - twitterID = settings.getLong("userID", -1L); initKeys(key1,key2); } + twitterID = settings.getLong("userID", -1L); + } + + /** + * @return if Twitter4J is registered + */ + public boolean loggedIn() { + return login; } @@ -420,7 +430,7 @@ public class TwitterEngine { * @throws TwitterException if Access is unavailable */ public void favorite(long id, boolean active) throws TwitterException { - if(!active){ + if(!active) { twitter.createFavorite(id); } else { twitter.destroyFavorite(id); @@ -514,7 +524,7 @@ public class TwitterEngine { * @return User item */ private TwitterUser getUser(User user) { - return new TwitterUser(user.getId(),user.getName(),user.getScreenName(),user.getMiniProfileImageURL(), + return new TwitterUser(user.getId(),user.getName(),user.getScreenName(), user.getOriginalProfileImageURL(),user.getDescription(),user.getLocation(),user.isVerified(), user.isProtected(),user.getURL(),user.getProfileBannerURL(),user.getCreatedAt().getTime(), user.getFriendsCount(),user.getFollowersCount()); 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 b4318b25..6e491b20 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterSearch.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterSearch.java @@ -1,7 +1,6 @@ package org.nuclearfog.twidda.backend; import android.content.Context; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; @@ -26,7 +25,7 @@ public class TwitterSearch extends AsyncTask { private RecyclerView tweetSearch, userSearch; private TwitterEngine mTwitter; private WeakReference ui; - private int background, highlight, font_color; + private int highlight, font_color; private String error; boolean imageload; @@ -36,11 +35,9 @@ public class TwitterSearch extends AsyncTask { userSearch = (RecyclerView) ui.get().findViewById(R.id.user_result); mTwitter = TwitterEngine.getInstance(context); ColorPreferences mcolor = ColorPreferences.getInstance(context); - background = mcolor.getColor(ColorPreferences.BACKGROUND); highlight = mcolor.getColor(ColorPreferences.HIGHLIGHTING); font_color = mcolor.getColor(ColorPreferences.FONT_COLOR); - SharedPreferences settings = ui.get().getSharedPreferences("settings", 0); - imageload = settings.getBoolean("image_load", true); + imageload = mcolor.loadImage(); } @Override @@ -60,7 +57,6 @@ public class TwitterSearch extends AsyncTask { List tweets = mTwitter.searchTweets(strSearch,id); tlRc = new TimelineRecycler(tweets,ui.get()); } - if(uAdp == null ||uAdp.getItemCount() == 0) { List user = mTwitter.searchUsers(strSearch); uAdp = new UserRecycler(user, ui.get()); @@ -86,7 +82,6 @@ public class TwitterSearch extends AsyncTask { SwipeRefreshLayout tweetReload = (SwipeRefreshLayout)connect.findViewById(R.id.searchtweets); ProgressBar circleLoad = (ProgressBar)connect.findViewById(R.id.search_progress); - circleLoad.setVisibility(View.INVISIBLE); tweetSearch.setAdapter(tlRc); userSearch.setAdapter(uAdp); diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/UserLists.java b/app/src/main/java/org/nuclearfog/twidda/backend/UserLists.java index f3334bb3..56d83649 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/UserLists.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/UserLists.java @@ -2,7 +2,6 @@ package org.nuclearfog.twidda.backend; import android.app.Dialog; import android.content.Context; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.support.v7.widget.RecyclerView; import android.view.Window; @@ -11,6 +10,7 @@ import android.widget.Toast; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.viewadapter.UserRecycler; +import org.nuclearfog.twidda.window.ColorPreferences; import org.nuclearfog.twidda.window.UserDetail; import org.nuclearfog.twidda.backend.listitems.*; @@ -41,9 +41,7 @@ public class UserLists extends AsyncTask { ui = new WeakReference<>((UserDetail)context); mTwitter = TwitterEngine.getInstance(context); userList = (RecyclerView) ui.get().findViewById(R.id.userlist); - // uProgress = (ProgressBar) ui.get().findViewById(R.id.user_progress); - SharedPreferences settings = context.getSharedPreferences("settings", 0); - imageload = settings.getBoolean("image_load", true); + imageload = ColorPreferences.getInstance(ui.get()).loadImage(); circle = new ProgressBar(ui.get()); popup = new Dialog(ui.get()); } @@ -51,7 +49,8 @@ public class UserLists extends AsyncTask { @Override protected void onPreExecute() { popup.requestWindowFeature(Window.FEATURE_NO_TITLE); - popup.getWindow().setBackgroundDrawableResource(android.R.color.transparent); + if(popup.getWindow() != null) + popup.getWindow().setBackgroundDrawableResource(android.R.color.transparent); popup.setContentView(circle); popup.show(); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/listitems/Tweet.java b/app/src/main/java/org/nuclearfog/twidda/backend/listitems/Tweet.java index 94324d02..08df5eed 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/listitems/Tweet.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/listitems/Tweet.java @@ -2,8 +2,8 @@ package org.nuclearfog.twidda.backend.listitems; public class Tweet { public final TwitterUser user; - public final long tweetID; public final Tweet embedded; + public final long tweetID; public final String tweet, replyName,source; public final long time, replyID; public final int retweet, favorit; diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/listitems/TwitterUser.java b/app/src/main/java/org/nuclearfog/twidda/backend/listitems/TwitterUser.java index 1ca9c656..b3658bae 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/listitems/TwitterUser.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/listitems/TwitterUser.java @@ -2,7 +2,7 @@ package org.nuclearfog.twidda.backend.listitems; public class TwitterUser { public final String username,screenname,bio; - public final String profileImg,fullpb,bannerImg; + public final String profileImg,bannerImg; public final String location,link; public final boolean isVerified,isLocked; public final long userID; @@ -10,13 +10,12 @@ public class TwitterUser { public final int following, follower; public TwitterUser(long userID, String username, String screenname, String profileImg, - String fullpb, String bio, String location, boolean isVerified, boolean isLocked, - String link, String bannerImg, long created, int following, int follower) { + String bio, String location, boolean isVerified, boolean isLocked, String link, + String bannerImg, long created, int following, int follower) { this.userID = userID; this.username = username; this.screenname = '@'+screenname; this.profileImg = profileImg; - this.fullpb = fullpb; this.bio = bio; this.link = link; this.location = location; diff --git a/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java b/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java index 56431174..f759b10b 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java @@ -22,15 +22,11 @@ public class AppDatabase extends SQLiteOpenHelper "FOREIGN KEY (userID) REFERENCES user(userID)," + "FOREIGN KEY (tweetID) REFERENCES tweet(tweetID));"; - private static final String retweetTable = "CREATE TABLE IF NOT EXISTS retweet ("+ - "userID INTEGER, tweetID INTEGER UNIQUE," + - "FOREIGN KEY (userID) REFERENCES user(userID)," + - "FOREIGN KEY (tweetID) REFERENCES tweet(tweetID));"; - private static final String timelineTable = "CREATE TABLE IF NOT EXISTS timeline (" + - "tweetID INTEGER UNIQUE, mTweetID INTEGER UNIQUE," + - "FOREIGN KEY (tweetID) REFERENCES tweet(tweetID));" + - "FOREIGN KEY (mTweetID) REFERENCES tweet(tweetID));"; + "tweetID INTEGER UNIQUE, FOREIGN KEY (tweetID) REFERENCES tweet(tweetID) );"; + + private static final String mentionTable = "CREATE TABLE IF NOT EXISTS mention (" + + "tweetID INTEGER UNIQUE, FOREIGN KEY (tweetID) REFERENCES tweet(tweetID) );"; private static final String trendTable = "CREATE TABLE IF NOT EXISTS trend (" + "trendpos INTEGER PRIMARY KEY, trendname TEXT, trendlink TEXT);"; @@ -48,8 +44,8 @@ public class AppDatabase extends SQLiteOpenHelper db.execSQL(tweetTable); db.execSQL(trendTable); db.execSQL(timelineTable); + db.execSQL(mentionTable); db.execSQL(favoriteTable); - db.execSQL(retweetTable); } @Override @@ -58,7 +54,7 @@ public class AppDatabase extends SQLiteOpenHelper db.execSQL("DROP TABLE IF EXISTS " + "tweet"); db.execSQL("DROP TABLE IF EXISTS " + "favorit"); db.execSQL("DROP TABLE IF EXISTS " + "timeline"); - db.execSQL("DROP TABLE IF EXISTS " + "retweet"); + db.execSQL("DROP TABLE IF EXISTS " + "mentionTable"); db.execSQL("DROP TABLE IF EXISTS " + "trend"); onCreate(db); } diff --git a/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java b/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java index d8eafe64..df1ff9ae 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java @@ -19,6 +19,7 @@ public class DatabaseAdapter { private List tweetlist; private Context context; + public DatabaseAdapter(Context context) { dataHelper = AppDatabase.getInstance(context); tweetlist = new ArrayList<>(); @@ -53,8 +54,8 @@ public class DatabaseAdapter { fav.put("userID", id); db.insertWithOnConflict("favorit",null,fav,SQLiteDatabase.CONFLICT_REPLACE); } else if(mode == MENT) { - ment.put("mTweetID", tweet.tweetID); - db.insertWithOnConflict("timeline",null,ment,SQLiteDatabase.CONFLICT_IGNORE); + ment.put("tweetID", tweet.tweetID); + db.insertWithOnConflict("mention",null,ment,SQLiteDatabase.CONFLICT_REPLACE); } } } @@ -68,11 +69,11 @@ public class DatabaseAdapter { if(mode == HOME) { SQL_GET_HOME = "SELECT * FROM timeline " + "INNER JOIN tweet ON timeline.tweetID = tweet.tweetID " + - "INNER JOIN user ON tweet.userID=user.userID ORDER BY tweetID DESC"; + "INNER JOIN user ON tweet.userID = user.userID ORDER BY tweetID DESC"; } else if(mode == MENT) { - SQL_GET_HOME = "SELECT * FROM timeline " + - "INNER JOIN tweet ON timeline.mTweetID = tweet.tweetID " + - "INNER JOIN user ON tweet.userID=user.userID ORDER BY tweetID ASC"; + SQL_GET_HOME = "SELECT * FROM mention " + + "INNER JOIN tweet ON mention.tweetID = tweet.tweetID " + + "INNER JOIN user ON tweet.userID = user.userID ORDER BY tweetID ASC"; } else if(mode == TWEET) { SQL_GET_HOME = "SELECT * FROM user " + @@ -87,7 +88,7 @@ public class DatabaseAdapter { Cursor cursor = db.rawQuery(SQL_GET_HOME,null); if(cursor.moveToFirst()) { do { - Tweet tweet = getTweet(cursor); + Tweet tweet = getStatus(cursor); tweetlist.add(tweet); } while(cursor.moveToNext()); } @@ -97,7 +98,7 @@ public class DatabaseAdapter { } - public Tweet getTweet(long tweetId) { + public Tweet getStatus(long tweetId) { SQLiteDatabase search = dataHelper.getReadableDatabase(); Tweet result = null; String query = "SELECT * FROM tweet " + @@ -105,7 +106,7 @@ public class DatabaseAdapter { "WHERE tweet.tweetID == " + tweetId; Cursor cursor = search.rawQuery(query,null); if(cursor.moveToFirst()) - result = getTweet(cursor); + result = getStatus(cursor); cursor.close(); return result; } @@ -123,7 +124,7 @@ public class DatabaseAdapter { } - private Tweet getTweet(Cursor cursor) { + private Tweet getStatus(Cursor cursor) { int index; index = cursor.getColumnIndex("time"); long time = cursor.getLong(index); @@ -150,7 +151,7 @@ public class DatabaseAdapter { TwitterUser user = getUser(cursor); Tweet embeddedTweet = null; if(retweetId > 0) - embeddedTweet = getTweet(retweetId); + embeddedTweet = getStatus(retweetId); return new Tweet(tweetId,retweet,favorit,user,tweettext,time,replyname,null, source,replyStatusId,embeddedTweet,retweeted,favorized); } @@ -169,8 +170,6 @@ public class DatabaseAdapter { boolean locked = cursor.getInt(index) == 1; index = cursor.getColumnIndex("pbLink"); String profileImg = cursor.getString(index); - index = cursor.getColumnIndex("fullpb"); - String fullpb = cursor.getString(index); index = cursor.getColumnIndex("bio"); String bio = cursor.getString(index); index = cursor.getColumnIndex("link"); @@ -185,15 +184,16 @@ public class DatabaseAdapter { int following = cursor.getInt(index); index = cursor.getColumnIndex("follower"); int follower = cursor.getInt(index); - return new TwitterUser(userId, username,screenname,profileImg,fullpb,bio, + return new TwitterUser(userId, username,screenname,profileImg,bio, location,isVerified,locked,link,banner,createdAt,following,follower); } private void storeStatus(Tweet tweet, SQLiteDatabase db, long retweetID) { ContentValues status = new ContentValues(); - ContentValues user = new ContentValues(); + TwitterUser mUser = tweet.user; + storeUser(mUser,db); status.put("tweetID", tweet.tweetID); status.put("userID", mUser.userID); @@ -208,23 +208,27 @@ public class DatabaseAdapter { status.put("retweeted",tweet.retweeted); status.put("favorized", tweet.favorized); - user.put("userID", mUser.userID); - user.put("username", mUser.username); - user.put("scrname", mUser.screenname.substring(1)); - user.put("pbLink", mUser.profileImg); - user.put("fullpb", mUser.fullpb); - user.put("verify", mUser.isVerified); - user.put("locked", mUser.isLocked); - user.put("bio", mUser.bio); - user.put("link", mUser.link); - user.put("location", mUser.location); - user.put("banner", mUser.bannerImg); - user.put("createdAt", mUser.created); - user.put("following", mUser.following); - user.put("follower", mUser.follower); - db.insertWithOnConflict("tweet",null, status,SQLiteDatabase.CONFLICT_REPLACE); - db.insertWithOnConflict("user",null, user,SQLiteDatabase.CONFLICT_REPLACE); + } + + + private void storeUser(TwitterUser user, SQLiteDatabase db) { + ContentValues userColumn = new ContentValues(); + userColumn.put("userID", user.userID); + userColumn.put("username", user.username); + userColumn.put("scrname", user.screenname.substring(1)); + userColumn.put("pbLink", user.profileImg); + userColumn.put("verify", user.isVerified); + userColumn.put("locked", user.isLocked); + userColumn.put("bio", user.bio); + userColumn.put("link", user.link); + userColumn.put("location", user.location); + userColumn.put("banner", user.bannerImg); + userColumn.put("createdAt", user.created); + userColumn.put("following", user.following); + userColumn.put("follower", user.follower); + + db.insertWithOnConflict("user",null, userColumn,SQLiteDatabase.CONFLICT_IGNORE); } diff --git a/app/src/main/java/org/nuclearfog/twidda/viewadapter/TimelineRecycler.java b/app/src/main/java/org/nuclearfog/twidda/viewadapter/TimelineRecycler.java index 78084ce2..a84a69c1 100644 --- a/app/src/main/java/org/nuclearfog/twidda/viewadapter/TimelineRecycler.java +++ b/app/src/main/java/org/nuclearfog/twidda/viewadapter/TimelineRecycler.java @@ -94,7 +94,7 @@ public class TimelineRecycler extends Adapter imple vh.favorite.setText(favorit); vh.time.setText(stringTime(tweet.time)); if(img_ldr) { - Picasso.with(parent.getContext()).load(tweet.user.profileImg).into(vh.profile); + Picasso.with(parent.getContext()).load(tweet.user.profileImg+"_mini").into(vh.profile); } if(tweet.user.isVerified) { vh.verify.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/nuclearfog/twidda/viewadapter/UserRecycler.java b/app/src/main/java/org/nuclearfog/twidda/viewadapter/UserRecycler.java index c12ab7c8..0a694b58 100644 --- a/app/src/main/java/org/nuclearfog/twidda/viewadapter/UserRecycler.java +++ b/app/src/main/java/org/nuclearfog/twidda/viewadapter/UserRecycler.java @@ -61,7 +61,7 @@ public class UserRecycler extends RecyclerView.Adapter vh.screenname.setText(user.screenname); vh.username.setText(user.username); if(loadImage) { - Picasso.with(parent.getContext()).load(user.profileImg).into(vh.profileImg); + Picasso.with(parent.getContext()).load(user.profileImg+"_mini").into(vh.profileImg); } if(user.isVerified) { vh.verifyIco.setVisibility(View.VISIBLE); 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 6ede36eb..c112a793 100644 --- a/app/src/main/java/org/nuclearfog/twidda/window/SearchPage.java +++ b/app/src/main/java/org/nuclearfog/twidda/window/SearchPage.java @@ -13,7 +13,6 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.ProgressBar; import android.widget.TabHost; import org.nuclearfog.twidda.R; @@ -80,17 +79,18 @@ public class SearchPage extends AppCompatActivity implements UserRecycler.OnItem @Override public boolean onCreateOptionsMenu(Menu m) { getMenuInflater().inflate(R.menu.search, m); - SearchView searchQuery = (SearchView)m.findItem(R.id.new_search).getActionView(); + final SearchView searchQuery = (SearchView)m.findItem(R.id.new_search).getActionView(); searchQuery.setQueryHint(search); searchQuery.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { search = s; - ProgressBar mCircle = (ProgressBar)findViewById(R.id.search_progress); - mCircle.setVisibility(View.VISIBLE); + searchQuery.setQueryHint(search); + findViewById(R.id.search_progress).setVisibility(View.VISIBLE); tweetSearch.setAdapter(null); + userSearch.setAdapter(null); getContent(); - return false; + return true; } @Override public boolean onQueryTextChange(String s) { @@ -144,7 +144,9 @@ public class SearchPage extends AppCompatActivity implements UserRecycler.OnItem Intent profile = new Intent(getApplicationContext(), UserProfile.class); Bundle bundle = new Bundle(); long userID = user.userID; + String username = user.screenname; bundle.putLong("userID",userID); + bundle.putString("username", username); profile.putExtras(bundle); startActivity(profile); break; 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 502164f8..c1c4366f 100644 --- a/app/src/main/java/org/nuclearfog/twidda/window/UserProfile.java +++ b/app/src/main/java/org/nuclearfog/twidda/window/UserProfile.java @@ -1,7 +1,6 @@ package org.nuclearfog.twidda.window; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v4.widget.SwipeRefreshLayout; @@ -17,11 +16,13 @@ import android.widget.TabHost; import android.widget.TextView; import org.nuclearfog.twidda.R; +import org.nuclearfog.twidda.backend.TwitterEngine; import org.nuclearfog.twidda.backend.listitems.*; import org.nuclearfog.twidda.database.DatabaseAdapter; import org.nuclearfog.twidda.backend.ProfileLoader; import org.nuclearfog.twidda.viewadapter.TimelineRecycler; +import java.text.DateFormat; import java.util.List; /** @@ -30,7 +31,7 @@ import java.util.List; */ public class UserProfile extends AppCompatActivity implements View.OnClickListener, SwipeRefreshLayout.OnRefreshListener, TabHost.OnTabChangeListener, - TimelineRecycler.OnItemClicked, ProfileLoader.OnProfileFinished { + TimelineRecycler.OnItemClicked { private ProfileLoader mProfile, mTweets, mFavorits; private SwipeRefreshLayout homeReload, favoriteReload; @@ -39,26 +40,33 @@ public class UserProfile extends AppCompatActivity implements View.OnClickListen private boolean home, imageload; private String username = ""; private String currentTab = "tweets"; + int highlight, background, font_color; @Override protected void onCreate(Bundle b) { super.onCreate(b); setContentView(R.layout.profile); - getExtras(getIntent().getExtras()); Toolbar tool = (Toolbar) findViewById(R.id.profile_toolbar); setSupportActionBar(tool); if(getSupportActionBar() != null) getSupportActionBar().setDisplayShowTitleEnabled(false); + getExtras(getIntent().getExtras()); - SharedPreferences settings = getSharedPreferences("settings", 0); - home = userId == settings.getLong("userID", -1); - imageload = settings.getBoolean("image_load", true); + home = userId == TwitterEngine.getHomeId(); + ColorPreferences mcolor = ColorPreferences.getInstance(this); + highlight = mcolor.getColor(ColorPreferences.HIGHLIGHTING); + background = mcolor.getColor(ColorPreferences.BACKGROUND); + font_color = mcolor.getColor(ColorPreferences.FONT_COLOR); + imageload = mcolor.loadImage(); homeList = (RecyclerView) findViewById(R.id.ht_list); + homeList.setLayoutManager(new LinearLayoutManager(this)); + homeList.setBackgroundColor(background); favoritList = (RecyclerView)findViewById(R.id.hf_list); - homeList.setLayoutManager(new LinearLayoutManager(getApplicationContext())); - favoritList.setLayoutManager(new LinearLayoutManager(getApplicationContext())); + favoritList.setLayoutManager(new LinearLayoutManager(this)); + favoritList.setBackgroundColor(background); homeReload = (SwipeRefreshLayout) findViewById(R.id.hometweets); favoriteReload = (SwipeRefreshLayout) findViewById(R.id.homefavorits); + TextView txtFollowing = (TextView)findViewById(R.id.following); TextView txtFollower = (TextView)findViewById(R.id.follower); TabHost mTab = (TabHost)findViewById(R.id.profile_tab); @@ -68,8 +76,8 @@ public class UserProfile extends AppCompatActivity implements View.OnClickListen txtFollower.setOnClickListener(this); homeReload.setOnRefreshListener(this); favoriteReload.setOnRefreshListener(this); - - initElements(); + getProfileInformation(); + getProfileTweets(); } @Override @@ -128,10 +136,10 @@ public class UserProfile extends AppCompatActivity implements View.OnClickListen public void onClick(View v) { switch(v.getId()) { case R.id.following: - getFollows(0L); + getConnection(0L); break; case R.id.follower: - getFollows(1L); + getConnection(1L); break; } } @@ -193,63 +201,84 @@ public class UserProfile extends AppCompatActivity implements View.OnClickListen mTab.addTab(tab2); } - /** - * Tab Content - */ - @Override - public void onLoaded() { + + private void getProfileInformation() { new Thread( new Runnable() { - @Override - public void run() { - ColorPreferences mcolor = ColorPreferences.getInstance(getApplicationContext()); - - int highlight = mcolor.getColor(ColorPreferences.HIGHLIGHTING); - int background = mcolor.getColor(ColorPreferences.BACKGROUND); - int font_color = mcolor.getColor(ColorPreferences.FONT_COLOR); - - DatabaseAdapter mTweet = new DatabaseAdapter(getApplicationContext()); - DatabaseAdapter fTweet = new DatabaseAdapter(getApplicationContext()); - List userTweets = mTweet.load(DatabaseAdapter.TWEET,userId); - List userFavorit = fTweet.load(DatabaseAdapter.FAVT,userId); - - mTweets = new ProfileLoader(UserProfile.this); - mFavorits = new ProfileLoader(UserProfile.this); - homeList.setBackgroundColor(background); - favoritList.setBackgroundColor(background); - - if( userTweets.size() > 0 ) { - TimelineRecycler tlRc = new TimelineRecycler(userTweets,UserProfile.this); - tlRc.setColor(highlight,font_color); - tlRc.toggleImage(imageload); - homeList.setAdapter(tlRc); - } else { - mTweets.execute(userId, ProfileLoader.GET_TWEETS,1L); + @Override + public void run() { + DatabaseAdapter database = new DatabaseAdapter(getApplicationContext()); + TwitterUser user = database.getUser(userId); + if(user != null) { + String dateString = "seit "+ DateFormat.getDateTimeInstance().format(user.created); + String followerStr = ""+user.follower; + String followingStr = ""+user.following; + TextView txtUser = (TextView)findViewById(R.id.profile_username); + TextView txtScrName = (TextView)findViewById(R.id.profile_screenname); + TextView txtBio = (TextView)findViewById(R.id.bio); + TextView txtCreated = (TextView)findViewById(R.id.profile_date); + TextView txtFollowing = (TextView)findViewById(R.id.following); + TextView txtFollower = (TextView)findViewById(R.id.follower); + findViewById(R.id.following_icon).setVisibility(View.VISIBLE); + findViewById(R.id.follower_icon).setVisibility(View.VISIBLE); + TextView txtLocation = (TextView)findViewById(R.id.location); + TextView txtLink = (TextView)findViewById(R.id.links); + txtUser.setText(user.username); + txtScrName.setText(user.screenname); + txtBio.setText(user.bio); + txtCreated.setText(dateString); + txtFollower.setText(followerStr); + txtFollowing.setText(followingStr); + if(user.isVerified) + findViewById(R.id.profile_verify).setVisibility(View.VISIBLE); + if(user.isLocked) + findViewById(R.id.profile_locked).setVisibility(View.VISIBLE); + if(user.location != null && !user.location.isEmpty()) { + txtLocation.setText(user.location); + findViewById(R.id.location_img).setVisibility(View.VISIBLE); } - if( userFavorit.size() > 0 ) { - TimelineRecycler tlRc = new TimelineRecycler(userFavorit,UserProfile.this); - tlRc.setColor(highlight,font_color); - tlRc.toggleImage(imageload); - favoritList.setAdapter(tlRc); - } else { - mFavorits.execute(userId, ProfileLoader.GET_FAVS,1L); + if(user.link != null && !user.link.isEmpty()) { + txtLink.setText(user.link); + findViewById(R.id.link_img).setVisibility(View.VISIBLE); } + findViewById(R.id.follower_icon).setVisibility(View.VISIBLE); + findViewById(R.id.following_icon).setVisibility(View.VISIBLE); } - } - ).run(); - } - - /** - * Profile Information - */ - private void initElements() { + }}).run(); + // Refresh mProfile = new ProfileLoader(this); mProfile.execute(userId, ProfileLoader.GET_INFORMATION,1L); } - /** - * @param mode 0L = Following , 1L Follower - */ - private void getFollows(long mode) { + + private void getProfileTweets() { + DatabaseAdapter mTweet = new DatabaseAdapter(getApplicationContext()); + DatabaseAdapter fTweet = new DatabaseAdapter(getApplicationContext()); + List userTweets = mTweet.load(DatabaseAdapter.TWEET,userId); + List userFavorit = fTweet.load(DatabaseAdapter.FAVT,userId); + + mTweets = new ProfileLoader(UserProfile.this); + mFavorits = new ProfileLoader(UserProfile.this); + + if( userTweets.size() > 0 ) { + TimelineRecycler tlRc = new TimelineRecycler(userTweets,UserProfile.this); + tlRc.setColor(highlight,font_color); + tlRc.toggleImage(imageload); + homeList.setAdapter(tlRc); + } else { + mTweets.execute(userId, ProfileLoader.GET_TWEETS,1L); + } + if( userFavorit.size() > 0 ) { + TimelineRecycler tlRc = new TimelineRecycler(userFavorit,UserProfile.this); + tlRc.setColor(highlight,font_color); + tlRc.toggleImage(imageload); + favoritList.setAdapter(tlRc); + } else { + mFavorits.execute(userId, ProfileLoader.GET_FAVS,1L); + } + } + + + private void getConnection(long mode) { Intent intent = new Intent(getApplicationContext(), UserDetail.class); Bundle bundle = new Bundle(); bundle.putLong("userID",userId); @@ -258,7 +287,7 @@ public class UserProfile extends AppCompatActivity implements View.OnClickListen startActivity(intent); } - @SuppressWarnings("ConstantConditions") + private void getExtras(Bundle b) { userId = b.getLong("userID"); username = b.getString("username"); diff --git a/app/src/main/res/layout/profile.xml b/app/src/main/res/layout/profile.xml index 3a1e91d6..d2cf51e3 100644 --- a/app/src/main/res/layout/profile.xml +++ b/app/src/main/res/layout/profile.xml @@ -66,7 +66,7 @@ android:layout_gravity="center_vertical" android:layout_marginEnd="2dp" android:contentDescription="@string/verify" - android:visibility="invisible" + android:visibility="gone" app:srcCompat="@drawable/verify" /> + android:visibility="gone" /> + android:linksClickable="true" + android:singleLine="true" /> diff --git a/app/src/main/res/layout/tweet_detail.xml b/app/src/main/res/layout/tweet_detail.xml index 66b0195d..376c71a0 100644 --- a/app/src/main/res/layout/tweet_detail.xml +++ b/app/src/main/res/layout/tweet_detail.xml @@ -63,26 +63,34 @@ android:layout_height="56dp" android:contentDescription="@string/profile_image" /> - - - + android:layout_height="match_parent" + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + android:singleLine="true" + android:textSize="12sp" /> diff --git a/app/src/main/res/menu/profile.xml b/app/src/main/res/menu/profile.xml index e693bf72..24ff8dde 100644 --- a/app/src/main/res/menu/profile.xml +++ b/app/src/main/res/menu/profile.xml @@ -11,13 +11,12 @@ + android:title="@string/block" + android:visible="false" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2dd9a8ae..64c4eac5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -45,4 +45,6 @@ Ladefaktor Folgt dir Anzahl Tweets + Block + folgen \ No newline at end of file