Flutter BottomAppBar widget

Want to learn about how to implement bottom navigation in Flutter app that can run on Android and iOS seamless ? Checkout my article here.

Designing UX of EdOnGo WebApp

In this post I’ll be describing my experience designing EdOnGo web app.

Week #1: Defining Mission

Motivation

As a parent to young children myself, I needed a way to cultivate learning from everyday things all around us waiting to be explored ! I wished if there were a way I could make my own flashcards to review with my kids anywhere on the go; and EdOnGo web app was born !

Scheduling Repeating Local Notifications using Alarm Manager

Learn about Scheduling Repeating Local Notifications using Alarm Manager in this post.

Adding Menu Items in Navigation Drawer Dynamically

Checkout my post about Adding Menu Items in Navigation Drawer Dynamically here.

How did I integrated a launcher screen in an Android App under 5 minutes

Checkout my latest blog post about Android App Launcher Screen here.

Starting and Stopping Jenkins on Mac OS X

Stopping Jenkins on Mac OSX:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

Starting Jenkins on Mac OS X:
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist 

Why Butterknife doesn't work for Android Libraries

Have you tried using Butterknife library to bind Android's xml views for an Android library ? And ran into dreaded this error message:
Attribute must be constant

You're not alone ! Many people like myself tried using wonderful Butterknife in their Android Libraries like they do in their regular phone and tablet projects. Actually, Butterknife is not intended to be used for Android libraries project because R class in library project is not final. 

Here's the explanation from Jake himself:
Values on the R class are not final in library modules which makes this library unusable on those modules. This is a limitation of Java, and something this library has decided not to work around. See #2.
[UPDATE]
Recent version of Butterknife library (8.5.1)  supports library projects as well.  Checkout out this link to configure library projects to start using Butterknife in your library projects as well.

How did I publish Android Library to JCenter from Android Studio

JCenter is a Maven Repository or file server hosted by Bintray for Android libraries. It’s a default repository for Android Studio. I wrote this post to log my experience with open sourcing an Android Library on JCenter.

Checkout my detailed post on Medium or at my techLog.

WebViewOverlay Widget Android Library

I needed a widget that can load a url in WebView in a full-screen closable overlay/modal. I wanted to re-use this new, shiny widget in my other projects as well. So, I decided to upload WebViewOverlay library in a central artifact repository. I chose JCenter because its one of the largest artifact repository for Java and Android libraries and has good integration with Android Studio IDE. 

Checkout my detailed Medium post or at my techLog.

WebViewHelper Library in Android

Recently, I've fiddling around a long lived Widget in Android "WebViews". I created a open source library WebView Helper to help with automatic URL validations and connivence methods to enable and disable JavaScript in a WebView. Don't forget to checkout out this post.

Source code is available on Github here.

RecyclerView sample code examples

If you're looking for sample code to get started with RecyclerView in Android, then this post is for you !

Here's link to my github repo to demonstrate Linear and Grid Layout using RecyclerView. 

Convert Canvas into Bitmap and Saving image in Gallery

Have you ever thought of drawing something on Canvas and sharing it with others ? If yes, then this post is for you :)

So, you know that you can draw your stuff on a Canvas view. If you want to share your work with others, you may want to save it as an image. This post shows how to convert a Canvas view into a bitmap. First "Play" menu-item will show a programmatically drawn text on canvas view. "Save" icon will save it in gallery as well as in external SD card.

Details:

First create Custom View called MyCanvas class:
package com.teach.mycanvasapp;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class MyCanvas extends View {
    public MyCanvas(Context context) {
        super(context);
        // TODO Auto-generated constructor stub    }

    @Override    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub        super.onDraw(canvas);
        Paint pBackground = new Paint();
        pBackground.setColor(Color.WHITE);
        canvas.drawRect(0, 0, 512, 512, pBackground);
        Paint pText = new Paint();
        pText.setColor(Color.BLACK);
        pText.setTextSize(20);
        canvas.drawText("This is a sample canvas image", 100, 100, pText);
    }
}

Second, reference MyCanvas from MainActivity class to show it inside ImageView. I've two menu-items, one is for showing the bitmap and another is to take save action :

package com.teach.mycanvasapp;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity {

    ImageView imageView = null;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.show_canvas) {
            View v = new MyCanvas(getApplicationContext());
            Bitmap bitmap = Bitmap.createBitmap(500/*width*/, 500/*height*/, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            v.draw(canvas);
            imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
            return true;
        } else if (id == R.id.save_canvas) {
            saveImageToGallery();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void saveImageToGallery() {
        Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();

        //Writing image to SD card.        //It could also be saved to internal storage.        // That way, we don't need to have extra permissions        File dir = new File("/sdcard/tempfolder/");

        try {
            if (!dir.exists()) {
                dir.mkdirs();
            }

            File output = new File(dir, "tempfile.jpg");
            if (!output.exists())
                output.createNewFile();

            OutputStream os = null;
            os = new FileOutputStream(output);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
            os.flush();
            os.close();

            //Scans image and save it in gallery            MediaScannerConnection.scanFile(this, new String[] { output.toString() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                            Log.d("Test", "Image saved in gallery!");
                        }
                    }
            );
        } catch (Exception e) {
            Log.d("Test", "Exception: " + e.getMessage());
        }
    }
}

Here's link to the github repo: https://github.com/ptyagi911/MyCanvasApp

Safe Installing from Web on Mac OSX


  • Step 1: You should have md5 tool setup to verify installer/file downloaded from web.
    • brew install md5sha1sum


  • Step 2: Check downloaded file like this:
    • md5sum <path-to-file-to-be-verified>

Android Studio: Files to keep in version control

Here's list of files that should be kept under version control like Git:

  • compiler.xml
  • encodings.xml
  • modules.xml
  • *.ipr : Contains project related data.
File to be included in gitignore OR not to be kept under version control:
  • workspace.xml
  • *.iws : Contains user specific data.

Scheduling Repeating Local Notifications using Alarm Manager

Learn about Scheduling Repeating Local Notifications using Alarm Manager in this post .