Merge "Bluetooth: FTP: Acquire wakelocks only when required"
diff --git a/src/org/codeaurora/bluetooth/ftp/BluetoothFtpObexServer.java b/src/org/codeaurora/bluetooth/ftp/BluetoothFtpObexServer.java
index 923c531..6a6f531 100644
--- a/src/org/codeaurora/bluetooth/ftp/BluetoothFtpObexServer.java
+++ b/src/org/codeaurora/bluetooth/ftp/BluetoothFtpObexServer.java
@@ -32,6 +32,7 @@
import android.content.Context;
import android.os.Message;
import android.os.Handler;
+import android.os.PowerManager;
import android.os.StatFs;
import android.text.TextUtils;
import android.util.Log;
@@ -98,6 +99,8 @@
private Context mContext;
+ private PowerManager.WakeLock mWakeLock = null;
+
public static boolean sIsAborted = false;
public static final String ROOT_FOLDER_PATH = "/sdcard";
@@ -153,13 +156,22 @@
@Override
public int onConnect(final HeaderSet request, HeaderSet reply) {
if (D) Log.d(TAG, "onConnect()+");
+ acquireFtpWakeLock();
+ int returnVal = onConnectInternal(request, reply);
+ releaseFtpWakeLock();
+ if (D) Log.d(TAG, "onConnect()- returning " + returnVal);
+ return returnVal;
+ }
+
+ private int onConnectInternal(final HeaderSet request, HeaderSet reply) {
+ if (D) Log.d(TAG, "onConnectInternal()+");
/* Extract the Target header */
try {
byte[] uuid = (byte[])request.getHeader(HeaderSet.TARGET);
if (uuid == null) {
return ResponseCodes.OBEX_HTTP_NOT_ACCEPTABLE;
}
- if (D) Log.d(TAG, "onConnect(): uuid=" + Arrays.toString(uuid));
+ if (D) Log.d(TAG, "onConnectInternal(): uuid=" + Arrays.toString(uuid));
if (uuid.length != UUID_LENGTH) {
Log.w(TAG, "Wrong UUID length");
@@ -175,23 +187,23 @@
/* Add the uuid into the WHO header part of connect reply */
reply.setHeader(HeaderSet.WHO, uuid);
} catch (IOException e) {
- Log.e(TAG,"onConnect "+ e.toString());
+ Log.e(TAG,"onConnectInternal "+ e.toString());
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
/* Extract the remote WHO header and fill it in the Target header*/
try {
byte[] remote = (byte[])request.getHeader(HeaderSet.WHO);
if (remote != null) {
- if (D) Log.d(TAG, "onConnect(): remote=" +
+ if (D) Log.d(TAG, "onConnectInternal(): remote=" +
Arrays.toString(remote));
reply.setHeader(HeaderSet.TARGET, remote);
}
} catch (IOException e) {
- Log.e(TAG,"onConnect "+ e.toString());
+ Log.e(TAG,"onConnectInternal "+ e.toString());
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
- if (V) Log.v(TAG, "onConnect(): uuid is ok, will send out " +
+ if (V) Log.v(TAG, "onConnectInternal(): uuid is ok, will send out " +
"MSG_SESSION_ESTABLISHED msg.");
/* Notify the FTP service about the session establishment */
Message msg = Message.obtain(mCallback);
@@ -206,7 +218,7 @@
"\n SEC: "+ rootSecondaryStoragePath +"\n");
- if (D) Log.d(TAG, "onConnect() -");
+ if (D) Log.d(TAG, "onConnectInternal() -");
return ResponseCodes.OBEX_HTTP_OK;
}
/**
@@ -223,6 +235,7 @@
public void onDisconnect(final HeaderSet req, final HeaderSet resp) {
if (D) Log.d(TAG, "onDisconnect() +");
+ acquireFtpWakeLock();
resp.responseCode = ResponseCodes.OBEX_HTTP_OK;
/* Send a message to the FTP service to close the Server session */
if (mCallback != null) {
@@ -232,6 +245,7 @@
if (V) Log.v(TAG,
"onDisconnect(): msg MSG_SESSION_DISCONNECTED sent out.");
}
+ releaseFtpWakeLock();
if (D) Log.d(TAG, "onDisconnect() -");
}
/**
@@ -240,8 +254,10 @@
@Override
public int onAbort(HeaderSet request, HeaderSet reply) {
if (D) Log.d(TAG, "onAbort() +");
+ acquireFtpWakeLock();
sIsAborted = true;
if (D) Log.d(TAG, "onAbort() -");
+ releaseFtpWakeLock();
return ResponseCodes.OBEX_HTTP_OK;
}
@@ -261,7 +277,16 @@
*/
@Override
public int onDelete(HeaderSet request, HeaderSet reply) {
- if (D) Log.d(TAG, "onDelete() +");
+ if (D) Log.d(TAG, "onDelete()+");
+ acquireFtpWakeLock();
+ int returnVal = onDeleteInternal(request, reply);
+ releaseFtpWakeLock();
+ if (D) Log.d(TAG, "onDelete()- returning " + returnVal);
+ return returnVal;
+ }
+
+ private int onDeleteInternal(HeaderSet request, HeaderSet reply) {
+ if (D) Log.d(TAG, "onDeleteInternal() +");
String name = "";
/* Check if Card is mounted */
if(FileUtils.checkMountedState() == false) {
@@ -282,11 +307,11 @@
if(D) Log.d(TAG, "cannot delete the directory " + name);
return ResponseCodes.OBEX_HTTP_UNAUTHORIZED;
}
- if (D) Log.d(TAG,"OnDelete File = " + name +
+ if (D) Log.d(TAG,"onDeleteInternal File = " + name +
"mCurrentPath = " + mCurrentPath );
File deleteFile = new File(mCurrentPath + "/" + name);
if(deleteFile.exists() == true){
- if (D) Log.d(TAG, "onDelete(): Found File" + name + "in folder "
+ if (D) Log.d(TAG, "onDeleteInternal(): Found File" + name + "in folder "
+ mCurrentPath);
if(!deleteFile.canWrite()) {
return ResponseCodes.OBEX_HTTP_UNAUTHORIZED;
@@ -311,11 +336,11 @@
return ResponseCodes.OBEX_HTTP_NOT_FOUND;
}
}catch (IOException e) {
- Log.e(TAG,"onDelete "+ e.toString());
+ Log.e(TAG,"onDeleteInternal "+ e.toString());
if (D) Log.d(TAG, "Delete operation failed");
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
- if (D) Log.d(TAG, "onDelete() -");
+ if (D) Log.d(TAG, "onDeleteInternal() -");
return ResponseCodes.OBEX_HTTP_OK;
}
/**
@@ -335,7 +360,16 @@
*/
@Override
public int onPut(final Operation op) {
- if (D) Log.d(TAG, "onPut() +");
+ if (D) Log.d(TAG, "onPut()+");
+ acquireFtpWakeLock();
+ int returnVal = onPutInternal(op);
+ releaseFtpWakeLock();
+ if (D) Log.d(TAG, "onPut()- returning " + returnVal);
+ return returnVal;
+ }
+
+ private int onPutInternal(final Operation op) {
+ if (D) Log.d(TAG, "onPutInternal() +");
HeaderSet request = null;
long length;
String name = "";
@@ -386,7 +420,7 @@
try {
in_stream = op.openInputStream();
} catch (IOException e1) {
- Log.e(TAG,"onPut open input stream "+ e1.toString());
+ Log.e(TAG,"onPutInternal open input stream "+ e1.toString());
if (D) Log.d(TAG, "Error while openInputStream");
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
@@ -452,7 +486,7 @@
}
}
}catch (IOException e1) {
- Log.e(TAG, "onPut File receive"+ e1.toString());
+ Log.e(TAG, "onPutInternal File receive"+ e1.toString());
if (D) Log.d(TAG, "Error when receiving file");
((ServerOperation)op).isAborted = true;
sIsAborted = true;
@@ -465,7 +499,7 @@
try {
buff_op_stream.close();
} catch (IOException e) {
- Log.e(TAG,"onPut close stream "+ e.toString());
+ Log.e(TAG,"onPutInternal close stream "+ e.toString());
if (D) Log.d(TAG, "Error when closing stream after send");
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
@@ -491,11 +525,11 @@
fileinfo.getAbsolutePath());
}catch (IOException e) {
- Log.e(TAG, "onPut headers error "+ e.toString());
+ Log.e(TAG, "onPutInternal headers error "+ e.toString());
if (D) Log.d(TAG, "request headers error");
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
- if (D) Log.d(TAG, "onPut() -");
+ if (D) Log.d(TAG, "onPutInternal() -");
return ResponseCodes.OBEX_HTTP_OK;
}
/**
@@ -518,10 +552,20 @@
* will be used
*/
@Override
- public int onSetPath(final HeaderSet request, final HeaderSet reply, final boolean backup,
- final boolean create) {
+ public int onSetPath(final HeaderSet request, final HeaderSet reply,
+ final boolean backup, final boolean create) {
+ if (D) Log.d(TAG, "onSetPath()+");
+ acquireFtpWakeLock();
+ int returnVal = onSetPathInternal(request, reply, backup, create);
+ releaseFtpWakeLock();
+ if (D) Log.d(TAG, "onSetPath()- returning " + returnVal);
+ return returnVal;
+ }
- if (D) Log.d(TAG, "onSetPath() +");
+ private int onSetPathInternal(final HeaderSet request, final HeaderSet reply,
+ final boolean backup, final boolean create) {
+
+ if (D) Log.d(TAG, "onSetPathInternal() +");
String current_path_tmp = mCurrentPath;
String tmp_path = null;
@@ -534,7 +578,7 @@
try {
tmp_path = (String)request.getHeader(HeaderSet.NAME);
} catch (IOException e) {
- Log.e(TAG,"onSetPath get header"+ e.toString());
+ Log.e(TAG,"onSetPathInternal get header"+ e.toString());
if (D) Log.d(TAG, "Get name header fail");
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
@@ -616,7 +660,7 @@
mCurrentPath = current_path_tmp;
if (V) Log.v(TAG, "after setPath, mCurrentPath == " + mCurrentPath);
- if (D) Log.d(TAG, "onSetPath() -");
+ if (D) Log.d(TAG, "onSetPathInternal() -");
return ResponseCodes.OBEX_HTTP_OK;
}
@@ -626,6 +670,7 @@
@Override
public void onClose() {
if (D) Log.d(TAG, "onClose() +");
+ acquireFtpWakeLock();
/* Send a message to the FTP service to close the Server session */
if (mCallback != null) {
Message msg = Message.obtain(mCallback);
@@ -634,12 +679,22 @@
if (D) Log.d(TAG,
"onClose(): msg MSG_SERVERSESSION_CLOSE sent out.");
}
+ releaseFtpWakeLock();
if (D) Log.d(TAG, "onClose() -");
}
@Override
public int onGet(Operation op) {
- if (D) Log.d(TAG, "onGet() +");
+ if (D) Log.d(TAG, "onGet()+");
+ acquireFtpWakeLock();
+ int returnVal = onGetInternal(op);
+ releaseFtpWakeLock();
+ if (D) Log.d(TAG, "onGet()- returning " + returnVal);
+ return returnVal;
+ }
+
+ private int onGetInternal(Operation op) {
+ if (D) Log.d(TAG, "onGetInternal() +");
sIsAborted = false;
HeaderSet request = null;
@@ -662,7 +717,7 @@
return ResponseCodes.OBEX_HTTP_NOT_ACCEPTABLE;
}
} catch (IOException e) {
- Log.e(TAG,"onGet request headers "+ e.toString());
+ Log.e(TAG,"onGetInternal request headers "+ e.toString());
if (D) Log.d(TAG, "request headers error");
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
@@ -749,7 +804,7 @@
File fileinfo = new File (mCurrentPath + "/" + name);
return sendFileContents(op,fileinfo);
}
- if (D) Log.d(TAG, "onGet() -");
+ if (D) Log.d(TAG, "onGetInternal() -");
return ResponseCodes.OBEX_HTTP_BAD_REQUEST;
}
@@ -1154,4 +1209,31 @@
return returnvalue;
}
+
+ private void acquireFtpWakeLock() {
+ if (mWakeLock == null) {
+ PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ "StartingObexFtpTransaction");
+ mWakeLock.setReferenceCounted(false);
+ mWakeLock.acquire();
+ if (V) Log.v(TAG, "mWakeLock acquired");
+ }
+ else
+ {
+ Log.e(TAG, "mWakeLock already acquired");
+ }
+ }
+
+ private void releaseFtpWakeLock() {
+ if (mWakeLock != null) {
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ if (V) Log.v(TAG, "mWakeLock released");
+ } else {
+ if (V) Log.v(TAG, "mWakeLock already released");
+ }
+ mWakeLock = null;
+ }
+ }
};
diff --git a/src/org/codeaurora/bluetooth/ftp/BluetoothFtpService.java b/src/org/codeaurora/bluetooth/ftp/BluetoothFtpService.java
index f17f1f7..45c5440 100644
--- a/src/org/codeaurora/bluetooth/ftp/BluetoothFtpService.java
+++ b/src/org/codeaurora/bluetooth/ftp/BluetoothFtpService.java
@@ -37,8 +37,6 @@
import android.content.ContentProviderClient;
import android.content.Intent;
import android.os.Message;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
import android.util.Log;
import android.os.Handler;
import android.text.TextUtils;
@@ -206,8 +204,6 @@
public static boolean isL2capSocket = false;
- private WakeLock mWakeLock;
-
private Notification mConnectedNotification = null;
private BluetoothAdapter mAdapter;
@@ -369,10 +365,6 @@
if (VERBOSE) Log.v(TAG, "Ftp Service onDestroy");
super.onDestroy();
- if (mWakeLock != null) {
- mWakeLock.release();
- mWakeLock = null;
- }
closeService();
}
@@ -489,19 +481,6 @@
private final void startObexServerSession() throws IOException {
if (VERBOSE) Log.v(TAG, "Ftp Service startObexServerSession");
- // acquire the wakeLock before start Obex transaction thread
- if (mWakeLock == null) {
- PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- "StartingObexFtpTransaction");
- mWakeLock.setReferenceCounted(false);
- }
-
- if(!mWakeLock.isHeld()) {
- Log.e(TAG,"Acquire partial wake lock");
- mWakeLock.acquire();
- }
-
mFtpServer = new BluetoothFtpObexServer(mSessionStatusHandler, this);
synchronized (this) {
mAuth = new BluetoothFtpAuthenticator(mSessionStatusHandler);
@@ -525,16 +504,6 @@
private void stopObexServerSession() {
if (VERBOSE) Log.v(TAG, "Ftp Service stopObexServerSession");
- // Release the wake lock if obex transaction is over
- if(mWakeLock != null) {
- if (mWakeLock.isHeld()) {
- Log.e(TAG,"Release full wake lock");
- mWakeLock.release();
- mWakeLock = null;
- } else {
- mWakeLock = null;
- }
- }
if (mServerSession != null) {
mServerSession.close();
mServerSession = null;