Last Updated: July 28, 2015

Android InstrumentationTestCase for Network call Demo.

Description: In this post I'm gonna show you how we can create a testcase for our network calls using android InstrumentationTestCase I'm gonna use CoutDownLatch simply becausein most of our app we make network call on background thread. CountDownLatch gives as option to run call single threaded.

So lets get started. :-)



Step 1: Create a class NetworkCallTest extends InstrumentationTestCase within your 'app/src/androidTest/java/<package_name>


Step2: Create any method within the class prefixed as test e.g: testNetworkCall. For serial exceution you can have name as test1,test2,test3 and so on.

Note: test case are event driven if methods are not prefixed with test its not gonna execute.
public void testNetworkCall(){}


Step3: Lets create  a dummy network call for demo using aquery and countdown latch.
public class NetworkCallTest extends InstrumentationTestCase {

    @Override
    public void setUp() throws Exception {
        super.setUp();
    }

    public void testNetworkCall(){
        CountDownLatch countDownLatch = new CountDownLatch(1);
        new Thread(new NetworkRunnable(countDownLatch)).start();
    }

    private class NetworkRunnable implements Runnable {

        private CountDownLatch countDownLatch;

        public NetworkRunnable(CountDownLatch countDownLatch) {
            this.countDownLatch = countDownLatch;
        }

        @Override
        public void run() {

            AQuery aQuery = new AQuery(getInstrumentation().getContext());
            aQuery.ajax( "http://jsonplaceholder.typicode.com/posts" , JSONArray.class , new AjaxCallback<JSONArray>(){
                @Override
                public void callback(String url, JSONArray jsonArray, AjaxStatus status) {

                    assertNotNull("response array  is null", jsonArray);

                    for (int i = 0; i < jsonArray.length(); i++) {

                        JSONObject object = jsonArray.optJSONObject(i);

                        assertNotNull("jsonObject is null", object);

                        String userId = object.optString("userId");
                        assertTrue("User Id is empty" , !TextUtils.isEmpty(userId));

                        String id = object.optString("id");
                        assertTrue("Id is empty" , !TextUtils.isEmpty(id));

                        String title = object.optString("title");
                        assertTrue("title is empty" , !TextUtils.isEmpty(title));

                        String body = object.optString("body");
                        assertTrue("body is empty" , !TextUtils.isEmpty(body));
                    }

                    countDownLatch.countDown();


                }
            });
        }
    }
}




Step4:Run the test case . Click to know HOW TO RUN TESTCASES ?.









Android How to run Instrumentation testCases ?

Description: In this post I'm gonna show you how we can run the test case in android.I have posted snapshot of each step and how we can filter the testcase based on class -methods respectively.

So lets get started.




Step 1: Open Edit Configuration from Run menu of android studio.












Step 2: Create new Configuration by clicking icon + and select new Android Tests.



Step 3: Select module.You can also select different testType like class,package,method or module.






Step 4: Apply n save.Now you have saved the configuration.You testcase configuration is ready!!!

Note: You can now also right the particular testcase and run it direclty after configuration.


Last Updated: June 14, 2015

SeekBar Swipe Control

Description:

In this post I'm gonna show you How you can control your seekbar( horizontal + vertical ) using the android GestureDetector.In this technique you can move your seekbar progress on screen's swipe up,down,left right movement using simple callbacks.






So let's get stared :





Step1: Add a Gesture Detector to calculate the screen's swipe(left,right,top,down).

private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 10;
        private static final int SWIPE_VELOCITY_THRESHOLD = 10;

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            boolean result = float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(distanceX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            iSwipeRefresh.rightSwipe();
                            return true;
                        } else {
                            iSwipeRefresh.leftSwipe();
                            return true;

                        }
                    }
                } else {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(distanceY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {

                            iSwipeRefresh.downSwipe();
                            return true;
                        } else {
                            iSwipeRefresh.upSwipe();
                            return true;
                        }
                    }
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }


        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return true;
        }
    }
Step 2: Create a interface to receive the callback.

public interface ISwipeRefresh {

    void leftSwipe();

    void rightSwipe();

    void upSwipe();

    void downSwipe();
}
Step 3: Add the above Gesture detector in a class implementing onTouchListener.

public class OnScrollTouchListenerControl implements View.OnTouchListener {

    private static final String TAG = OnScrollTouchListenerControl.class.getName();
    private final GestureDetector gestureDetector;
    private ISwipeRefresh iSwipeRefresh;

    public OnScrollTouchListenerControl(Context ctx, ISwipeRefresh iSwipeRefresh) {
        this.iSwipeRefresh = iSwipeRefresh;
        gestureDetector = new GestureDetector(ctx, new GestureListener());
    }

    public boolean onTouch(final View view, final MotionEvent motionEvent) {
        return gestureDetector.onTouchEvent(motionEvent);
    }
 }




Step:4 Finally lets integrate with this Seekbar.


public class MainActivity extends Activity implements ISwipeRefresh ,SeekBar.OnSeekBarChangeListener {

    private final static String TAG = MainActivity.class.getName();
    private SeekBar horizontalSeekB;
    private int MIN_PROGRESS = 10;

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

        init();
    }

    private void init() {

        findViewById(R.id.mainContainer).setOnTouchListener(new OnScrollTouchListenerControl(this, this));
        horizontalSeekB     = (SeekBar)findViewById(R.id.horizontalSeekBar);
        horizontalSeekB.setMax(100);
        horizontalSeekB.setOnSeekBarChangeListener(this);
    }

    @Override
    public void leftSwipe() {
        horizontalSeekB.setProgress(horizontalSeekB.getProgress() - MIN_PROGRESS);
    }

    @Override
    public void rightSwipe() {
        horizontalSeekB.setProgress(horizontalSeekB.getProgress() + MIN_PROGRESS);
    }

    @Override
    public void upSwipe() {
        //verticalSeekbarB.setProgress(verticalSeekbarB.getProgress() - MIN_PROGRESS);
    }

    @Override
    public void downSwipe() {
        //verticalSeekbarB.setProgress(verticalSeekbarB.getProgress() + MIN_PROGRESS);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {}

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {}
}


GITHUB Project HERE

Bingo we're DONE!!!


Last Updated: May 26, 2015

Lollipop SwipeRefreshLayout with loader


Description: In this post I'm gonna show you how to use Lollipop's SwipeRefreshLayout using loader in android.It demostrate use of swipe refresh with loader's restartloader() method.

Github project for the same here


Step 1: Add the dependency in build.gradle
dependencies {
    compile 'com.android.support:appcompat-v7:21.0.2' // or your updated version
}
Step 2: Create Layout to use swipeRefreshLayout.It can be wrap over Scrollview or ListView.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/video_listView"
        android:layout_width="match_parent"
        android:smoothScrollbar="true"
        android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>


Step 3:Finally lets wrap everthing in code.

Note: Here loader is used  to fetch the videos names from phone and a swipeRefreshLayout functionality is added to update the content.

public class MainActivity extends FragmentActivity implements  LoaderManager.LoaderCallbacks<Cursor>  ,SwipeRefreshLayout.OnRefreshListener {

    private static final int LOADER_ID = 100;
    private ListView videoList;
    private SwipeRefreshLayout swipeContainer;
    private Context context;
    private SwipeAdapter swipeListAdapter;
    private String TAG = MainActivity.class.getName();

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

        context         = MainActivity.this;
        videoList       = (ListView) findViewById(R.id.video_listView);
        swipeContainer  = (SwipeRefreshLayout) findViewById(R.id.swipe_container);


        swipeContainer.setColorSchemeResources(
                R.color.swiperedcolor,
                R.color.swipegreencolor,
                R.color.swipeyellowcolor,
                R.color.swipebluecolor);


        swipeListAdapter = new SwipeAdapter(context , null  , 0);
        videoList.setAdapter(swipeListAdapter);


        swipeContainer.setOnRefreshListener(this);

        getSupportLoaderManager().initLoader(LOADER_ID, null, this);

    }


    @Override
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
        Log.d(TAG , "||onCreateLoader called||");
        return new CursorLoader(context ,MediaStore.Video.Media.EXTERNAL_CONTENT_URI ,null , null , null , MediaStore.Video.Media.TITLE + " collate nocase ");
    }


    @Override
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
        if (swipeListAdapter != null && cursorLoader != null){

            Log.d(TAG , "||onLoadFinished called||");

            swipeListAdapter.swapCursor(cursor);

            swipeContainer.post(new Runnable() {
                @Override
                public void run() {
                    swipeContainer.setRefreshing(false);
                }
            });
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> cursorLoader) {
        if (swipeListAdapter != null) {
            Log.d(TAG , "||onLoaderReset called||");
            swipeListAdapter.swapCursor(null);
        }
    }


    /**
     * Whenever swipe refresh starts we get callback here.Here we can place our logic.
     */
    @Override
    public void onRefresh() {
        Log.d(TAG , "||onRefresh called||");
        getSupportLoaderManager().restartLoader(LOADER_ID , null ,this);
    }



    private class SwipeAdapter extends CursorAdapter{


        private VideoViewHolder videoViewHolder;

        public SwipeAdapter(Context context, Cursor c, int flags) {
            super(context, c, flags);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {

            videoViewHolder = new VideoViewHolder();
            View convertView = LayoutInflater.from(context).inflate(R.layout.row_swipe_refresh , parent , false);
            videoViewHolder.videoTitleTextView = (TextView) convertView.findViewById(R.id.titleTv);

            convertView.setTag(videoViewHolder);

            return convertView;
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            videoViewHolder = (VideoViewHolder) view.getTag();
            videoViewHolder.videoTitleTextView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)));

        }
    }


    private class VideoViewHolder {
        private TextView videoTitleTextView;
    }
}


Result:(Displays the names of videos in phone using loader)



Last Updated: March 08, 2015

Android Seekbar Scrubber

Description:

In this article I'm gonna show you scrubber seek bar demo with drawable in android.
It include a layer-list with background and progress properties of seek bar.Thats it!!!

Scrubber Seek bar

Lets get started!!!

Step 1:Create a drawable scrubber_layer_list.xml

 <?xml version="1.0" encoding="utf-8"?>  
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">  
   <item android:id="@android:id/background">  
     <shape android:shape="rectangle">  
       <size android:height="5dp"/>  
       <solid android:color="#ffc6c8cc"/>  
       <stroke android:color="#000000" android:width="1dp"/>  
     </shape>  
     </item>  
   <item android:id="@android:id/progress">  
     <clip>  
       <shape android:shape="rectangle">  
         <size android:height="5dp"/>  
         <solid android:color="#ff7092cc"/>  
         <stroke android:color="#000000" android:width="1dp"/>  
       </shape>  
     </clip>  
   </item>  
 </layer-list>  

The above drawable is used to create the background and progress of seek bar using layer-list..



Step 2: Create a simple layout(activity_main) containing seekbar and textView.

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   xmlns:tools="http://schemas.android.com/tools"  
   android:layout_width="match_parent"  
   android:layout_height="match_parent"  
   android:paddingLeft="@dimen/activity_horizontal_margin"  
   android:paddingRight="@dimen/activity_horizontal_margin"  
   android:paddingTop="@dimen/activity_vertical_margin"  
   android:paddingBottom="@dimen/activity_vertical_margin"  
   tools:context=".MainActivity">  
   <SeekBar  
     android:max="100"  
     android:progress="0"  
     android:thumb="@null"  
     android:progressDrawable="@drawable/scrubber_layer_list"  
     android:layout_centerInParent="true"  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:id="@+id/seekBar"/>  
   <TextView  
     android:id="@+id/scrubber_update_tv"  
     android:layout_below="@id/seekBar"  
     android:layout_centerInParent="true"  
     android:layout_marginTop="10dp"  
     android:textStyle="bold"  
     android:textSize="16sp"  
     android:text="0%"  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content" />  
 </RelativeLayout>  



Step 3: Finally add listener to witness the seek percentage.


 public class MainActivity extends ActionBarActivity {  
   private TextView scrubberTv;  
   private SeekBar seekBar;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     scrubberTv = (TextView) findViewById(R.id.scrubber_update_tv);  
     seekBar = (SeekBar) findViewById(R.id.seekBar);  
     seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {  
       @Override  
       public void onProgr --Cha!-- (SeekBar seekBar, int i, boolean b) {  
         scrubberTv.setText("" + i +  --);  
       }  
       @Override  
       public void onStartTrackingTouch(SeekBar seekBar) {  
       }  
       @Override  
       public void onStopTrackingTouch(!-- Bar seekBar) {  
       }  
     });  
   }  
 }  

Output:






                                     




Last Updated: February 24, 2015

Android Sqlite Trigger Demo


Description:

Triggers are some structured code that are executed  automatically when certain events occurred in our database. Events can be like INSERT, DELETE, UPDATE.

Example: Consider a database of any University. So if any Student record is added in student table , new row(tuple) is added automatically in  library section or canteen section etc.

So by writting a simple trigger we can automatically insert new records in other sections avoiding boiler plate code.




Schema:
 CREATE TABLE student (sid INTEGER PRIMARY KEY, sname TEXT)  
 CREATE TABLE canteen (cid , sid )  
 CREATE TABLE library (lid INTEGER PRIMARY KEY, sid TEXT)  

Trigger to automatically add records in library and canteen table:
 CREATE TRIGGER if not exists add_student   
   AFTER INSERT  
 ON[student]  
   for each row  
     BEGIN  
        insert into library values (2 , new.sid );  
        insert into canteen values (3 , new.sid);  
     END;  

Explanation:The concept here is to create a trigger ,which insert the values in canteen and library based on new student id.

Trigger to delete records from library and canteen table:
 CREATE TRIGGER if not exists delete_student   
   AFTER DELETE   
 ON[student]  
  for each row  
    BEGIN  
        delete from library where sid = old.sid;  
        delete from library where sid = old.sid;  
    END;  

Explanation:The concept here is to  delete a record from student which thereby delete the values from library and canteen with old id of student.



CODE:
 public class MainActivity extends ActionBarActivity {  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     DatabaseHelper databaseHelper = new DatabaseHelper(this , DatabaseHelper.DB_NAME , null , DatabaseHelper.version);  
     databaseHelper.insertIntoStudent("100" , "Lionel Messi");  
     //Similarly if we delete any record the trigger get fired:e.g  
     //databaseHelper.deleteFromStudent("100");  
   }  
   public class DatabaseHelper extends SQLiteOpenHelper {  
     static final public String DB_NAME = "trigger_demo";  
     static final public int version =1;  
     public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {  
       super(context, name, null, version);  
     }  
     @Override  
     public void onCreate(SQLiteDatabase sqLiteDatabase) {  
       sqLiteDatabase.execSQL("CREATE TABLE student (sid INTEGER PRIMARY KEY, sname TEXT)");  
       sqLiteDatabase.execSQL("CREATE TABLE canteen (cid INTEGER PRIMARY KEY, sid TEXT)");  
       sqLiteDatabase.execSQL("CREATE TABLE library (lid INTEGER PRIMARY KEY, sid TEXT)");  
       sqLiteDatabase.execSQL(insertRecordTrigger()); // create trigger  
       sqLiteDatabase.execSQL(deleteRecordTrigger()); // delete trigger  
     }  
     @Override  
     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {  
       sqLiteDatabase.execSQL("DROP table student");  
       sqLiteDatabase.execSQL("DROP table student");  
       sqLiteDatabase.execSQL("DROP table student");  
       sqLiteDatabase.execSQL("DROP trigger add_student"); // Drop trigger  
       sqLiteDatabase.execSQL("DROP trigger delete_student"); // Drop trigger  
       onCreate(sqLiteDatabase);  
     }  
     public String deleteRecordTrigger(){  
       String deleteRecord = "CREATE TRIGGER if not exists delete_student " +  
           " AFTER DELETE " +  
           " ON[student] " +  
           " for each row " +  
           " BEGIN " +  
           "  delete from library where sid = old.sid; " +  
           "  delete from library where sid = old.sid; " +  
           " END; ";  
       return deleteRecord;  
     }  
     public String insertRecordTrigger(){  
       String insertRecord = "CREATE TRIGGER if not exists add_student "  
           + " AFTER INSERT "  
           + " ON[student] "  
           + " for each row "  
           + " BEGIN "  
           + " insert into library values (2 , new.sid );"  
           + " insert into canteen values (3 , new.sid);"  
           + " END;";  
       return insertRecord;  
     }  
     /**  
      * Insert new student record into student table which eventually fire trigger and insert record into canteen and library  
      */  
     public void insertIntoStudent(String sid , String sname){  
       ContentValues insertValues = new ContentValues();  
       insertValues.put("sid", sid);  
       insertValues.put("sname", sname);  
       SQLiteDatabase db = getWritableDatabase();  
       db.insert("student", null, insertValues);  
     }  
     /**  
      * Delete student record from student table which eventually fire trigger and delete record from canteen and library  
      */  
     public void deleteFromStudent(String sid){  
       SQLiteDatabase db = getWritableDatabase();  
       db.execSQL("delete from student where sid = '"+sid+"'");  
     }  
   }  
 }  



Output:



Last Updated: February 13, 2015

Android:How to find on which thread code is exceuting?

Description:
As we normally say it code is running in “background thread or UI thread”.

Question: How to find on which thread the code is executing?
This article helps to find on which thread the code is executing in Android.

Example:
public static boolean isFromMainThread(){
        return Looper.getMainLooper().getThread().getId() == Thread.currentThread().getId();
  }




Example with thread:
As we say that thread exceute in seperate thread here is the proof:

Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    if (isFromMainThread()) {
                        Log.d("Fetch", " Runnable Executing From Main Thread");
                    } else {
                        Log.d("Fetch", " Runnable Executing From Background Thread");
                    }
                }
            });

thread.start();

Last Updated: February 08, 2015

Blur behind Alert Dialog

Update:

We can also use renderscript apis to blur the background for api level >= 17. Please find below github project

Github Blur Behind Dialog


Description:

As we know from API 14 the below technique to Blur the screen has been deprecated.
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

Below is the technique to help to blur background of the alert Dialog. 

So Let's get started





Step1: Take the Snapshot of Your Background using Below Code 

    public static Bitmap takeScreenShot(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();


        Bitmap b1 = view.getDrawingCache();
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;

        Display display = activity.getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width = size.x;
        int height = size.y;

        Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
        view.destroyDrawingCache();
        return b;
    }  

Step2: Call the method  Bitmap fast = fastblur(map, 10); Got it From Here

   public Bitmap fastblur(Bitmap sentBitmap, int radius) {  
     Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);  
     if (radius < 1) {  
       return (null);  
     }  
     int w = bitmap.getWidth();  
     int h = bitmap.getHeight();  
     int[] pix = new int[w * h];  
     Log.e("pix", w + " " + h + " " + pix.length);  
     bitmap.getPixels(pix, 0, w, 0, 0, w, h);  
     int wm = w - 1;  
     int hm = h - 1;  
     int wh = w * h;  
     int div = radius + radius + 1;  
     int r[] = new int[wh];  
     int g[] = new int[wh];  
     int b[] = new int[wh];  
     int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;  
     int vmin[] = new int[Math.max(w, h)];  
     int divsum = (div + 1) >> 1;  
     divsum *= divsum;  
     int dv[] = new int[256 * divsum];  
     for (i = 0; i < 256 * divsum; i++) {  
       dv[i] = (i / divsum);  
     }  
     yw = yi = 0;  
     int[][] stack = new int[div][3];  
     int stackpointer;  
     int stackstart;  
     int[] sir;  
     int rbs;  
     int r1 = radius + 1;  
     int routsum, goutsum, boutsum;  
     int rinsum, ginsum, binsum;  
     for (y = 0; y < h; y++) {  
       rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;  
       for (i = -radius; i <= radius; i++) {  
         p = pix[yi + Math.min(wm, Math.max(i, 0))];  
         sir = stack[i + radius];  
         sir[0] = (p & 0xff0000) >> 16;  
       sir[1] = (p & 0x00ff00) >> 8;  
     sir[2] = (p & 0x0000ff);  
     rbs = r1 - Math.abs(i);  
     rsum += sir[0] * rbs;  
     gsum += sir[1] * rbs;  
     bsum += sir[2] * rbs;  
     if (i > 0) {  
       rinsum += sir[0];  
       ginsum += sir[1];  
       binsum += sir[2];  
     } else {  
       routsum += sir[0];  
       goutsum += sir[1];  
       boutsum += sir[2];  
     }  
       }  
       stackpointer = radius;  
       for (x = 0; x < w; x++) {  
         r[yi] = dv[rsum];  
         g[yi] = dv[gsum];  
         b[yi] = dv[bsum];  
         rsum -= routsum;  
         gsum -= goutsum;  
         bsum -= boutsum;  
         stackstart = stackpointer - radius + div;  
         sir = stack[stackstart % div];  
         routsum -= sir[0];  
         goutsum -= sir[1];  
         boutsum -= sir[2];  
         if (y == 0) {  
           vmin[x] = Math.min(x + radius + 1, wm);  
         }  
         p = pix[yw + vmin[x]];  
         sir[0] = (p & 0xff0000) >> 16;  
       sir[1] = (p & 0x00ff00) >> 8;  
       sir[2] = (p & 0x0000ff);  
       rinsum += sir[0];  
       ginsum += sir[1];  
       binsum += sir[2];  
       rsum += rinsum;  
       gsum += ginsum;  
       bsum += binsum;  
       stackpointer = (stackpointer + 1) % div;  
       sir = stack[(stackpointer) % div];  
       routsum += sir[0];  
       goutsum += sir[1];  
       boutsum += sir[2];  
       rinsum -= sir[0];  
       ginsum -= sir[1];  
       binsum -= sir[2];  
       yi++;  
       }  
       yw += w;  
     }  
     for (x = 0; x < w; x++) {  
       rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;  
       yp = -radius * w;  
       for (i = -radius; i <= radius; i++) {  
         yi = Math.max(0, yp) + x;  
         sir = stack[i + radius];  
         sir[0] = r[yi];  
         sir[1] = g[yi];  
         sir[2] = b[yi];  
         rbs = r1 - Math.abs(i);  
         rsum += r[yi] * rbs;  
         gsum += g[yi] * rbs;  
         bsum += b[yi] * rbs;  
         if (i > 0) {  
           rinsum += sir[0];  
           ginsum += sir[1];  
           binsum += sir[2];  
         } else {  
           routsum += sir[0];  
           goutsum += sir[1];  
           boutsum += sir[2];  
         }  
         if (i < hm) {  
           yp += w;  
         }  
       }  
       yi = x;  
       stackpointer = radius;  
       for (y = 0; y < h; y++) {  
         // Preserve alpha channel: ( 0xff000000 & pix[yi] )  
         pix[yi] = ( 0xff000000 & pix[yi] ) | ( dv[rsum] << 16 ) | ( dv[gsum] << 8 ) | dv[bsum];  
         rsum -= routsum;  
         gsum -= goutsum;  
         bsum -= boutsum;  
         stackstart = stackpointer - radius + div;  
         sir = stack[stackstart % div];  
         routsum -= sir[0];  
         goutsum -= sir[1];  
         boutsum -= sir[2];  
         if (x == 0) {  
           vmin[y] = Math.min(y + r1, hm) * w;  
         }  
         p = x + vmin[y];  
         sir[0] = r[p];  
         sir[1] = g[p];  
         sir[2] = b[p];  
         rinsum += sir[0];  
         ginsum += sir[1];  
         binsum += sir[2];  
         rsum += rinsum;  
         gsum += ginsum;  
         bsum += binsum;  
         stackpointer = (stackpointer + 1) % div;  
         sir = stack[stackpointer];  
         routsum += sir[0];  
         goutsum += sir[1];  
         boutsum += sir[2];  
         rinsum -= sir[0];  
         ginsum -= sir[1];  
         binsum -= sir[2];  
         yi += w;  
       }  
     }  
     Log.e("pix", w + " " + h + " " + pix.length);  
     bitmap.setPixels(pix, 0, w, 0, 0, w, h);  
     return (bitmap);  
   }  





Step 3: Finally just Add click listener on button.

   btnblur.setOnClickListener(new OnClickListener() {  
       @Override  
       public void onClick(View view) {  
         AlertDialog.Builder builder=new AlertDialog.Builder(BlurImageView.this,R.style.Theme_D1NoTitleDim);  
         builder.setTitle("Content");  
         builder.setMessage("CLICK OK to Exit");  
         builder.setPositiveButton("ON", new DialogInterface.OnClickListener() {  
           @Override  
           public void onClick(DialogInterface dialog, int which) {  
             dialog.cancel();  
           }  
         });  
         alert=builder.create();  
         Bitmap map=takeScreenShot(BlurImageView.this);  
         Bitmap fast=fastblur(map, 10);  
         final Drawable draw=new BitmapDrawable(getResources(),fast);  
         alert.getWindow().setBackgroundDrawable(draw);  
         alert.show();  
       }  
     });  

Output:

Last Updated: January 19, 2015

AsyncTask Android Example

Introduction

Asynctask(Asynchronous task) in android enable us to perform the task in Background thread giving us the way to separate our tedious work from UI Thread and publish our work back to UI thread after our work get completed.




It has following method(listed in sequence of execution):
    • onPreExceute
    • doInBackGround
    • publishProgress
    • onProgressUpdate
    • onPostExceute
    Note:  We can't access any android widgets (button, progressDialog etc.) elements in       doInBackground. So for updating our work status we publish the progress from doInBackground.

    Android ExampleAsynctask<Params,Progress,Result>


    class AsyncTaskExample extends AsyncTask<Void, Integer, String> {
        
        private  final String TAG = AsyncTaskExample.class.getName();
        
        protected void onPreExecute(){
            Log.d(TAG, "On preExceute...");
        }
        
        protected String doInBackground(Void...arg0) {
            
            Log.d(TAG, "On doInBackground...");
            
            for(int i = 0; i<5; i++){
                Integer in = new Integer(i);
                publishProgress(i);
            }
            
            return "You are at PostExecute";}
        
        protected void onProgressUpdate(Integer...a){
            Log.d(TAG,"You are in progress update ... " + a[0]);
        }
        
        protected void onPostExecute(String result) {
            Log.d(TAG,result); 
        }
    }



    Call in your activity(Any):

     new AsyncTaskExample().execute() - In Our example
     new AsyncTaskExample().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); - for serial task execute.  
     new AsyncTaskExample().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)- For Parallel task.  
    

    Output: