Category Archives: Uncategorized

Coaching and Mentoring – Grow Model

Recently I went through a training on Coaching and Mentoring. Since then I never thought them as two different things. So thought of sharing the knowledge i got from it with you all here.

Both are typically 2 things, coaching is more like a guided tour towards the problem’s solution, while mentoring is shedding light and making aware of the problem and making the person figure out the solution to his own problems.

Coaching is more like, the Coach gets some part of the ownership of the process of a task in which he is coaching. For example, in the context of Software engineering, coaching is in which the coach may join in a pair programing session to help solve the problem or provide expert advice on where to look into or suggests an architecture to apply.

In the case of mentoring, the mentor more often does not involve in finding the solution for the problem arisen. He will help you to untangle a problem and to focus on the problem and helps you make your own decisions. For example in the context of software engineering, a mentor will ask a series of questions which will reduce the complexity of the exact problem you need to fix. And also he may refer you to look into similar module areas to find a solution yourself.

In the sense coaching kind of drains the coach’s time, and its not productive compared to the mentor ship. In mentor ship the mentor clears the confusion and gives the basic information on what can help which saves the mentor’s time which he can work on something else and the person who is being mentored will also gets encouraged to solve the problem based on the information provided, more of self learning which is productive.

Encouraging mentor ship over coaching, for knowledge sharing will result in productive towards the new employee and saves time for the mentor, and all results in business profit.

So some of you may be still confused or unclear of what I was talking about above. Mentors use a model called Grow Model for the purpose of mentoring, I’ll explain how we can use it to mentor and you may have a better idea of what is mentor ship afterwards.

Grow Model is basically a set of targets you achieve by asking a series of questions

G – Goal
R – Reality
O – Options
W – When and Where

Goal is where you figure out what exactly your problem is and whats your exact focus is on for example “Keeping the Meeting stick to the Agenda”

Reality is the module where you identify the facts that may make the Goal complex, but as long as you know what they are, its not recommended you spend much time on this section.
For example “Albert always comes late to the meeting and he always finds a way to deviate the meeting from the agenda”

Park is an unofficial element in the GROW Model which I would like to mention here, where you put things that are making your main goal complex in. May be in future you can take them and define a GROW model for each of them later.

Options is the module where you come up with the options on how to achieve your goals and select one of them to be executed. For example “People who come late to the meetings are not allowed to join in, whenever the topic deviates, stop and bring it back to the point instantly”

Where and When is where you decide where and when the selected option will be executed and usually ends up with a follow up with the mentor on what happened.

So this GROW model does not has to be used only with mentoring, in the above scenario it is just another day to day meeting which I have applied. So feel free to try out this model and let me know how it worked.

Advertisements

RoundedImageView – Android

round-white-label-l

This is a library which consist of a RoundedImageView. This is a hassle free light weight ImageView that you can use for user profiles and other needs.

This can be integrated in your Android Studio project using this Gradle integration

compile 'com.pathofacoder.roundedimageview:roundedimageview:0.1.0'

Library can be found here – https://bintray.com/batzee/maven/RoundedImageView/view

This project is made Open Source under the Apache 2.0 license, so you can help improve the library by contributing here
https://github.com/Batzee/Android-RoundedImageView

A small sample will be added soon…

Pocket Signature View for Android

Android Signature View

This is a library which consist of a Signature View. This can be used as a Signature Pad
Main intention to develop this view is to avoid using bitmaps to use device memory efficiently.

Features
-The drawn image can be out put as SVG(Vector Image), which is very much small in size. -Also the drawing data can be saved as String and that String can again be loaded in to this view.

This can be integrated inside your Android Studio using the Gradle

compile 'com.batzeesappstudio.pocketsignatureview:pocketsignatureview:0.1.6'

Library can be found here – https://bintray.com/batzee/maven/android-signature-view/view

This project is made Open Source under the Apache 2.0 license, so you can help improve the library by contributing here
https://github.com/Batzee/Android-Signature-View

A small sample will be added soon…

New Permission Model in Android

Hi Folks, today we will be seeing the new permission model in action and how to handle it. You know that we define the system permissions that we need to run the app like Camera and “READ_EXTERNAL_STORAGE” and “WRITE_EXTERNAL_STORAGE” permissions in the manifest file. But this is not enough for the from the API level 23 , Android 6.0, the new model is introduced that is getting the permission from the user on the run time.

So we will see how we can do it. For this I am using the latest Build Tools 23.0.2
And the Compiled SDK Version is API 23

Always make sure you are using the latest build tools as Google always improve the backward compatibility through it.

Ok the the first thing you have to understand is, we will be checking this permission availability exactly before the place where we access the permission related operation. Adding this code will have no special effect on the phones that are running versions less than Android 6.0

And we have to add the regular permission as usual in the Manifest too. Else again the app will crash.

We will be doing a sample on getting a screen shot and saving it to the SD Card so here we need the “WRITE_EXTERNAL_STORAGE” permission

Step 1
At the place where we have to invoke the screenshot function we check if the permission is already available. If the permission is already available we proceed with the taking screen shot, else we call another methods which will invoke the  new permission request procedure.

if(PackageManager.PERMISSION_GRANTED== ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
    shareScreenShot();
}else{
    requestWritePermission(MainActivity.this);
}

Step 2
the method requestWritePermission(context) will check if the permission is already requested and if already requested and rejected it shows another Custom Dialog which explains why the permission is needed and when the Allow button is click it shows the Permission request again. Meanwhile if this is the first time the request permission procedure will automatically fired.
While we invoke the ‘ActivityCompat.requestPermissions’ method we pass a request code, in our case it is “REQUEST_WRITE_EXTERNAL_STORAGE” so that we can track back the result on the onRequestPermissionResult() override method and respond to it appropriately.

private static void requestWritePermission(final Context context){
    if(ActivityCompat.shouldShowRequestPermissionRationale((Activity)context,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        new AlertDialog.Builder(context)
                .setMessage("This app needs permission to write data to the phone so that the Screenshot can be saved")
                .setPositiveButton("Allow", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE_EXTERNAL_STORAGE);
                    }
                }).show();

    }else {
        ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE);
    }
}

Step 3
In the onRequestPermissionResult() we catch the reult from the permission dialog and decide whether to go for the screenshot procedure or not

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {

        case REQUEST_WRITE_EXTERNAL_STORAGE: {
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                shareScreenShot();
            } else {
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
            return;
        }
    }
}

So here is the order in it work, these are taken from one of my other app, and its done for reading from the SD card
step1    Step 2   Step 3

So that’s it guys hope you guys understood and will implement in your own application
Sample app can be found at the GitHub gitHub-download-button

You can get more info from the official documentation here :  http://developer.android.com/training/permissions/requesting.html

Lets Write Code for MyO Armband – Android

Myo Armband is kind of a Wearable technology which senses the electrical signals produced when the muscles move. It got EMG Sensor, Gyroscopes and Accelerometer(Check here for Exact Spec 11137159_10204486542423879_2960066497525238836_n

So today we will see how to write code to get data and do stuff accordingly from the MyO Armband from the electrical signals that it can sense.

When the MyO Band is launched first, there was no instructions on how to setup the environment for the Android Studio. So there is a sample for Eclipse in Git Hub you guys can try it
gitHub-download-button

But today we are going to create and run an app that responds to all your gestures in Android Studio

Ok then will jump into the Tutorial

Step 1
First of all you have to Download the MyO SDK from the site and Extract the zip file and place it somewhere so that later you can add the path of it. You may have to register yourself before you can download it.
(You can download the SDK here)

Step 2
Create a new Project in the Android Studio, at the time of this tutorial my Compile SDK Version is API 23 Android 6.0 (Marshmallows), Build Tool version is 23.0.2, Minimum target SDK is 18. Ill be using a Galaxy s3 for testing. When it comes to Android Marshmallows you have to handle the new permission system. I’ll be explaining it in another Blog.

Step 3
Go to the build.gradle(Module:app) and add these code snippet to the dependencies

repositories {
    maven {
        url 'C:\\Users\\adh\\Desktop\\myo-android-sdk-0.10.0\\myo-android-sdk-0.10.0\\myorepository'
    }
}
compile 'com.thalmic:myosdk:0.10.+@aar'

Be careful when adding the maven url, it has to be the path to the MyO SDK, which you have downloaded earlier. And the path should go upto the level of the folder “myorepository”. In my case it was in the Desktop.

The compile line will get the library from the path provided above and sync it. The reason is unlike many other libraries the MYO is not hosted anywhere to automatically Android Studio to find it. So this is kind of a work around to build a MYO app in Android Studio.

Step 4
Next thing is in the SDK you have downloaded go to the
Eclipse –> MyoSdk–>libs and copy all the folders in it.
Capture
Be careful not to copy the “myosdk.jar”

Then go to the file location of your Android Studio Project
In the app–>src–>main create a folder called “jniLibs” and paste the folders you have copied earlier from the MYO SDK folder

Now your Project structure will look like this
Capture2

Step 5
Ok now we have done the important stuffs and the workaround to some errors we may have faced(Actually I faced those errors and found out these workarounds, all happened due to no support for the Android studio from the MYO guys )

So we go to our main activity and first we have to create a instance of Hub and initiate it. Hub is the main guy who will be listening to the signals from the Band.

So we create and initialize it in the onCreate() method

Hub hub = Hub.getInstance();
if (!hub.init(this)) {
    Log.e(TAG, "Could not initialize the Hub.");
    finish();
    return;
}

Step 6
Now we have initialized the Hub, now we have to find available MyO bands and connect to it. For that we start an activity called ScanActivity, which comes with the MyO SDK.

Intent intent = new Intent(context, ScanActivity.class);
context.startActivity(intent);

All the hard work is done by the library, you will just have to select the device shown by this activity to connect your app with

Step 7
Ok now we come to a place where we have to set something called lock policy, as this is a Gadget which will be always moving here and there we have to enable one of the 2 policies available(You can create your own policy and apply them but for now we will see the 2 default ones)
One is LockingPolicy.NONE –  this one will remove any lock policies that are available, for this example I am using this for easy to understand
and the other one is  LockingPolicy.STANDARD – This policy is a general one that is used by most of the developers, which lock the device when it detects that it is not being used, so that when you want to use it again, you have to do the unlock gesture to unlock it.

So we have to apply a Locking Policy to out app too
So the next code snippet to add will be

Hub.getInstance().setLockingPolicy(Hub.LockingPolicy.NONE);

Remember all the code I am adding are in the onCreate() mthod. And I am only showing the snippets here. In the Full Code sample you will find them nicely organized in to methods.

Step 8
The last code snippet in the onCreate is not important, but I thought its important to mention it. The MYO guys are actually getting some usage data through their API, but we can manually stop it by adding this code line

if (Hub.getInstance().isSendingUsageData()) {
    Hub.getInstance().setSendUsageData(false);
}

I am checking if the usage data is being sent and if it returns true I am stoping it by passing the parameter ‘false’ to the method setSendUsageData()

Step 9
Now we have to create a method to create a listener and to respond based on the signals that we receive and Add it to the Hub

private void createAndAddListner() {

    mListener = new AbstractDeviceListener() {
        @Override
        public void onConnect(Myo myo, long timestamp) {
            Toast.makeText(context, "Myo Connected!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onDisconnect(Myo myo, long timestamp) {
            Toast.makeText(context, "Myo Disconnected!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPose(Myo myo, long timestamp, Pose pose) {
            switch (pose) {
                case REST:
                    Toast.makeText(context, "REST", Toast.LENGTH_SHORT).show();
                    break;
                case FIST:
                    Toast.makeText(context, "FIST", Toast.LENGTH_SHORT).show();
                    break;
                case WAVE_IN:
                    Toast.makeText(context, "WAVE_IN", Toast.LENGTH_SHORT).show();
                    break;
                case WAVE_OUT:
                    Toast.makeText(context, "WAVE_OUT", Toast.LENGTH_SHORT).show();
                    break;
                case FINGERS_SPREAD:
                    Toast.makeText(context, "FINGERS_SPREAD", Toast.LENGTH_SHORT).show();
                    break;
                case DOUBLE_TAP:
                    Toast.makeText(context, "DOUBLE_TAP", Toast.LENGTH_SHORT).show();
                    break;
                case UNKNOWN:
                    Toast.makeText(context, "UNKNOWN", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    Hub.getInstance().addListener(mListener);
}

Here the mListner is an instance of DeviceListener Class. And you can see 3 override methods it has, onConnect, onDisconnect and the onPose

If the device is connected properly onPose is the one that gets triggered when you try to do gestures  using the MyO Arm band. I have added different Toast Messages for each of the Actions. If the action does not match any of the predefined 6 Actions it will be fall under the Action “Unknown”

Step 10
So now that we have created the function to create the mListner and attach it to the Hub now we have to call it in the onResume()

protected void onResume() {
    super.onResume();
    createAndAddListner();
}

and must not forget to detach the listener when we go out of the app so on oPause function we remove the listener

protected void onPause() {
    super.onPause();
    Hub.getInstance().removeListener(mListener);
}

So that’s it folks now you can write your own code to do stuff for each of the MYO Arm Band’s gestures detected.

Have Fun Folks
😀

For clear and clean code of this project visit the GitHub
gitHub-download-button

Exploring Flic Button

What is a Flic?
Flic is a wireless hardware button. Works using Bluetooth, paired with your phone. It is not rechargeable but the battery is replaceable. Can be stuck on wall or pinned in dresses, for easy access depends on your need. It can broadcast 3 functions to your phone for 3 actions, Single Click, Double Click and Press and Hold.

IMG_20160212_093850

It already has an app called flic, which got some basic day to day usable functions already defined. It is more than enough for your daily usage. But it got an API which we can use to invoke our own app or services that is running in the phone. This will enable us to develop a mobile solution which can be triggered using this button or create a service which can gather resources using the available sensors in the phone and send it to server. So we can consider this under Concept of IOT.

Ok so we will try to write something so we invoke our own functionality using the Flic Button.

Step 1
First of all this API does not work alone it needs you to install their android app and connect your Flic buttons using it. Before you start to concentrate on the API. You can download the app here

Step 2
Now you have to visit GitHub and download the Flic Library project. You can simply download it as a zip file and unzip it.  you can visit the site here

Step 3
Open the Android studio and create a new project that supports Minimum API level 19(Android 4.4), then go to File –> New –> Import Module and select the ‘fliclib-android’ from the git hub library project you have downloaded. Now you have added the library to the project structure.

Step 4
Now you have to add reference to the added library by going to  File -> Project -> Structure -> app (in the left sidebar) -> Dependencies tab -> The + button in the rightmost section -> Module dependency -> fliclib  and selecting ‘OK’

Step 5

on your main activity on the onCreate you have to set up the app credentials

FlicManager.setAppCredentials("[appId]", "[appSecret]", "[appName]");

You can get the credentials by registering your app at the Flic here

Step 6
Now after setting the App Credentials you have to grab a button from the main flic button app using this code snippet

try {
    FlicManager.getInstance(this, new FlicManagerInitializedCallback() {
        @Override
        public void onInitialized(FlicManager manager) {
            manager.initiateGrabButton(MainActivity.this);
        }
    });
} catch (FlicAppNotInstalledException err) {
    Toast.makeText(this, "Flic App is not installed", Toast.LENGTH_SHORT).show();
}

So when you have selected the button on the onActivityResult call back you will get the results, and if the grab is success, you can registerBroadcast for specific functions, based on that the Broadcast receiver we are gona write in a moment, will trigger events. In this case we are subscribing the Broadcast Receiver for UP_OR_DOWN operation and REMOVED events only

@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    FlicManager.getInstance(this, new FlicManagerInitializedCallback() {
        @Override
        public void onInitialized(FlicManager manager) {
            FlicButton button = manager.completeGrabButton(requestCode, resultCode, data);
            if (button != null) {
                button.registerListenForBroadcast(FlicBroadcastReceiverFlags.UP_OR_DOWN | FlicBroadcastReceiverFlags.REMOVED);
                Toast.makeText(MainActivity.this, "Grabbed a button", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Did not grab any button", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

So now we have configured the setting up we, have to write a BroadCastReceiver to get the calls from the button and trigger events

Step 7

Create a class called ‘BroadCastReceiverFlic’ that extends ‘FlicBroadcastReceiver’, which comes from the API project we added.
In that class in the Override method ‘onRequestAppCredentials’ you have to again setup the flic credential that you did at the main activity onCreate function.

Then as we have already registered for the UP_OR_DOWN and REMOVED broadcasts we can override these functions

@Override
public void onButtonRemoved(Context context, FlicButton button) {
    // Button was removed
}

and

@Override
public void onButtonUpOrDown(Context context, FlicButton button, boolean wasQueued, int timeDiff, boolean isUp, boolean isDown) {
    super.onButtonUpOrDown(context, button, wasQueued, timeDiff, isUp, isDown);
    if (isUp) {
        Log.d("IS UP", "True");
    } else {
        Log.d("IS DOWN", "True");
    }
}

In the final method you can trigger events based on if the button is up or down(In my case I am Logging different messages). If you have subscribed for the Broadcast service “CLICK_OR_DOUBLE_CLICK_OR_HOLD” you could override the function ‘onButtonSingleOrDoubleClickOrHold()’

Any way for the sample code I’ll do the coding for ‘”CLICK_OR_DOUBLE_CLICK_OR_HOLD”‘ broadcast

So thats it folks you guys can get the full code here
gitHub-download-button

Will Write our Own App to Trigger Mi Band

10371404_10206191040355262_3352352559338119016_n
Xiaomi Mi Band is the world’s cheapest and branded fitness tracker. So why don’t we do some experiments so that we can make the Mi Band do what we say for a change?

I’ll be doing this code session for Android using Android Studio, hope others can understand the basics

Step 1
Firs of all we start a new empty project. And add 4 buttons. This is to test 4 basic functions of the Mi Band. Then initialize the buttons and ready the the setOnclick listners.

Step 2
Add Bluetooth Permissions in the Manifestfile, else you wont be able to connect to the band 😀

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /

Step 3
Add the Xiaomi Mi Band dependencyto the gradle and sync it

compile 'com.zhaoxiaodan.miband:miband-sdk:1.1.2'

Step 4

In the oncreate you have to create and initialize an instance of the MiBand Class

private MiBand miband;
miband = new MiBand(this);

Step 5

I have not done the pairing part in the code, but I assume the Mi band of yours is already paired to the device. If you have paired more than one device you can populate all the paired devices and allow the user to select one. But for the demonstration purpose I have only paired with my Mi Band so it is the one and only device returns to me

Object[] devices = BluetoothAdapter.getDefaultAdapter().getBondedDevices().toArray();
final BluetoothDevice device = (BluetoothDevice) devices[0];

So I am getting my paired device from the available devices, as I only got my Mi band paired I get the 0th device. hope you people got that part 😀

Step 6
No you have to connect to the paired device

miband.connect(device, new ActionCallback() {
    @Override
    public void onSuccess(Object data) {
        pd.dismiss();
        Log.d(TAG, "Success !!!");
        miband.setDisconnectedListener(new NotifyListener() {
            @Override
            public void onNotify(byte[] data) {
                Log.d(TAG, "Disconnected!!!");
            }
        });
    }
    @Override
    public void onFail(int errorCode, String msg) {
        pd.dismiss();
        Log.d(TAG, "connect fail, code:" + errorCode + ",mgs:" + msg);
    }
});

Step 7

So if you have successfully connected to the device. You can start invoking functions of the MiBand in the button clicks
For example : You can make it Vibrate using this code snippet

miband.startVibration(VibrationMode.VIBRATION_WITH_LED);

You can check out some more commands in the sample code available in Git HubgitHub-download-button