Capture the Android's browser HTTP petitions

by psaltamontes » Fri, 19 Jun 2009 02:43:42 GMT


Sponsored Links
 Hi,

I need capture the Android's browser HTTP petitions.

The idea is to use a service that listen a localport (7777). This
service modify the HTTP petition and sends this petition to Internet.

In PC to capture the HTTP petitions is easy, I change the browser
configuration, I put localhost and a port (7777) and it's works. But,
in Android I don't know how to change the browser configuration.

I think that in "/data/data/com.android.browser" there are the
configuration files of the browser, but I don't know if I can
configure the proxy browser.

Any idea?

Thanks.
--~--~---------~--~----~------------~-------~--~----~



Capture the Android's browser HTTP petitions

by psaltamontes » Fri, 19 Jun 2009 22:58:08 GMT


 Yes, I want to say request :), sorry , I need improve my English.

I don't want my application modify the settings of the browser, the
idea is that the user configure the proxy of the browser and install
my application. This application is a service that listen the HTTP
requests and send to the Internet.

I want capture the HTTP request and modify the headers because, in the
header, I put a number to identify the client that connect to my
webserver, doing this, the user don't have to put an user name and a
password. I have written the code to do this, in PC works, but in
Android I don't know how to get this behaviour.

How can I do?



--~--~---------~--~----~------------~-------~--~----~


Sponsored Links


Capture the Android's browser HTTP petitions

by psaltamontes » Fri, 19 Jun 2009 23:34:52 GMT


 Do you know/think if this option will be in the future?

Now, I'm trying to do something with a webview and webviewclient. But
I don't know how to send a "RAW HTTP request" using these classes.

I can send/receive RAW HTTP with sockets, but I don't know how to link
these sockets with the webview.

Any idea?

Thanks.



--~--~---------~--~----~------------~-------~--~----~



Capture the Android's browser HTTP petitions

by psaltamontes » Sat, 20 Jun 2009 00:44:30 GMT


 Here,




Capture the Android's browser HTTP petitions

by Alexey Krasnoriadtsev » Sun, 21 Jun 2009 00:40:00 GMT


 You can create your own Browser application, that will allow proxy
configuration. You can also take original Browser app as the base
(it's available in git).

Those users who need proxy will be able to install your browser
application and use it.




> 



Capture the Android's browser HTTP petitions

by Hamy » Sun, 21 Jun 2009 02:18:54 GMT


 Sorry, realized right after I sent that that the imports might be
useful.

H

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.DefaultHttpClient;




--~--~---------~--~----~------------~-------~--~----~



Capture the Android's browser HTTP petitions

by Hamy » Sun, 21 Jun 2009 02:28:34 GMT


 ot sure if this will help, but I hope so. This is code I found in an
application my research group is working on, and it is under apache v2
license.

Thanks,
Hamy


Log.v(LOG_LABEL, LOG_MSG_PREFIX + "Entering
HTTPPoster.doAccidentPost");
final HttpClient c = new DefaultHttpClient();
final HttpPost post = new HttpPost(SERVER + PATH);
post.addHeader("Content-Type",
"application/x-www-form-urlencoded");

StringBuffer params = new StringBuffer();

// Create the parameter string
params.append("type=accident&user="+androidid+"&time="+ timeStr
+"&speed="+speedStr+"&dec="+decStr+"&lat="
+ lat + "&lon="+lon);


// Add the parameters
Log
.v(LOG_LABEL, LOG_MSG_PREFIX + "Created
parameter string: "
+ params);
post.setEntity(new
ByteArrayEntity(params.toString().getBytes()));

// Do it
Log.i(LOG_LABEL, LOG_MSG_PREFIX + "Executing post to " + SERVER
+
PATH);
Log.d(LOG_LABEL, LOG_MSG_PREFIX + "Spawning thread for HTTP
post");
new Thread(new Runnable() {

public void run() {
HttpResponse resp = null;
try {
resp = c.execute(post);
ByteArrayOutputStream bao = new
ByteArrayOutputStream();
resp.getEntity().writeTo(bao);
Log.d(LOG_LABEL, LOG_MSG_PREFIX +
"Response from server: "
+ new
String(bao.toByteArray()));
} catch (ClientProtocolException e) {
Log.e(LOG_LABEL, LOG_MSG_PREFIX
+
"ClientProtocolException executing post: "
+ e.getMessage());
} catch (IOException e) {
Log.e(LOG_LABEL, LOG_MSG_PREFIX
+ "IOException writing
to ByteArrayOutputStream: "
+ e.getMessage());
} catch (Exception e) {
Log.e(LOG_LABEL, LOG_MSG_PREFIX
+ "Other Exception of
type:" + e.getClass());
Log.e(LOG_LABEL, LOG_MSG_PREFIX + "The
message is: "
+ e.getMessage());
}

if (resp != null &&
resp.getStatusLine().getStatusCode() == 200) {
okRun.run();
}
}

}).start();
Log.d(LOG_LABEL, LOG_MSG_PREFIX + &quo



Capture the Android's browser HTTP petitions

by psaltamontes » Mon, 22 Jun 2009 04:02:35 GMT


 @Alexey :

What's the meaning of "git"?

@ Hamy :

 I needed this line :) ! -> resp.getEntity().writeTo(bao);

I'm sure that the code that you are put help me a lot.

@ Raphael :

I used Google before put my question here.

If you search this --> 
 http://www.google.com/search?q=set +proxy+for+android+web+browser

The information that Google found is about change the "general/main"
proxy, I only want redirect the browser's traffic.

Thank you people.






--~--~---------~--~----~------------~-------~--~----~



Capture the Android's browser HTTP petitions

by Alexey Krasnoriadtsev » Tue, 23 Jun 2009 01:17:29 GMT


 GIT is the repository where all android code is.
for Browser, here is the specific link:
 http://android.git.kernel.org/?p=platform/packages/apps/Browser.git ;a=summary







--~--~---------~--~----~------------~-------~--~----~



Capture the Android's browser HTTP petitions

by psaltamontes » Tue, 23 Jun 2009 03:49:55 GMT


 hen I think that I'm near to do that I want, there is something that
not works :(.

I have achieved send my modified HTTP request! Well, it works, but
only the first time :).

I have used the WebView, DefaultHttpClient, HttpGet and HttpResponse
classes to do it.

WebView : to see the webpages.
DefaultHttpClient : to send the request.
HttpGet : to do the request and add my header (.addHeader())
HttpResponse : to store the response.

When I have the web server response I send to the WebView, I use
loadDataWithBaseURL.

WebView.loadDataWithBaseURL : to load the response, and here is my
problem. If the page has images, for example, the method sends HTTP
GET request. This is OK, but the problem is that the petitions don't
have my header and the server don't accept.

Is possible to modify the petitions that loadDataWithBaseURL does?

@ Alexey :

I have download the browser, this code is complicated for me. I don't
know where to begin. But I will look calmly.


On 22 jun, 19:17, Alexey Krasnoriadtsev <ale...@agilefusion.com>
wrote:
--~--~---------~--~----~------------~-------~--~----~



Capture the Android's browser HTTP petitions

by psaltamontes » Mon, 29 Jun 2009 23:19:06 GMT


  found the solution to capture the requests, I have to put in the
baseUrl parameter the address of the android proxy.

webview.loadDataWithBaseURL(String baseUrl, String data, String
mimeType, String encoding, String failUrl)

For example, if the android proxy service is listening the port 8282,
the baseUrl parameter will be 10.0.2.2:8282. (10.0.2.2 : is the
emulator localhost address). loadDataWithBaseURL sends the requests to
this address and then my proxy can process the request.


On 22 jun, 21:49, psaltamontes <mcg2...@gmail.com> wrote:
--~--~---------~--~----~------------~-------~--~----~



Other Threads

1. How do I bind a row cursor to a listView?

Hello,

I working on an app that's reads a SQLite database and lists selected
rows as listViews inside a TableLayout. The problems is that I dont
know how to bind the row cursors to the listViews. Anyone how have don
such a thing?

Here is the relevant parts of my code

public class DataBaseHelper extends SQLiteOpenHelper {

        public static final String DB_ID = "_id";

        public Cursor fetchDistance(String Distance, int id) {
                return myDatabase.query(true,
                                Distance,
                                null,
                                DB_ID + "=" + id,
                                null, null, null, null, null);
        }

public class TimeSchedules extends Activity {

      int id;

     DataBaseHelper mDbHelper = new DataBaseHelper(this);

     Cursor distanceCursor = mDbHelper.fetchDistance("Race", id);
     startManagingCursor(distanceCursor);
     showRace(laptimeCursor, distanceCursor);

     }

    private void showRace(Cursor l) {

        if(l.moveToFirst()){

                RowCursorAdapter CursorAdapter = new RowCursorAdapter(this,
l);
                View view = (View) CursorAdapter.newView(this, l, new
TableLayout(this));
                setContentView(view);

        }

public class RowCursorAdapter extends ResourceCursorAdapter {

        public RowCursorAdapter(Context context, Cursor c) {
                super(context, R.layout.race_view, c);
        }

    @Override
    public View newView(Context context, Cursor c, ViewGroup parent) {
        LayoutInflater li =
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = li.inflate(R.layout.race_view, parent, false);
        bindView(v, context, c);
        return v;

    }

    @Override
    public void bindView(View view, Context context, Cursor c) {
        ListView tvDistance = (ListView)
view.findViewById(R.id.list_distance);
        ListView tvLap_time = (ListView)
view.findViewById(R.id.list_lap_time);
        ListView tvTime = (ListView)
view.findViewById(R.id.list_time);

//      Here Im really unsure how to bind the rows to the listViews
//      fore textViews and a column cursor the code looks likes as
below.

 
tvDistance.set(c.getString(c.getColumnIndex(DataBaseHelper.DB_DISTANCE));
 
tvLap_time.setText(c.getString(c.getColumnIndex(DataBaseHelper.DB_TEMP_TIME)));
 
tvTime.setText(c.getString(c.getColumnIndex(DataBaseHelper.DB_FINISH_TIME)));

        }

}

Tanks fore reading this



-- 

2. Bluetooth RFCOMM connection dying immediately after .connect()

Hi!

I'm trying to connect to Zeemote ( http://www.***.com/ ) {*filter*} controller
from Moto Droid running 2.0.1 firmware. The test application below does
connect to the device (LED flashes) but connection is dropped immediately. I
can connect to the device perfectly fine using bluez tools (log attached as
well).

I'm quite at a loss here, I work on it for so long that I ran out of ideas
so any help would be very much appreciated.

Btw, looks like this issue is somewhat similar to
 http://www.***.com/ ;lnk=gst&q=bluetooth+connecting#6f8bb2bc0300806c

Thanks,
Max

=========================================== Code:

package zee.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;

public class ZeeTest extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {
            test();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void test() throws IOException {
        BluetoothDevice zee =
BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:1C:4D:02:A6:55");
        Log.d("ZeeTest", "++++ Creating socket");
        BluetoothSocket sock =
zee.createRfcommSocketToServiceRecord(UUID.fromString("8e1f0cf7-508f-4875-b62c-fbb67fd34812"));
        Log.d("", "++++ Connecting");
        sock.connect();
        Log.d("", "++++ Connected");


        final InputStream in = sock.getInputStream();
        new Thread() {
            @Override
            public void run() {
                byte[] buffer = new byte[32];
                int bytes = 0;
                int x = 0;
                Log.d("", "++++ Listening...");
                while (x < 200) {
                    x++;
                    try {
                        bytes = in.read(buffer);
                        Log.d("ZeeTest", "++++ Read "+ bytes +" bytes");
                    } catch (IOException e) {
                        if (x % 50 == 0) {
                            Log.d("", "Tried "+ x +" times ("+ bytes +")");
                        }
                        try { Thread.sleep(100); } catch
(InterruptedException ie) {}
                    }
                }
                Log.d("ZeeTest", "++++ Done: thread exit");
            }
        }.start();
        Log.d("ZeeTest", "++++ Done: test()");
    }
}


=========================================== Log:

I/ActivityManager( 1169): Start proc zee.test for activity
zee.test/.ZeeTest: pid=4294 uid=10084 gids={3002, 3001, 3003}
I/dalvikvm( 4294): De{*filter*} thread not active, ignoring DDM send
(t=0x41504e4d l=38)
D/dalvikvm( 4287): LinearAlloc 0x0 used 640700 of 5242880 (12%)
I/dalvikvm( 4294): De{*filter*} thread not active, ignoring DDM send
(t=0x41504e4d l=20)
D/ZeeTest ( 4294): ++++ Creating socket
D/        ( 4294): ++++ Connecting
E/BluetoothEventLoop.cpp( 1169): event_filter: Received signal
org.bluez.Device:PropertyChanged from
/org/bluez/1240/hci0/dev_00_1C_4D_02_A6_55
I/usbd    ( 1068): process_usb_uevent_message(): buffer = add@
/devices/virtual/bluetooth/hci0/hci0:1
I/usbd    ( 1068): main(): call select(...)
E/BluetoothEventLoop.cpp( 1169): event_filter: Received signal
org.bluez.Adapter:DeviceFound from /org/bluez/1240/hci0
V/BluetoothEventRedirector( 1242): Received
android.bluetooth.device.action.FOUND
V/BluetoothEventRedirector( 1242): Received
android.bleutooth.device.action.UUID
D/        ( 4294): ++++ Connected
D/ZeeTest ( 4294): ++++ Done: test()
D/        ( 4294): ++++ Listening...
I/ActivityManager( 1169): Displayed activity zee.test/.ZeeTest: 2296 ms
(total 2296 ms)
E/BluetoothEventLoop.cpp( 1169): event_filter: Received signal
org.bluez.Device:PropertyChanged from
/org/bluez/1240/hci0/dev_00_1C_4D_02_A6_55
I/usbd    ( 1068): process_usb_uevent_message(): buffer = remove@
/devices/virtual/bluetooth/hci0/hci0:1
I/usbd    ( 1068): main(): call select(...)
V/BluetoothEventRedirector( 1242): Received
android.bleutooth.device.action.UUID
D/        ( 4294): Tried 50 times (0)
D/        ( 4294): Tried 100 times (0)
D/        ( 4294): Tried 150 times (0)
D/        ( 4294): Tried 200 times (0)
D/ZeeTest ( 4294): ++++ Done: thread exit

=========================================== Terminal log:

$ sdptool browse
Inquiring ...
Browsing 00:1C:4D:02:A6:55 ...

$ sdptool records 00:1C:4D:02:A6:55
Service Name: Zeemote
Service RecHandle: 0x10015
Service Class ID List:
  UUID 128: 8e1f0cf7-508f-4875-b62c-fbb67fd34812
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100

$ rfcomm connect /dev/tty10 00:1C:4D:02:A6:55
Connected /dev/rfcomm0 to 00:1C:4D:02:A6:55 on channel 1
Press CTRL-C for hangup

# rfcomm show /dev/tty10
rfcomm0: 00:1F:3A:E4:C8:40 -> 00:1C:4D:02:A6:55 channel 1 connected
[reuse-dlc release-on-hup tty-attached]

# cat /dev/tty10
(nothing here)

# hcidump
HCI sniffer - Bluetooth packet analyzer ver 1.42
device: hci0 snap_len: 1028 filter: 0xffffffff
< HCI Command: Create Connection (0x01|0x0005) plen 13
< HCI Command: Read Remote Supported Features (0x01|0x001b) plen 2
< ACL data: handle 11 flags 0x02 dlen 10
    L2CAP(s): Info req: type 2
< HCI Command: Remote Name Request (0x01|0x0019) plen 10
    L2CAP(s): Info rsp: type 2 result 0
      Extended feature mask 0x0000
< ACL data: handle 11 flags 0x02 dlen 12
    L2CAP(s): Connect req: psm 3 scid 0x0040
    L2CAP(s): Connect rsp: dcid 0x04fb scid 0x0040 result 1 status 2
      Connection pending - Authorization pending
    L2CAP(s): Connect rsp: dcid 0x04fb scid 0x0040 result 0 status 0
      Connection successful
< ACL data: handle 11 flags 0x02 dlen 16
    L2CAP(s): Config req: dcid 0x04fb flags 0x00 clen 4
      MTU 1013
    L2CAP(s): Config rsp: scid 0x0040 flags 0x00 result 0 clen 0
      Success
    L2CAP(s): Config req: dcid 0x0040 flags 0x00 clen 4
      MTU 1013
< ACL data: handle 11 flags 0x02 dlen 18
    L2CAP(s): Config rsp: scid 0x04fb flags 0x00 result 0 clen 4
      MTU 1013
< ACL data: handle 11 flags 0x02 dlen 8
    L2CAP(d): cid 0x04fb len 4 [psm 3]
      RFCOMM(s): SABM: cr 1 dlci 0 pf 1 ilen 0 fcs 0x1c
    L2CAP(d): cid 0x0040 len 4 [psm 3]
      RFCOMM(s): UA: cr 1 dlci 0 pf 1 ilen 0 fcs 0xd7
< ACL data: handle 11 flags 0x02 dlen 18
    L2CAP(d): cid 0x04fb len 14 [psm 3]
      RFCOMM(s): PN CMD: cr 1 dlci 0 pf 0 ilen 10 fcs 0x70 mcc_len 8
      dlci 2 frame_type 0 credit_flow 15 pri 7 ack_timer 0
      frame_size 1008 max_retrans 0 credits 7
    L2CAP(d): cid 0x0040 len 14 [psm 3]
      RFCOMM(s): PN RSP: cr 0 dlci 0 pf 0 ilen 10 fcs 0xaa mcc_len 8
      dlci 2 frame_type 0 credit_flow 14 pri 7 ack_timer 0
      frame_size 1008 max_retrans 0 credits 0
< ACL data: handle 11 flags 0x02 dlen 8
    L2CAP(d): cid 0x04fb len 4 [psm 3]
      RFCOMM(s): SABM: cr 1 dlci 2 pf 1 ilen 0 fcs 0x59
    L2CAP(d): cid 0x0040 len 4 [psm 3]
      RFCOMM(s): UA: cr 1 dlci 2 pf 1 ilen 0 fcs 0x92
< ACL data: handle 11 flags 0x02 dlen 12
    L2CAP(d): cid 0x04fb len 8 [psm 3]
      RFCOMM(s): MSC CMD: cr 1 dlci 0 pf 0 ilen 4 fcs 0x70 mcc_len 2
      dlci 2 fc 0 rtc 1 rtr 1 ic 0 dv 1 b1 0 b2 0 b3 0 len 0
    L2CAP(d): cid 0x0040 len 8 [psm 3]
      RFCOMM(s): MSC CMD: cr 0 dlci 0 pf 0 ilen 4 fcs 0xaa mcc_len 2
      dlci 2 fc 0 rtc 1 rtr 1 ic 0 dv 0 b1 0 b2 0 b3 0 len 0
< ACL data: handle 11 flags 0x02 dlen 12
    L2CAP(d): cid 0x04fb len 8 [psm 3]
      RFCOMM(s): MSC RSP: cr 1 dlci 0 pf 0 ilen 4 fcs 0x70 mcc_len 2
      dlci 2 fc 0 rtc 1 rtr 1 ic 0 dv 0 b1 0 b2 0 b3 0 len 0
    L2CAP(d): cid 0x0040 len 8 [psm 3]
      RFCOMM(s): MSC RSP: cr 0 dlci 0 pf 0 ilen 4 fcs 0xaa mcc_len 2
      dlci 2 fc 0 rtc 1 rtr 1 ic 0 dv 1 b1 0 b2 0 b3 0 len 0
    L2CAP(d): cid 0x0040 len 5 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 1 ilen 0 fcs 0x5c credits 1
< ACL data: handle 11 flags 0x02 dlen 9
    L2CAP(d): cid 0x04fb len 5 [psm 3]
      RFCOMM(d): UIH: cr 1 dlci 2 pf 1 ilen 0 fcs 0x86 credits 33
    L2CAP(d): cid 0x0040 len 50 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 46 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 42 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 38 fcs 0x40
    L2CAP(d): cid 0x0040 len 42 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 38 fcs 0x40
    L2CAP(d): cid 0x0040 len 42 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 38 fcs 0x40
    L2CAP(d): cid 0x0040 len 42 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 38 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40
    L2CAP(d): cid 0x0040 len 12 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 8 fcs 0x40

...events are received...

disconnection sequence (device being shut down):


    L2CAP(d): cid 0x0040 len 13 [psm 3]
      RFCOMM(d): UIH: cr 0 dlci 2 pf 0 ilen 9 fcs 0x40
    L2CAP(d): cid 0x0040 len 4 [psm 3]
      RFCOMM(s): DISC: cr 0 dlci 2 pf 1 ilen 0 fcs 0xd9
< ACL data: handle 11 flags 0x02 dlen 8
    L2CAP(d): cid 0x04fb len 4 [psm 3]
      RFCOMM(s): UA: cr 0 dlci 2 pf 1 ilen 0 fcs 0xf3
< ACL data: handle 11 flags 0x02 dlen 8
    L2CAP(d): cid 0x04fb len 4 [psm 3]
      RFCOMM(s): DISC: cr 1 dlci 0 pf 1 ilen 0 fcs 0xfd
< ACL data: handle 11 flags 0x02 dlen 12
    L2CAP(s): Disconn req: dcid 0x04fb scid 0x0040
    L2CAP(d): cid 0x0040 len 4 [psm 3]
      RFCOMM(s): UA: cr 1 dlci 0 pf 1 ilen 0 fcs 0xd7
    L2CAP(s): Disconn rsp: dcid 0x04fb scid 0x0040
< HCI Command: Disconnect (0x01|0x0006) plen 3

-- 

3. Looking for Android plugin for NetBeans 6.8 ?

4. Display Numeric Keypad instead of Default Keypad | from HTML code

5. Possible to detect which grid sections are used by widgets on home screen?

6. Best Practice For Displaying Two Types of Views

7. how to logging in android npapi plugin