Android

Create Circle ImageView with Picasso

Here is how to create circle ImageView and load the image with picasso library.
First of all you need to create transformation subclass to create circle shape following below.

     /**
     * Enables hardware accelerated rounded corners.
     * original idea here : http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/
     */
    public class RoundedTransformation implements com.squareup.picasso.Transformation {
        private final int radius;
        private final int margin;  // dp

        // radius is corner radii in dp
        // margin is the board in dp
        public RoundedTransformation(final int radius, final int margin) {
            this.radius = radius;
            this.margin = margin;
        }

        @Override
        public Bitmap transform(final Bitmap source) {
            final Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));

            Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
            canvas.drawRoundRect(new RectF(margin, margin, source.getWidth() - margin, source.getHeight() - margin), radius, radius, paint);

            if (source != output) {
                source.recycle();
            }

            return output;
        }

        @Override
        public String key() {
            return "rounded";
        }
    }

After that, what you need to do just load your image with transformation class above.

Picasso.with(yourContext)
       .load("...") // Your image source.
       .transform(new RoundedTransformation(50, 4))
       .fit()  // Fix centerCrop issue: http://stackoverflow.com/a/20824141/1936697
       .centerCrop()
       .into(yourImageView);

 

Publish GreenRobot EventBus from Service to Activity/Fragment

I assume that you already know GreenRobot EventBus, and here is how to publish data from android service to your Activity/Fragment.

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        MyData data = new MyData();
        data.setMessage("Hello...");
        EventBus.getDefault().post(data);
    }
});

reference: http://stackoverflow.com/a/33249376/1936697

Hide Samsung Tablet Soft Keyboard Programatically

Android keyboard usually will show up when there are focus in input widget like EditText. In mobile device we can avoid soft keyboard show up when at first fragment/activity start by defining this code on the input widget xml.

android:focusableInTouchMode="true"

But this method will not work in samsung tablet, in my case Samsung Galaxy Tab.
So we have to hide it programatically to hide samsung soft keyboard. We just need to add this single line on your fragment/activity initialization.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Reference: http://stackoverflow.com/a/10699765/1936697

Adding SSL Certificate to Retrofit 2

I assume that you already know how to get SSL certificate from your server and you already put it in android resource inside “raw” directory.

SS

SSL Certificate File

Here is how to read in in android and add to your retrofit.

private static SSLContext getSSLConfig(Context context) throws CertificateException, IOException,
            KeyStoreException, NoSuchAlgorithmException, KeyManagementException {

    // Loading CAs from an InputStream
    CertificateFactory cf = null;
    cf = CertificateFactory.getInstance("X.509");

    Certificate ca;
    // I'm using Java7. If you used Java6 close it manually with finally.
    try (InputStream cert = context.getResources().openRawResource(R.raw.your_certificate)) {
        ca = cf.generateCertificate(cert);
    }

    // Creating a KeyStore containing our trusted CAs
    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore   = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);

    // Creating a TrustManager that trusts the CAs in our KeyStore.
    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);

    // Creating an SSLSocketFactory that uses our TrustManager
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, tmf.getTrustManagers(), null);

    return sslContext;
}

By default Retrofit using OkHttp as the http client library, and here is the last step.

Retrofit.Builder builder = new Retrofit.Builder().baseUrl(Constant.BASE_API_URL);

OkHttpClient okHttp = new OkHttpClient();
okHttp.setSslSocketFactory(getSSLConfig(contex).getSocketFactory());

Retrofit retrofit = builder.client(okHttp).build();
retrofit.create(serviceClass)

References:
http://developer.android.com/training/articles/security-ssl.html
http://stackoverflow.com/a/31436459/1936697

Basic Reactive Programming with RxJava

Just found interesting blog post series about reactive programming with RxJava.

http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/
http://blog.danlew.net/2014/09/30/grokking-rxjava-part-3/
http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/

Thanks to Daniel Lew 😀