merge in jb-mr2-release history after reset to jb-mr2-dev
diff --git a/include/gui/BufferItemConsumer.h b/include/gui/BufferItemConsumer.h
index 0840891..98b450c 100644
--- a/include/gui/BufferItemConsumer.h
+++ b/include/gui/BufferItemConsumer.h
@@ -84,6 +84,14 @@
 
     sp<IGraphicBufferProducer> getProducerInterface() const { return getBufferQueue(); }
 
+    // setDefaultBufferSize is used to set the size of buffers returned by
+    // requestBuffers when a with and height of zero is requested.
+    status_t setDefaultBufferSize(uint32_t w, uint32_t h);
+
+    // setDefaultBufferFormat allows the BufferQueue to create
+    // GraphicBuffers of a defaultFormat if no format is specified
+    // in dequeueBuffer
+    status_t setDefaultBufferFormat(uint32_t defaultFormat);
 };
 
 } // namespace android
diff --git a/libs/gui/BufferItemConsumer.cpp b/libs/gui/BufferItemConsumer.cpp
index 885b4e4..90619ab 100644
--- a/libs/gui/BufferItemConsumer.cpp
+++ b/libs/gui/BufferItemConsumer.cpp
@@ -93,4 +93,14 @@
     return err;
 }
 
+status_t BufferItemConsumer::setDefaultBufferSize(uint32_t w, uint32_t h) {
+    Mutex::Autolock _l(mMutex);
+    return mBufferQueue->setDefaultBufferSize(w, h);
+}
+
+status_t BufferItemConsumer::setDefaultBufferFormat(uint32_t defaultFormat) {
+    Mutex::Autolock _l(mMutex);
+    return mBufferQueue->setDefaultBufferFormat(defaultFormat);
+}
+
 } // namespace android
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
index b256cce..16dabe8 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -111,6 +111,15 @@
     return c;
 }
 
+status_t SensorDevice::resetStateWithoutActuatingHardware(void *ident, int handle)
+{
+    if (!mSensorDevice) return NO_INIT;
+    Info& info( mActivationCount.editValueFor(handle));
+    Mutex::Autolock _l(mLock);
+    info.rates.removeItem(ident);
+    return NO_ERROR;
+}
+
 status_t SensorDevice::activate(void* ident, int handle, int enabled)
 {
     if (!mSensorDevice) return NO_INIT;
diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h
index b423f40..c0b357d 100644
--- a/services/sensorservice/SensorDevice.h
+++ b/services/sensorservice/SensorDevice.h
@@ -56,6 +56,7 @@
     ssize_t poll(sensors_event_t* buffer, size_t count);
     status_t activate(void* ident, int handle, int enabled);
     status_t setDelay(void* ident, int handle, int64_t ns);
+    status_t resetStateWithoutActuatingHardware(void *ident, int handle);
     void dump(String8& result, char* buffer, size_t SIZE);
 };
 
diff --git a/services/sensorservice/SensorInterface.cpp b/services/sensorservice/SensorInterface.cpp
index 468aa61..cf0a11d 100644
--- a/services/sensorservice/SensorInterface.cpp
+++ b/services/sensorservice/SensorInterface.cpp
@@ -54,6 +54,10 @@
     return mSensorDevice.setDelay(ident, handle, ns);
 }
 
+status_t HardwareSensor::resetStateWithoutActuatingHardware(void *ident, int handle) {
+    return mSensorDevice.resetStateWithoutActuatingHardware(ident, handle);
+}
+
 Sensor HardwareSensor::getSensor() const {
     return mSensor;
 }
diff --git a/services/sensorservice/SensorInterface.h b/services/sensorservice/SensorInterface.h
index fb357d7..2e709ae 100644
--- a/services/sensorservice/SensorInterface.h
+++ b/services/sensorservice/SensorInterface.h
@@ -40,6 +40,11 @@
     virtual status_t setDelay(void* ident, int handle, int64_t ns) = 0;
     virtual Sensor getSensor() const = 0;
     virtual bool isVirtual() const = 0;
+    virtual status_t resetStateWithoutActuatingHardware(void *ident, int handle) {
+        // Override when you want to clean up for sensors which auto disable
+        // after trigger, or when enabling sensors fail.
+        return INVALID_OPERATION;
+    }
 };
 
 // ---------------------------------------------------------------------------
@@ -61,6 +66,7 @@
     virtual status_t setDelay(void* ident, int handle, int64_t ns);
     virtual Sensor getSensor() const;
     virtual bool isVirtual() const { return false; }
+    virtual status_t resetStateWithoutActuatingHardware(void *ident, int handle);
 };
 
 
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 9ca6b45..ebf5cf0 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -242,10 +242,18 @@
 
 void SensorService::cleanupAutoDisabledSensor(const sp<SensorEventConnection>& connection,
         sensors_event_t const* buffer, const int count) {
+    SensorInterface* sensor;
+    status_t err = NO_ERROR;
     for (int i=0 ; i<count ; i++) {
         int handle = buffer[i].sensor;
         if (getSensorType(handle) == SENSOR_TYPE_SIGNIFICANT_MOTION) {
             if (connection->hasSensor(handle)) {
+                sensor = mSensorMap.valueFor(handle);
+                err = sensor ?sensor->resetStateWithoutActuatingHardware(connection.get(), handle)
+                        : status_t(BAD_VALUE);
+                if (err != NO_ERROR) {
+                    ALOGE("Sensor Inteface: Resetting state failed with err: %d", err);
+                }
                 cleanupWithoutDisable(connection, handle);
             }
         }
@@ -530,6 +538,9 @@
     status_t err = sensor ? sensor->activate(connection.get(), true) : status_t(BAD_VALUE);
 
     if (err != NO_ERROR) {
+        // enable has failed, reset state in SensorDevice.
+        status_t resetErr = sensor ? sensor->resetStateWithoutActuatingHardware(connection.get(),
+                handle) : status_t(BAD_VALUE);
         // enable has failed, reset our state.
         cleanupWithoutDisable(connection, handle);
     }