Saturday, September 22, 2012

Titanium FTPModule: My First Social step towards Titanium

Finally something new....
A Titanium module to Upload/Download files to/from a FTP Server. Its published on the marketplace.
You can use this module in your Titanium Mobile Application by providing a FTP server with valid credentials for accessing it and Upload/Download files to/from FTP.

For further details you can read the Documentation for the Module on the Marletplace.

Below is the link for the module at the Appcelerator's Marketplace:

https://marketplace.appcelerator.com/apps/3160

I will happy to see some suggestions here as well as reviews on the Marketplace.
Note: This module is for an Android Titanium Application till date.

Tuesday, February 21, 2012

PhoneGap Android Plugin to Extract ZipFile.

Hello Folks,

Its about after 2 months I thought of writing a post. So here is it. I was thinking to extract a .zip file from PhoneGap on android and I ended up implementing a plugin for it.

Include the below .java file with the same package mentioned.

/*
     Author: Vishal Rajpal
     Filename: ExtractZipFilePlugin.java
     Date: 21-02-2012
*/

package com.phonegap.plugin.ExtractZipFile;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import org.json.JSONArray;
import org.json.JSONException;
import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;

public class ExtractZipFilePlugin extends Plugin {

    @Override
    public PluginResult execute(String arg0, JSONArray args, String arg2) {
        PluginResult.Status status = PluginResult.Status.OK;
        JSONArray result = new JSONArray();
        try {
            String filename = args.getString(0);
            File file = new File(filename);
            String[] dirToSplit=filename.split("/");
            String dirToInsert="";
            for(int i=0;i<dirToSplit.length-1;i++)
            {
                dirToInsert+=dirToSplit[i]+"/";
            }
            BufferedOutputStream dest = null;
            BufferedInputStream is = null;
            ZipEntry entry;
            ZipFile zipfile;
            try {
                zipfile = new ZipFile(file);
                Enumeration e = zipfile.entries();
                while (e.hasMoreElements())
                  {
                      entry = (ZipEntry) e.nextElement();
                      is = new BufferedInputStream(zipfile.getInputStream(entry));
                      int count;
                      byte data[] = new byte[102222];
                      String fileName = dirToInsert + entry.getName();
                      File outFile = new File(fileName);
                      if (entry.isDirectory())
                      {
                          outFile.mkdirs();
                      }
                      else
                      {
                          FileOutputStream fos = new FileOutputStream(outFile);
                          dest = new BufferedOutputStream(fos, 102222);
                          while ((count = is.read(data, 0, 102222)) != -1)
                          {
                              dest.write(data, 0, count);
                          }
                          dest.flush();
                          dest.close();
                          is.close();
                      }
                  }
            } catch (ZipException e1) {
                // TODO Auto-generated catch block
                return new PluginResult(PluginResult.Status.MALFORMED_URL_EXCEPTION);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                return new PluginResult(PluginResult.Status.IO_EXCEPTION);
            }
           
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
        }
        return new PluginResult(status);
    }

}


Include the below .js file in your phonegap project.

/*
     Author: Vishal Rajpal
     Filename: ZipPlugin.js
     Date: 21-02-2012
*/

var ExtractZipFilePlugin=function(){
};

PhoneGap.addConstructor(function()
{
    PhoneGap.addPlugin('ExtractZipFilePlugin', new ZipPlugin());
});

ExtractZipFilePlugin.prototype.extractFile = function(file, successCallback, errorCallback)
{
    alert(file);
    return PhoneGap.exec(successCallback, errorCallback, "ZipPlugin", "extract", [file]);
};



Lastly include this plugin in the plugins.xml of your project.


<plugin name="ZipPlugin" value="com.phonegap.plugin.ExtractZipFile.ExtractZipFilePlugin" />

Usage i.e. .html file

<!--
     Author: Vishal Rajpal
     Filename: index.html
     Date: 21-02-2012
-->

<html>
<head>
<script type="text/javascript" src="phonegap-1.3.0.js"></script>
<script type="text/javascript" src="ZipPlugin.js"></script>

<script type="text/javascript">

document.addEventListener("deviceready",onDeviceReady);

function onDeviceReady()
{
}

function extractFile(fileName)
{
    alert(fileName);
    var ZipClient = new ExtractZipFilePlugin();
    ZipClient.extractFile('sdcard/'+fileName,win,fail,'ExtractZipFilePlugin');
}
function win(status)
{
   alert('Success'+status);
}
 
function fail(error)
{
    alert(error);
}
</script>
</head>
<body>
<input type="button" value="Extract Zip File" onClick="extractFile('SampleDir/AnotherDir/SampleFile.zip');"/>
</body>

</html>

The default location for the file has to be sdcard then it can be as many directories or no directory i.e.
extractFile('SampleFile.zip');

The plugin will work both ways.

Thanks. Any suggestions or comments will be helpful.

Friday, December 9, 2011

PhoneGap and Gigya API Implementation

I was stuck regarding facebook implementation through PhoneGap. Though Phonagap provides a plug-in but you need to have facebook application installed on your device and that created a question for me. So here is it with the implementation of childBrowser PhoneGap plugin and the GIGYA API.
Initial Steps
1. Do have a registered Gigya account. you will get a API KEY and the site which you are adding needs to be a valid server as you will be hosting a small html page.
2. Create a new phonegap project.
3. Implement the childBrowser Plug-I. This post helped me as I was implementing it for the first time
http://simonmacdonald.blogspot.com/2011/09/phonegap-android-childbrowser-revamp.html

4.  Here is the code....

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=320; user-scalable=no" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Child Browser Example</title>
    <link rel="stylesheet" href="master.css" type="text/css" media="screen" title="no title" charset="utf-8">
    <script type="text/javascript" charset="utf-8" src="phonegap-1.2.0.js"></script>
    <script type="text/javascript" charset="utf-8" src="childbrowser.js"></script>
    <script src="jquery-1.4.3.min.js"></script>
    <script src="jquery.min.js"></script>
    <script src="jquery.mobile-1.0a1.min.js"></script>
    <script type="text/javascript" charset="utf-8">


    function init(){
        document.addEventListener("deviceready", onDeviceReady, false);
        gigya.services.socialize.addEventHandlers({}, {  
            onLogin:DisplayEventMessage, 
            onConnectionAdded:DisplayEventMessage, 
            onConnectionRemoved:DisplayEventMessage 
           } 
        ); 
    }
    
    function DisplayEventMessage(eventObj) { 
        alert(eventObj.eventName + " event happened"); 
    } 
   
    function onDeviceReady() {
        alert("PhoneGap is ready");
    }
   
    function locationChanged(newurl)
    {
        //alert("The JS got this url = " + newurl);
        console.log(newurl);
       var access=newurl.split("#");
       var token=access[1].split("=");
       //alert(token[0]);
       if(token[0]=="access_token")
       {
//Status URL...Through which status on facebook will be set
var statusurl="https://socialize.gigya.com/socialize.setStatus?status=welcome&oauth_token="+token[1];
            //window.open(statusurl);
            localStorage.accessToken=token[1];
            window.plugins.childBrowser.close();
            window.location="Messages.html";
            console.log(statusurl);
       }
    }
   
    function openNew(statusurl)
    {
        alert(statusurl);
         window.plugins.childBrowser.openExternal(statusurl);
    }
    function closed() {
        alert("The JS got a close event");
    }
   
    function showPage(locbar) {
        window.plugins.childBrowser.onLocationChange = locationChanged;
        window.plugins.childBrowser.onClose = closed;
        var url="https://socialize.gigya.com/socialize.login?client_id=yourGigyaAPIKEY&redirect_uri=http:yourSite/yourPage.html&x_provider=facebook&response_type=token";
        showBrowser(url,locbar);
    }
   
    function showBrowser(url,locbar)
    {
        window.plugins.childBrowser.showWebPage(url, {showLocationBar: locbar});
       
    }
    </script>
  </head>
  <body onload="init()" id="stage" class="theme">
    <a href="#" class="btn large" onclick="showPage(true); return false;">Login to Facebook</a></p>


  </body>
</html>

So, thats it.. you don't need to have a facebook app installed on your device..
Will come up with more things on this.
Any suggestions gracefully accepted....




Thursday, July 21, 2011

PhoneGap

It has been a long time......and a month and half after leaving APIIT....
This post is regarding the recent and still growing technology i.e. 
PhoneGap


Basically again a mobile technology but not specifically for a 
particular mobile OS. Open source, simple and easy to use..
Approx all the native features of any smartphone are accessible..
currently it is serving 6 mobile OS including Nokia, iPhone, 
Android, Blackberry...


The technology basically uses the features of HTML5, Javascript and CSS3...
HTML5 has some awesome features to go through...
APIITians you have a nice oppurtunity around....




Good Luck



Saturday, May 28, 2011

Android-"Tic-Roid": A post worth my life..

I had thought of writing this post after the application will be fully developed.though its not completed yet....Hence I owe my thanks to the precious suggestions and efforts by anyone for the development of this application....I will try to include all the people whom I would like to thank in this post..n I hope I don't miss anyone..

The most thankful my parents....My father knew I needed an Android device..and hence he gifted me one on his Birthday 6/04/2011...There are many instances. I have only mentioned the recent one..

1) Next my room-ies....ahh.. Shoaib Ahmed (Bauna) & Akshat Goyal (akki)....Shoaib mark my words...either you will be hired as a tester one day..or I will be hiring you for the same purpose...The moment I made some changes I used to let shoaib use the application ...and in a small duration of 5 minutes he had some faults which he told me to remove...you made my app efficient brother.. :)

Akshat Goyal..No one except u nd shoaib can bear me in hard situations.... without you today's assignment was nothing....thanx fr everything ... :)

2) Naveen Malik: We have worked tgether at many instances...but the most I will remember is the midpoint one....u really helped me...and I knw u will get a job near by Delhi..."fir Army Canteen mein khana khana beithke" :)

3) Tushar Sahni: "zero kaante mein level kaise banayega" these lines on the first day my topic was accepted inspired me to make the levels more tougher...

4) Jagrat Singh: You are also the lucky one amongst us......you have a bright future...stay as you are.. :)

5) Anish Nikhil & Ankit Ojha (Baba): @Anish sale nigro would have thought abt my suggestion starting mein..situation would have been different..neways still everything is fine..I knw u will manage it..
 @Baba..The day u came to my rum nd said..."1 android ka program run karne mein 2 din lag gaya bc"..That was the day I started learning android..thanx fr that

6)Mohit Awasthi: The day you came to my room...the day went cool...thats it....thanx fr that..

7) Manoj Chauhan & Santosh Kumar : I knw WE three together can do many things..but what I feel is that over confodence beats us smetimes.......else Constructors will shine some day...just remember what we had thought in the recent talks...

8) Narendra Anand: Try to be happy...sale jo hota hai na sahi k liye hota hai..."panauti" fat kam karle thoda...
    Arvind Mahto (Bundu): I will always remember you as you came nd met me on the very frst day in the    
    college

9)  Sandeep Gupta, Rohit Mishra, Saurav Shekhar, Sreejith M.V, Puneet Akhouri: Thanx fr showing trust in me.....@Sandeep..I will always remember those lines you said when I was trying that Bluetooth one// "are try karta reh ho jayega...".....The words inspired me that day...nd will inspire me in future....@ Rohit Mishra use your truthfulness as a weapon...u will go far...@Saurav...finally everything normal brother...I hope I met your expectations..@Sreejith: I knw u were ryt in the recent thing..I would suggest to concenterate on other things which would be beneficial enough to u nd your career...@Puneet...this is the third time I am saying this...I m sorry I could not meet your expectations at IBM ...but one day I will....

10) Sir Aagrah Mandloi: Simply thanks for teaching me...Sir..

11) Seema Sharma: I didn't wanted the way it is going on.....yup I manipulate things smetimes...bt nt to harm you..and this is what u gotta understand...neways its all upto you...gud luck..

12) Milky Jain: "Tu taunt bahut maarti hai"  :) I think thats enough..hpe u understand.

13) Shweta Roy: "kisike haath na aayegi ye ladki.." n sahi mein aisa hi hai..1 hi hai abhi to..

14) Simanta Chakrabarty, Nitesh Choyal, Nandan Dutta, Manish Malviya, Bhupendra Singh, Sajal Garg, Sonal Saket, Amit kumar, Rajeev and the whole CMT branch....will miss you all....




Wednesday, March 2, 2011

Android: Capture the best moments

I was expecting to write a new post on lambu's birthday...but it didn't happened..So here is another android application through which you can capture an image an view it as and when you capture it as a thumbnail....

My Activity

package com.apiit.TryCamera;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class TryCamera extends Activity implements SurfaceHolder.Callback{
private Camera camera;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SurfaceView surface=(SurfaceView)findViewById(R.id.surface);
final SurfaceHolder holder=surface.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.setFixedSize(150, 150);
Button tke=(Button)findViewById(R.id.take_btn);
tke.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
takePicture();
}

});
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {

try{
camera = camera.open();
camera.setPreviewDisplay(holder);
camera.startPreview();
}
catch(IOException e)
{

}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}

private void takePicture(){
camera.takePicture(shutterCallback, rawCallback, jpegCallback);
}
ShutterCallback shutterCallback = new ShutterCallback() {
public void onShutter() {
// TODO Do something when the shutter closes.
}
};
PictureCallback rawCallback = new PictureCallback() {

public void onPictureTaken(byte[] data, Camera camera) {
// TODO Do something with the image RAW data.

}
};
PictureCallback jpegCallback = new PictureCallback() {

public void onPictureTaken(byte[] data, Camera camera) {
// Save the image JPEG data to the SD card
FileOutputStream outStream=null;

FileInputStream fstream = null;
Bitmap bmp;
try {
File root=Environment.getExternalStorageDirectory();
File jpgfile=new File(root,"vinsol.jpg");
outStream=new FileOutputStream(jpgfile);
outStream.write(data);
outStream.flush();
outStream.close();
fstream = new FileInputStream(Environment.getExternalStorageDirectory() + "/" + "vinsol.jpg");
bmp = BitmapFactory.decodeStream(fstream);
ImageView iv=(ImageView)findViewById(R.id.image);
iv.setImageBitmap(bmp);

} catch (FileNotFoundException e) {
Log.d("CAMERAIO", e.getMessage());
} catch (IOException e) {
Log.d("CAMERAIO", e.getMessage());
}
camera.startPreview();
}
};
}





Layout


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="300dip"
android:id="@+id/surface"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<Button
android:layout_width="70dip"
android:layout_height="wrap_content"
android:text="Take Picture"
android:id="@+id/take_btn"/>
<ImageView
android:layout_marginTop="10dip"
android:layout_marginLeft="-5dip"
android:layout_width="wrap_content"
android:layout_height="100dip"
android:id="@+id/image"/>

</LinearLayout>
</LinearLayout>





Important Points

You must be able to see a <SurfaceView> tag in my layout..
When you need to update the content of the view rapidly you need to use the SurfaceView..
as is the case of the camera (Updated frequently)

                                                                     A) Initial Screen

B) Captured Image Thumbnail


As I could not run the application on a device...the screenshot is not showing the proper preview...


Enjoy...Suggestions required.. 
 




Friday, February 18, 2011

A Tribute!!!

Paying a tribute to Pratik Dehane (B.M.S). You are in our hearts brother and we miss you often.
I still remember the charm and sharpness you had but GOD had some different plans for you..
Miss you always brother