package com.dozuki.ifixit.util; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.text.Editable; import android.text.Spannable; import android.text.Spanned; import android.text.format.DateUtils; import android.text.style.URLSpan; import android.widget.ImageView; import com.dozuki.ifixit.App; import com.dozuki.ifixit.BuildConfig; import com.dozuki.ifixit.R; import com.dozuki.ifixit.model.dozuki.Site; import com.squareup.okhttp.OkHttpClient; import java.security.GeneralSecurityException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class Utils { public static OkHttpClient createOkHttpClient() { OkHttpClient client = new OkHttpClient(); try { // Working around the libssl crash: https://github.com/square/okhttp/issues/184 SSLContext sslContext; sslContext = SSLContext.getInstance("TLS"); if (BuildConfig.DEBUG || Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) { // Trust all certificates and hosts in debug mode. sslContext.init(null, new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // Do nothing. } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // Do nothing. } @Override public X509Certificate[] getAcceptedIssuers() { return null; } } }, new SecureRandom()); client.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { // Trust all hosts. return true; } }); } else { sslContext.init(null, null, null); } client.setSslSocketFactory(sslContext.getSocketFactory()); } catch (GeneralSecurityException e) { throw new AssertionError(); // The system has no TLS. Just give up. } return client; } public static void stripImageView(ImageView view) { if (view.getDrawable() instanceof BitmapDrawable) { ((BitmapDrawable) view.getDrawable()).getBitmap().recycle(); } safeStripImageView(view); } /** * Trim off whitespace from the beginning and end of a given string. * @param s * @param start * @param end * @return the trimmed string */ public static CharSequence trim(CharSequence s, int start, int end) { while (start < end && Character.isWhitespace(s.charAt(start))) { start++; } while (end > start && Character.isWhitespace(s.charAt(end - 1))) { end--; } return s.subSequence(start, end); } /** * ImageView stripping without the "dangerous" bitmap recycle. * * @param view ImageView to clean memory */ public static void safeStripImageView(ImageView view) { if (view.getDrawable() != null) { view.getDrawable().setCallback(null); } view.setImageDrawable(null); view.getResources().flushLayoutCache(); view.destroyDrawingCache(); } /** * Strips out newlines from Editables */ public static Editable stripNewlines(Editable s) { for (int i = s.length(); i > 0; i--) { if (s.subSequence(i-1, i).toString().equals("\n")) { s.replace(i-1, i, ""); } } return s; } /** * Removes relative link hrefs * * @param spantext (from Html.fromhtml()) * @return spanned with fixed links */ public static Spanned correctLinkPaths(Spanned spantext) { Object[] spans = spantext.getSpans(0, spantext.length(), Object.class); for (Object span : spans) { int start = spantext.getSpanStart(span); int end = spantext.getSpanEnd(span); int flags = spantext.getSpanFlags(span); Site site = App.get().getSite(); if (span instanceof URLSpan) { URLSpan urlSpan = (URLSpan) span; if (!urlSpan.getURL().startsWith("http")) { if (urlSpan.getURL().startsWith("/")) { urlSpan = new URLSpan("http://" + site.mDomain + urlSpan.getURL()); } else { urlSpan = new URLSpan("http://" + site.mDomain + "/" + urlSpan.getURL()); } } ((Spannable) spantext).removeSpan(span); ((Spannable) spantext).setSpan(urlSpan, start, end, flags); } } return spantext; } public static String capitalize(String word) { return Character.toUpperCase(word.charAt(0)) + word.substring(1); } public static String repeat(String string, int times) { StringBuilder builder = new StringBuilder(string); for (int i = 1; i < times; i++) { builder.append(string); } return builder.toString(); } public static CharSequence getRelativeTime(Context context, long timeInMs) { final long MS_IN_MINUTE = 60000; if (System.currentTimeMillis() - timeInMs < MS_IN_MINUTE) { return context.getString(R.string.just_now); } else { return DateUtils.getRelativeTimeSpanString(timeInMs); } } }