rpc/bt: fix bt socket read

  * Fix BT socket read() to read until the specified number of bytes are
    read or fails.

  * Change GattReader to use AUTO for all device type since it doesn't
    seem to help.

MultiPart: 2/2

Change-Id: Ifea86fe11e82cdeb7e8e7b799025b35939aeedf3
diff --git a/impl/google/rpc/protocols/bt/bt_android.go b/impl/google/rpc/protocols/bt/bt_android.go
index 148a914..4e4b7fc 100644
--- a/impl/google/rpc/protocols/bt/bt_android.go
+++ b/impl/google/rpc/protocols/bt/bt_android.go
@@ -47,18 +47,20 @@
 
 func (btProtocol) Dial(ctx *context.T, protocol, address string, timeout time.Duration) (flow.Conn, error) {
 	env, freeFunc := jutil.GetEnv()
+	defer freeFunc()
+
 	jContext, err := jcontext.JavaContext(env, ctx, nil)
 	if err != nil {
-		freeFunc()
 		return nil, err
 	}
-	// This method will invoke the freeFunc().
-	jStream, err := jutil.CallStaticCallbackMethod(env, freeFunc, jBluetoothClass, "dial", []jutil.Sign{contextSign, jutil.StringSign, jutil.DurationSign}, jContext, address, timeout)
+	jStream, err := jutil.CallStaticObjectMethod(env, jBluetoothClass, "dial", []jutil.Sign{contextSign, jutil.StringSign, jutil.DurationSign}, streamSign, jContext, address, timeout)
 	if err != nil {
 		return nil, err
 	}
-	env, freeFunc = jutil.GetEnv()
-	defer freeFunc()
+	// Reference Java Stream; it will be de-referenced when the Go connection
+	// created below is garbage-collected (through the finalizer callback we
+	// setup just below).
+	jStream = jutil.NewGlobalRef(env, jStream)
 	return newConnection(env, jStream), nil
 }
 
@@ -100,13 +102,16 @@
 
 func (l *btListener) Accept(ctx *context.T) (flow.Conn, error) {
 	env, freeFunc := jutil.GetEnv()
-	// This method will invoke the freeFunc().
-	jStream, err := jutil.CallCallbackMethod(env, freeFunc, l.jListener, "accept", nil)
+	defer freeFunc()
+
+	jStream, err := jutil.CallObjectMethod(env, l.jListener, "accept", nil, streamSign)
 	if err != nil {
 		return nil, err
 	}
-	env, freeFunc = jutil.GetEnv()
-	defer freeFunc()
+	// Reference Java Stream; it will be de-referenced when the Go connection
+	// created below is garbage-collected (through the finalizer callback we
+	// setup just below).
+	jStream = jutil.NewGlobalRef(env, jStream)
 	return newConnection(env, jStream), nil
 }
 
@@ -155,22 +160,20 @@
 
 func (c *btReadWriteCloser) Read(b []byte) (n int, err error) {
 	env, freeFunc := jutil.GetEnv()
-	// This method will invoke the freeFunc().
-	jResult, err := jutil.CallCallbackMethod(env, freeFunc, c.jStream, "read", []jutil.Sign{jutil.IntSign}, len(b))
+	defer freeFunc()
+
+	data, err := jutil.CallByteArrayMethod(env, c.jStream, "read", []jutil.Sign{jutil.IntSign}, len(b))
 	if err != nil {
 		return 0, err
 	}
-	env, freeFunc = jutil.GetEnv()
-	defer freeFunc()
-	defer jutil.DeleteGlobalRef(env, jResult)
-	data := jutil.GoByteArray(env, jResult)
 	return copy(b, data), nil
 }
 
 func (c *btReadWriteCloser) Write(b []byte) (n int, err error) {
 	env, freeFunc := jutil.GetEnv()
-	// This method will invoke the freeFunc().
-	if _, err := jutil.CallCallbackMethod(env, freeFunc, c.jStream, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
+	defer freeFunc()
+
+	if err := jutil.CallVoidMethod(env, c.jStream, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
 		return 0, err
 	}
 	return len(b), nil