diff --git a/app/build.gradle b/app/build.gradle index 0bde93cc..2fb7f0fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,9 +22,10 @@ android { buildTypes { release { debuggable false + multiDexEnabled false minifyEnabled true shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + proguardFiles 'proguard-rules.pro' } debug { minifyEnabled false @@ -46,12 +47,12 @@ proguardDictionaries { } dependencies { - implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.appcompat:appcompat:1.4.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.recyclerview:recyclerview:1.2.1' - implementation 'androidx.constraintlayout:constraintlayout:2.1.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.2' implementation 'androidx.cardview:cardview:1.0.0' implementation 'org.twitter4j:twitter4j-core:4.0.7' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index ca36a823..aa0f6685 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,28 +1,4 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ~/Android/Sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in show.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile +-repackageclasses org.nuclearfog.twidda # keep these libraries but allow obfuscating -dontwarn twitter4j.** @@ -42,8 +18,6 @@ -adaptclassstrings org.conscrypt.OpenSSLProvider -dontwarn javax.annotation.Nullable --keep,allowobfuscation class javax.annotation.Nullable {*;} --adaptclassstrings javax.annotation.Nullable # use dictionaries to create random class/package names -obfuscationdictionary dict/obfuscation-dictionary.txt diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java b/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java index 3f9d0dfa..b7f6c309 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java @@ -206,8 +206,9 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O muteConfirm = new ConfirmDialog(this, DialogType.PROFILE_MUTE, this); Intent i = getIntent(); - user = (User) i.getSerializableExtra(KEY_PROFILE_DATA); - if (user != null) { + Object o = i.getSerializableExtra(KEY_PROFILE_DATA); + if (o instanceof User) { + user = (User) o; adapter.setupProfilePage(user.getId()); } else { long userId = i.getLongExtra(KEY_PROFILE_ID, 0); @@ -644,6 +645,7 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O Picasso.get().load(bannerLink).error(R.drawable.no_banner).into(bannerImage, this); } else { bannerImage.setImageResource(0); + toolbarBackground.setImageResource(0); } if (user.hasProfileImage()) { String imgLink = user.getImageLink(); diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/model/Tweet.java b/app/src/main/java/org/nuclearfog/twidda/backend/model/Tweet.java index c873335d..5782001e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/model/Tweet.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/model/Tweet.java @@ -1,5 +1,7 @@ package org.nuclearfog.twidda.backend.model; +import android.os.Build; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -50,7 +52,7 @@ public class Tweet implements Serializable { private boolean favorited; private boolean sensitiveMedia; - private String[] medias = {}; + private String[] mediaLinks = {}; private String userMentions = ""; private String locationName = ""; private String locationCoordinates = ""; @@ -143,7 +145,7 @@ public class Tweet implements Serializable { this.time = time; this.replyID = replyID; this.embedded = embedded; - this.medias = medias; + this.mediaLinks = medias; this.mediaType = mediaType; this.retweeted = retweeted; this.favorited = favored; @@ -267,7 +269,7 @@ public class Tweet implements Serializable { * @return medias links array */ public String[] getMediaLinks() { - return medias; + return mediaLinks; } /** @@ -429,15 +431,23 @@ public class Tweet implements Serializable { * @param mediaEntities media information */ private void getMedia(MediaEntity[] mediaEntities) { - medias = new String[mediaEntities.length]; - if (medias.length == 0) { + mediaLinks = new String[mediaEntities.length]; + if (mediaLinks.length == 0) { mediaType = MediaType.NONE; } else { switch (mediaEntities[0].getType()) { case PHOTO: mediaType = MediaType.IMAGE; - for (int i = 0; i < mediaEntities.length; i++) { - medias[i] = mediaEntities[i].getMediaURLHttps(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + // since twitter dropped TLS 1.1 support, + // https links will not work on pre lollipop devices anymore + for (int i = 0; i < mediaEntities.length; i++) { + mediaLinks[i] = mediaEntities[i].getMediaURL(); + } + } else { + for (int i = 0; i < mediaEntities.length; i++) { + mediaLinks[i] = mediaEntities[i].getMediaURLHttps(); + } } break; @@ -447,14 +457,24 @@ public class Tweet implements Serializable { if (type.getContentType().equals(MEDIA_VIDEO)) { // get link with selected video format // a tweet can only have one video - medias[0] = type.getUrl(); + mediaLinks[0] = type.getUrl(); + // switching to http since twitter dropped TLS 1.1 support, pre lollipop + // devices don't support https + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && + mediaLinks[0].startsWith("https://")) { + mediaLinks[0] = "http://" + mediaLinks[0].substring(8); + } } } break; case ANGIF: mediaType = MediaType.GIF; - medias[0] = mediaEntities[0].getVideoVariants()[0].getUrl(); + mediaLinks[0] = mediaEntities[0].getVideoVariants()[0].getUrl(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && + mediaLinks[0].startsWith("https://")) { + mediaLinks[0] = "http://" + mediaLinks[0].substring(8); + } break; default: diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/model/User.java b/app/src/main/java/org/nuclearfog/twidda/backend/model/User.java index b468f4b5..112098c8 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/model/User.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/model/User.java @@ -1,5 +1,7 @@ package org.nuclearfog.twidda.backend.model; +import android.os.Build; + import androidx.annotation.NonNull; import java.io.Serializable; @@ -58,14 +60,27 @@ public class User implements Serializable { this.username = user.getName(); if (user.getScreenName() != null) this.screenName = '@' + user.getScreenName(); - if (user.getOriginalProfileImageURLHttps() != null) - this.profileImg = user.getOriginalProfileImageURLHttps(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + // since twitter dropped TLS 1.1 support, + // https links will not work on pre lollipop devices anymore + if (user.getOriginalProfileImageURL() != null) { + this.profileImg = user.getOriginalProfileImageURL(); + } + if (bannerLink != null && bannerLink.length() > 12 && bannerLink.startsWith("https://")) { + bannerImg = "http://" + bannerLink.substring(8, bannerLink.length() - 4); + } + } else { + if (user.getOriginalProfileImageURLHttps() != null) { + this.profileImg = user.getOriginalProfileImageURLHttps(); + } + if (bannerLink != null && bannerLink.length() > 4) { + bannerImg = bannerLink.substring(0, bannerLink.length() - 4); + } + } if (user.getURLEntity().getExpandedURL() != null) this.link = user.getURLEntity().getExpandedURL(); if (user.getLocation() != null) this.location = user.getLocation(); - if (bannerLink != null && bannerLink.length() > 4) - bannerImg = bannerLink.substring(0, bannerLink.length() - 4); if (bio != null && !bio.isEmpty()) { URLEntity[] entities = user.getDescriptionURLEntities(); StringBuilder builder = new StringBuilder(user.getDescription()); diff --git a/app/src/main/res/layout/item_image.xml b/app/src/main/res/layout/item_image.xml index b336e7d4..46a2aaa3 100644 --- a/app/src/main/res/layout/item_image.xml +++ b/app/src/main/res/layout/item_image.xml @@ -7,7 +7,7 @@ diff --git a/app/src/main/res/layout/page_media.xml b/app/src/main/res/layout/page_media.xml index 3e404bf9..d54bf427 100644 --- a/app/src/main/res/layout/page_media.xml +++ b/app/src/main/res/layout/page_media.xml @@ -18,7 +18,7 @@ app:layout_constraintEnd_toEndOf="parent" app:enable_move="true" app:max_zoom_in="10.0" - app:max_zoom_out="0.7" /> + app:max_zoom_out="0.5" /> 12sp 18sp 12sp - 6 + 5 48dp diff --git a/gradle.properties b/gradle.properties index 2c6ed659..c1e7a465 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,9 +10,9 @@ # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -#Fri Mar 12 11:41:58 CET 2021 +#Fri Dec 03 17:30:19 CET 2021 +org.gradle.configureondemand=false; +org.gradle.jvmargs=-Xmx1536M -Dkotlin.daemon.jvm.options\="-Xmx1536M" android.enableJetifier=true android.useAndroidX=true -android.enableR8.fullMode=true -org.gradle.configureondemand=false; -org.gradle.jvmargs=-Xmx1024M -Dkotlin.daemon.jvm.options\="-Xmx1024M" \ No newline at end of file +android.enableR8.fullMode=true \ No newline at end of file