diff --git a/app/build.gradle b/app/build.gradle index e31af1e4..c48b09e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId 'org.nuclearfog.twidda' minSdkVersion 16 targetSdkVersion 31 - versionCode 53 - versionName '2.0' + versionCode 54 + versionName '2.0.1' // limiting language support for smaller APK size resConfigs 'en', 'de-rDE', 'zh-rCN' vectorDrawables.useSupportLibrary true diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/PicassoBuilder.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/PicassoBuilder.java index f18f71ba..2a2089bc 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/PicassoBuilder.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/PicassoBuilder.java @@ -66,8 +66,8 @@ public class PicassoBuilder implements GlobalSettings.SettingsListener { TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); factory.init((KeyStore) null); X509TrustManager manager = (X509TrustManager) factory.getTrustManagers()[0]; - builder.sslSocketFactory(new TLSSocketFactory(), manager); - downloader = new OkHttp3Downloader(builder.build()); + TLSSocketFactory socket = new TLSSocketFactory(); + builder.sslSocketFactory(socket, manager); } catch (Exception e) { // ignore, try without TLS 1.2 support } 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 61e742e1..da394a0c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java @@ -26,6 +26,8 @@ import org.nuclearfog.twidda.model.User; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * SQLite database class to store and load tweets, messages, trends and user information @@ -136,15 +138,10 @@ public class AppDatabase { + " AND " + UserRegisterTable.NAME + "." + UserRegisterTable.REGISTER + "&" + EXCL_USR + " IS 0" + " ORDER BY " + TweetTable.ID + " DESC LIMIT ?"; + /** + * SQL query to get current user's messages + */ static final String MESSAGE_QUERY = "SELECT * FROM " + MessageTable.NAME - + " LEFT JOIN " + UserTable.NAME + " " + UserTable.ALIAS_1 - + " ON " + UserTable.ALIAS_1 + "." + UserTable.ID + "=" + MessageTable.NAME + "." + MessageTable.FROM - + " LEFT JOIN " + UserTable.NAME + " " + UserTable.ALIAS_2 - + " ON " + UserTable.ALIAS_2 + "." + UserTable.ID + "=" + MessageTable.NAME + "." + MessageTable.TO - + " LEFT JOIN " + UserRegisterTable.NAME + " " + UserRegisterTable.ALIAS_1 - + " ON " + UserRegisterTable.ALIAS_1 + "." + UserRegisterTable.ID + "=" + MessageTable.NAME + "." + MessageTable.FROM - + " LEFT JOIN " + UserRegisterTable.NAME + " " + UserRegisterTable.ALIAS_2 - + " ON " + UserRegisterTable.ALIAS_2 + "." + UserRegisterTable.ID + "=" + MessageTable.NAME + "." + MessageTable.TO + " WHERE " + MessageTable.FROM + "=? OR " + MessageTable.TO + "=?" + " ORDER BY " + MessageTable.SINCE + " DESC LIMIT ?"; @@ -593,13 +590,33 @@ public class AppDatabase { * @return list of direct messages */ public Directmessages getMessages() { - String[] args = {Long.toString(homeId), Long.toString(homeId), Integer.toString(limit)}; + String homeIdStr = Long.toString(homeId); + String[] args = {homeIdStr, homeIdStr, Integer.toString(limit)}; Directmessages result = new Directmessages(null, null); SQLiteDatabase db = getDbRead(); + Map userCache = new TreeMap<>(); Cursor cursor = db.rawQuery(MESSAGE_QUERY, args); if (cursor.moveToFirst()) { do { - result.add(new DirectMessageImpl(cursor, homeId)); + User sender, receiver; + DirectMessageImpl message = new DirectMessageImpl(cursor); + if (userCache.containsKey(message.getSenderId())) { + sender = userCache.get(message.getSenderId()); + } else { + sender = getUser(message.getSenderId()); + userCache.put(message.getSenderId(), sender); + } + if (userCache.containsKey(message.getReceiverId())) { + receiver = userCache.get(message.getReceiverId()); + } else { + receiver = getUser(message.getReceiverId()); + userCache.put(message.getReceiverId(), receiver); + } + if (sender != null && receiver != null) { + message.setSender(sender); + message.setReceiver(receiver); + result.add(message); + } } while (cursor.moveToNext()); } cursor.close(); @@ -852,7 +869,7 @@ public class AppDatabase { */ private void storeMessage(DirectMessage message, SQLiteDatabase db) { // store message information - ContentValues messageColumn = new ContentValues(5); + ContentValues messageColumn = new ContentValues(6); messageColumn.put(MessageTable.ID, message.getId()); messageColumn.put(MessageTable.SINCE, message.getTimestamp()); messageColumn.put(MessageTable.FROM, message.getSender().getId()); diff --git a/app/src/main/java/org/nuclearfog/twidda/database/DirectMessageImpl.java b/app/src/main/java/org/nuclearfog/twidda/database/DirectMessageImpl.java index 269136ce..c5bc2147 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/DirectMessageImpl.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/DirectMessageImpl.java @@ -7,7 +7,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.nuclearfog.twidda.database.DatabaseAdapter.MessageTable; -import org.nuclearfog.twidda.database.DatabaseAdapter.UserTable; import org.nuclearfog.twidda.model.DirectMessage; import org.nuclearfog.twidda.model.User; @@ -20,19 +19,21 @@ class DirectMessageImpl implements DirectMessage { private long id; private long time; + private long senderId; + private long receiverId; private String text; private User sender; private User receiver; private String media; - DirectMessageImpl(Cursor cursor, long currentId) { + DirectMessageImpl(Cursor cursor) { text = cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.MESSAGE)); time = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.SINCE)); id = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.ID)); + senderId = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.FROM)); + receiverId = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.TO)); media = cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.MEDIA)); - sender = new UserImpl(cursor, UserTable.ALIAS_1 + ".", currentId); - receiver = new UserImpl(cursor, UserTable.ALIAS_2 + ".", currentId); } @Override @@ -80,4 +81,24 @@ class DirectMessageImpl implements DirectMessage { public String toString() { return "from:" + sender + " to:" + receiver + " message:" + text; } + + + void setSender(User sender) { + this.sender = sender; + } + + + void setReceiver(User receiver) { + this.receiver = receiver; + } + + + long getSenderId() { + return senderId; + } + + + long getReceiverId() { + return receiverId; + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/database/UserImpl.java b/app/src/main/java/org/nuclearfog/twidda/database/UserImpl.java index b21f66f5..d8c83d7a 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/UserImpl.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/UserImpl.java @@ -42,25 +42,20 @@ class UserImpl implements User { UserImpl(Cursor cursor, long currentUserId) { - this(cursor, "", currentUserId); - } - - - UserImpl(Cursor cursor, String prefix, long currentUserId) { - id = cursor.getLong(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.ID)); - username = cursor.getString(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.USERNAME)); - screenName = cursor.getString(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.SCREENNAME)); - profileImg = cursor.getString(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.IMAGE)); - bio = cursor.getString(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.DESCRIPTION)); - link = cursor.getString(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.LINK)); - location = cursor.getString(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.LOCATION)); - bannerImg = cursor.getString(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.BANNER)); - created = cursor.getLong(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.SINCE)); - following = cursor.getInt(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.FRIENDS)); - follower = cursor.getInt(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.FOLLOWER)); - tweetCount = cursor.getInt(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.TWEETS)); - favorCount = cursor.getInt(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserTable.FAVORS)); - int register = cursor.getInt(cursor.getColumnIndexOrThrow(prefix + DatabaseAdapter.UserRegisterTable.REGISTER)); + id = cursor.getLong(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.ID)); + username = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.USERNAME)); + screenName = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.SCREENNAME)); + profileImg = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.IMAGE)); + bio = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.DESCRIPTION)); + link = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.LINK)); + location = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.LOCATION)); + bannerImg = cursor.getString(cursor.getColumnIndexOrThrow( DatabaseAdapter.UserTable.BANNER)); + created = cursor.getLong(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.SINCE)); + following = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.FRIENDS)); + follower = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.FOLLOWER)); + tweetCount = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.TWEETS)); + favorCount = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserTable.FAVORS)); + int register = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseAdapter.UserRegisterTable.REGISTER)); isVerified = (register & VER_MASK) != 0; isLocked = (register & LCK_MASK) != 0; followReqSent = (register & FRQ_MASK) != 0;