diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java index 85cb4a9c..efd323ef 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java @@ -3,6 +3,7 @@ package gr.thmmy.mthmmy.activities.main; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.widget.Toast; @@ -11,6 +12,7 @@ import com.google.android.material.tabs.TabLayout; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.AppCompatDelegate; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; @@ -54,6 +56,13 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF private ViewPager viewPager; private TabLayout tabLayout; + //Fix for vector drawables on android <21 + static { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java index 86b2e367..74dda5ee 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java @@ -118,7 +118,7 @@ public abstract class BaseActivity extends AppCompatActivity { loadSavedBookmarks(); } - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); BaseViewModel baseViewModel = ViewModelProviders.of(this).get(BaseViewModel.class); baseViewModel.getCurrentPageBookmark().observe(this, thisPageBookmark -> setTopicBookmark(thisPageBookmarkMenuButton)); @@ -128,7 +128,7 @@ public abstract class BaseActivity extends AppCompatActivity { protected void onResume() { super.onResume(); updateDrawer(); - if(!sharedPreferences.getBoolean(getString(R.string.user_consent_shared_preference_key),false)) + if (!sharedPreferences.getBoolean(getString(R.string.user_consent_shared_preference_key), false)) showUserConsentDialog(); } @@ -646,7 +646,7 @@ public abstract class BaseActivity extends AppCompatActivity { FirebaseMessaging.getInstance().unsubscribeFromTopic(bookmark.getId()); return topicsBookmarked.get(bookmark.findIndex(topicsBookmarked)).isNotificationsEnabled(); - } else if (bookmark.matchExists(boardsBookmarked)) { + } else if (bookmark.matchExists(boardsBookmarked)) { boardsBookmarked.get(bookmark.findIndex(boardsBookmarked)).toggleNotificationsEnabled(); updateBoardBookmarks(); @@ -760,7 +760,7 @@ public abstract class BaseActivity extends AppCompatActivity { } //----------------------------PRIVACY POLICY------------------ - private void showUserConsentDialog(){ + private void showUserConsentDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); builder.setTitle("User Agreement"); builder.setMessage(R.string.user_agreement_dialog_text); @@ -788,7 +788,7 @@ public abstract class BaseActivity extends AppCompatActivity { protected void showPrivacyPolicyDialog() { TextView privacyPolicyTextView = new TextView(this); - privacyPolicyTextView.setPadding(30,20,30,20); + privacyPolicyTextView.setPadding(30, 20, 30, 20); privacyPolicyTextView.setTextColor(ContextCompat.getColor(this, R.color.primary_text)); SpannableConfiguration configuration = SpannableConfiguration.builder(this).linkResolver(new LinkResolverDef()).build(); StringBuilder stringBuilder = new StringBuilder(); @@ -812,7 +812,7 @@ public abstract class BaseActivity extends AppCompatActivity { Timber.e(e, "Error in Privacy Policy dialog."); } finally { try { - if(reader!=null) + if (reader != null) reader.close(); } catch (IOException e) { Timber.e(e, "Error in Privacy Policy dialog (closing reader)."); @@ -820,12 +820,12 @@ public abstract class BaseActivity extends AppCompatActivity { } } - private void addUserConsent(){ + private void addUserConsent() { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean(getString(R.string.user_consent_shared_preference_key), true).apply(); } - private void setUserDataShareEnabled(boolean enabled){ + private void setUserDataShareEnabled(boolean enabled) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean(getString(R.string.pref_privacy_crashlytics_enable_key), enabled).apply(); editor.putBoolean(getString(R.string.pref_privacy_analytics_enable_key), enabled).apply(); @@ -836,7 +836,7 @@ public abstract class BaseActivity extends AppCompatActivity { this.mainActivity = mainActivity; } - private void startLoginActivity(){ + private void startLoginActivity() { Intent intent = new Intent(BaseActivity.this, LoginActivity.class); startActivity(intent); overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java index 7f0caa7e..42e907b8 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.util.DisplayMetrics; import android.widget.ImageView; @@ -25,6 +26,9 @@ import com.squareup.picasso.Picasso; import net.gotev.uploadservice.UploadService; import net.gotev.uploadservice.okhttp.OkHttpStack; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -35,6 +39,8 @@ import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.CrashReportingTree; import io.fabric.sdk.android.Fabric; +import okhttp3.CipherSuite; +import okhttp3.ConnectionSpec; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -82,14 +88,14 @@ public class BaseApplication extends Application { firebaseAnalytics = FirebaseAnalytics.getInstance(this); boolean enableAnalytics = settingsSharedPrefs.getBoolean(getString(R.string.pref_privacy_analytics_enable_key), false); firebaseAnalytics.setAnalyticsCollectionEnabled(enableAnalytics); - if(enableAnalytics) + if (enableAnalytics) Timber.i("Starting app with Analytics enabled."); else Timber.i("Starting app with Analytics disabled."); SharedPrefsCookiePersistor sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(getApplicationContext()); PersistentCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), sharedPrefsCookiePersistor); - client = new OkHttpClient.Builder() + OkHttpClient.Builder builder = new OkHttpClient.Builder() .cookieJar(cookieJar) .addInterceptor(chain -> { Request request = chain.request(); @@ -103,9 +109,25 @@ public class BaseApplication extends Application { } return chain.proceed(request); }) - .callTimeout(30, TimeUnit.SECONDS) - .build(); - sessionManager = new SessionManager(client, cookieJar, sharedPrefsCookiePersistor, sharedPrefs,draftsPrefs); + .callTimeout(30, TimeUnit.SECONDS); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // Just for KitKats + // Necessary because our servers don't have the right cipher suites. + // https://github.com/square/okhttp/issues/4053 + List cipherSuites = new ArrayList<>(ConnectionSpec.MODERN_TLS.cipherSuites()); + cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA); + cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA); + + ConnectionSpec legacyTls = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) + .cipherSuites(cipherSuites.toArray(new CipherSuite[0])) + .build(); + + builder.connectionSpecs(Arrays.asList(legacyTls, ConnectionSpec.CLEARTEXT)); + } + + client = builder.build(); + + sessionManager = new SessionManager(client, cookieJar, sharedPrefsCookiePersistor, sharedPrefs, draftsPrefs); Picasso picasso = new Picasso.Builder(getApplicationContext()) .downloader(new OkHttp3Downloader(client)) .build(); @@ -170,13 +192,13 @@ public class BaseApplication extends Application { public void setFirebaseAnalyticsCollection(boolean enabled) { firebaseAnalytics.setAnalyticsCollectionEnabled(enabled); - if(!enabled) + if (!enabled) firebaseAnalytics.resetAnalyticsData(); } // Set up Crashlytics, disabled for debug builds public void startFirebaseCrashlyticsCollection() { - if(!Fabric.isInitialized()){ + if (!Fabric.isInitialized()) { Crashlytics crashlyticsKit = new Crashlytics.Builder() .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) .build(); @@ -184,8 +206,7 @@ public class BaseApplication extends Application { Fabric.with(this, crashlyticsKit); Timber.plant(new CrashReportingTree()); Timber.i("Crashlytics enabled."); - } - else + } else Timber.i("Crashlytics were already initialized for this app session."); } }