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: