Use {@link android.content.Context#getSystemService} with {@link
- * android.content.Context#BLUETOOTH_SERVICE} to get the default local
- * Bluetooth adapter. On most Android devices there is only one local
- * Bluetotoh adapter.
+ * Use {@link #getDefaultAdapter} to get the default local Bluetooth
+ * adapter.
*
*
Use the {@link BluetoothDevice} class for operations on remote Bluetooth
* devices.
@@ -257,12 +257,40 @@ public final class BluetoothAdapter {
*/
public static final String EXTRA_LOCAL_NAME = "android.bluetooth.adapter.extra.LOCAL_NAME";
+ /** @hide */
+ public static final String BLUETOOTH_SERVICE = "bluetooth";
+
private static final int ADDRESS_LENGTH = 17;
+ /**
+ * Lazyily initialized singleton. Guaranteed final after first object
+ * constructed.
+ */
+ private static BluetoothAdapter sAdapter;
+
private final IBluetooth mService;
/**
- * Do not use this constructor. Use Context.getSystemService() instead.
+ * Get a handle to the default local Bluetooth adapter.
+ *
Currently Android only supports one Bluetooth adapter, but the API
+ * could be extended to support more. This will always return the default
+ * adapter.
+ * @return the default local adapter, or null if Bluetooth is not supported
+ * on this hardware platform
+ */
+ public static synchronized BluetoothAdapter getDefaultAdapter() {
+ if (sAdapter == null) {
+ IBinder b = ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE);
+ if (b != null) {
+ IBluetooth service = IBluetooth.Stub.asInterface(b);
+ sAdapter = new BluetoothAdapter(service);
+ }
+ }
+ return sAdapter;
+ }
+
+ /**
+ * Use {@link #getDefaultAdapter} to get the BluetoothAdapter instance.
* @hide
*/
public BluetoothAdapter(IBluetooth service) {
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index ce975c2279427..9c23746494a4f 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -18,7 +18,6 @@ package android.bluetooth;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
-import android.content.Context;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -328,7 +327,7 @@ public final class BluetoothDevice implements Parcelable {
/*package*/ static IBluetooth getService() {
synchronized (BluetoothDevice.class) {
if (sService == null) {
- IBinder b = ServiceManager.getService(Context.BLUETOOTH_SERVICE);
+ IBinder b = ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE);
if (b == null) {
throw new RuntimeException("Bluetooth service not available");
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index fe4665e5e7aec..8f1c671046ae6 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1217,14 +1217,6 @@ public abstract class Context {
* @see android.hardware.SensorManager
*/
public static final String SENSOR_SERVICE = "sensor";
- /**
- * Use with {@link #getSystemService} to retrieve a {@link
- * android.bluetooth.BluetoothAdapter} for using Bluetooth.
- *
- * @see #getSystemService
- * @see android.bluetooth.BluetoothAdapter
- */
- public static final String BLUETOOTH_SERVICE = "bluetooth";
/**
* Use with {@link #getSystemService} to retrieve a
* com.android.server.WallpaperService for accessing wallpapers.
diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java
index d61b42f71be10..b73e53ffca838 100644
--- a/core/java/android/server/BluetoothA2dpService.java
+++ b/core/java/android/server/BluetoothA2dpService.java
@@ -137,7 +137,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
throw new RuntimeException("Could not init BluetoothA2dpService");
}
- mAdapter = (BluetoothAdapter) context.getSystemService(Context.BLUETOOTH_SERVICE);
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
mIntentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index 3fdbb68018bb7..6d4d1527a9292 100644
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -154,7 +154,7 @@ public class BluetoothService extends IBluetooth.Stub {
}
public synchronized void initAfterRegistration() {
- mAdapter = (BluetoothAdapter) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
mEventLoop = new BluetoothEventLoop(mContext, mAdapter, this);
}
diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java
index 9e1f325d1d4e9..2060cf8a7ad1f 100644
--- a/core/java/com/android/internal/app/ShutdownThread.java
+++ b/core/java/com/android/internal/app/ShutdownThread.java
@@ -32,6 +32,7 @@ import android.os.RemoteException;
import android.os.Power;
import android.os.ServiceManager;
import android.os.SystemClock;
+
import com.android.internal.telephony.ITelephony;
import android.util.Log;
import android.view.WindowManager;
@@ -91,7 +92,10 @@ public final class ShutdownThread extends Thread {
.setNegativeButton(com.android.internal.R.string.no, null)
.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
- dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
+ if (!context.getResources().getBoolean(
+ com.android.internal.R.bool.config_sf_slowBlur)) {
+ dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
+ }
dialog.show();
} else {
beginShutdownSequence(context);
@@ -111,7 +115,10 @@ public final class ShutdownThread extends Thread {
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
- pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
+ if (!context.getResources().getBoolean(
+ com.android.internal.R.bool.config_sf_slowBlur)) {
+ pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
+ }
pd.show();
@@ -181,7 +188,7 @@ public final class ShutdownThread extends Thread {
ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
final IBluetooth bluetooth =
IBluetooth.Stub.asInterface(ServiceManager.checkService(
- Context.BLUETOOTH_SERVICE));
+ BluetoothAdapter.BLUETOOTH_SERVICE));
try {
bluetoothOff = bluetooth == null ||
diff --git a/core/res/res/values-en-rUS/donottranslate-names.xml b/core/res/res/values-en-rUS/donottranslate-names.xml
index 82ba310cde5fc..ae38ddfc81a1a 100644
--- a/core/res/res/values-en-rUS/donottranslate-names.xml
+++ b/core/res/res/values-en-rUS/donottranslate-names.xml
@@ -4,31 +4,39 @@
+ - Abigail, Abbie, Gail, Gayle
+ - Abe, Abraham
+ - Aggie, Agatha, Agnes
- Albert, Al, Bert, Bertie
- - Alexander, Al, Alex, Lex, Sasha
- - Alexandra, Al, Alex, Allie, Ally, Lex, Lexie, Sandra, Sandy, Sasha
+ - Alexander, Al, Alec, Alex, Lex, Sasha
+ - Alexandra, Al, Allie, Ally, Lex, Lexie, Sandra, Sandy, Sasha
+ - Alf, Alfred, Alfredo, Alfie
- Alice, Allie, Ally
- Alison, Allie, Ally
- Allison, Allie, Ally
- Amanda, Mandi, Mandy
- Andrea, Andie
- Andrew, Andy, Drew
+ - Anne, Annie, Annette
- Anthony, Tony, Toni, Tone
- Arthur, Art, Arty
- Barbara, Babs, Barb, Barbie
- Benjamin, Ben, Benji, Benny
- - Bernard, Bern, Bernie
+ - Bernard, Bern, Bernie, Barnie
- Bertram, Bert, Bertie
- Bradly, Brad
+ - Calvin, Cal
- Catherine, Cat, Cate, Cath, Catie, Cathy, Kat, Kate, Katie, Kathy
+ - Carrie, Caroline, Carolyn
- Charles, Chuck, Chaz, Charlie, Buck
- - Christine, Chris, Chrissy, Chrissie
+ - Christine, Chrissy, Chrissie
- Christopher, Chris
+ - Clinton, Clint
- Cynthia, Cindy, Cynth
- Daniel, Dan, Danny
- David, Dave
- Deborah, Deb, Debbie
- - Dennis, Den, Denny, Dean
+ - Dennis, Den, Denny
- Dolores, Dolly
- Donald, Don, Donny
- Donnatella, Donna
@@ -41,22 +49,21 @@
- Elizabeth, Beth, Bess, Bessie, Betsy, Betty, Bette, Eliza, Lisa, Liza, Liz
- Emily, Em, Ems, Emmy
- Emma, Em, Ems, Emmy
- - Erica, Rikki, Rikkie, Ricky
- Eugene, Gene
+ - Fannie, Fanny
- Florence, Flo
- Frances, Fran, Francie
- - Francis, Fran, Frank
+ - Francis, Fran, Frank, Frankie
- Frederick, Fred, Freddy
- Gabriel, Gabe
- - Geoffrey, Jeff
- Gerald, Gerry
- Gerard, Gerry
- - Gregory, Greg
- - Harold, Hal, Hank, Harry
+ - Gregory, Greg, Gregg
+ - Harold, Hal, Harry
- Henry, Hal, Hank, Harry
- Herbert, Bert, Bertie
- Irving, Irv
- - Isabella, Isa, Izzy
+ - Isabella, Isa, Izzy, Bella
- Jacob, Jake
- Jacqueline, Jackie
- James, Jim, Jimmy, Jamie, Jock
@@ -68,8 +75,9 @@
- Jennifer, Jen, Jenny
- Jerome, Jerry
- Jessica, Jessie
- - John, Jack, Jacky, Johnny, Jon
- - Jonathan, Jon, John
+ - John, Johnny, Jon
+ - Jack, Jacky
+ - Jonathan, Jon
- Joseph, Joe, Joey
- Joshua, Josh
- Kaitlyn, Cat, Cate, Catie, Cath, Cathy, Kat, Kate, Katie, Kathy
@@ -78,17 +86,20 @@
- Katrina, Cat, Cate, Catie, Cath, Cathy, Kat, Kate, Katie, Kathy
- Kenneth, Ken
- Kevin, Kev
+ - Kim, Kimberly
- Laura, Lauri, Laurie
- Lauren, Lauri, Laurie
- - Laurence, Larry, Lauri, Laurie
- - Lawrence, Larry, Lauri, Laurie
+ - Lawrence, Larry
- Leonard, Leo, Len, Lenny
- Leopold, Leo, Len, Lenny
- Madeline, Maddie, Maddy
- - Margaret, Marge, Marg, Maggie, Mags, Meg, Peggy
+ - Margaret, Marge, Marg, Maggie, Mags, Meg, Peggy, Greta, Gretchen
+ - Martin, Martie, Marty
- Matthew, Matt, Mattie
- Maureen, Mo
- Maurice, Mo
+ - Maxwell, Max
+ - Maximilian, Maxim, Max
- Megan, Meg
- Michael, Mickey, Mick, Mike, Mikey
- Morris, Mo
@@ -96,16 +107,17 @@
- Nathan, Nat, Nate
- Nathaniel, Nat, Nate
- Nicholas, Nick
+ - Nicole, Nicky, Nickie, Nikky
- Pamela, Pam
- Patricia, Pat, Patsy, Patty, Trish, Tricia
- - Patrick, Paddy, Pat, Patty, Patter, Rick, Ricky
+ - Patrick, Pat, Patter
+ - Penelope, Penny
- Peter, Pete
- Raymond, Ray
- Philip, Phil
- - Rebecca, Becca
+ - Rebecca, Becca, Becky
- Richard, Rick, Rich, Dick
- Robert, Bob, Rob, Robbie, Bobby, Rab
- - Roberta, Bobbie
- Rodney. Rod
- Ronald, Ron, Ronnie
- Rosemary, Rosie, Rose
@@ -120,7 +132,8 @@
- Stuart, Stu
- Susan, Sue, Susie, Suzie
- Suzanne, Sue, Susie, Suzie
- - Teresa, Terrie, Terry
+ - Tamara, Tammy
+ - Theresa, Teresa
- Theodora, Teddie, Thea, Theo
- Theodore, Ted, Teddy, Theo
- Thomas, Tom, Thom, Tommy
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 9f4af83602cec..9040edb7a58c2 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -26,6 +26,11 @@
strictly needed. -->
false
+
+ false
+
150
diff --git a/graphics/java/android/renderscript/SimpleMesh.java b/graphics/java/android/renderscript/SimpleMesh.java
index b422702bbc43b..0ad093e579781 100644
--- a/graphics/java/android/renderscript/SimpleMesh.java
+++ b/graphics/java/android/renderscript/SimpleMesh.java
@@ -290,6 +290,11 @@ public class SimpleMesh extends BaseObj {
}
public void addTriangle(int idx1, int idx2, int idx3) {
+ if((idx1 >= mVtxCount) || (idx1 < 0) ||
+ (idx2 >= mVtxCount) || (idx2 < 0) ||
+ (idx3 >= mVtxCount) || (idx3 < 0)) {
+ throw new IllegalStateException("Index provided greater than vertex count.");
+ }
if ((mIndexCount + 3) >= mIndexData.length) {
short t[] = new short[mIndexData.length * 2];
System.arraycopy(mIndexData, 0, t, 0, mIndexData.length);
diff --git a/include/private/ui/SharedBufferStack.h b/include/private/ui/SharedBufferStack.h
index f6824d995015b..bbc18227ce5ef 100644
--- a/include/private/ui/SharedBufferStack.h
+++ b/include/private/ui/SharedBufferStack.h
@@ -289,6 +289,7 @@ public:
void setStatus(status_t status);
status_t reallocate();
status_t assertReallocate(int buffer);
+ int32_t getQueuedCount() const;
Region getDirtyRegion(int buffer) const;
diff --git a/include/private/ui/SurfaceFlingerSynchro.h b/include/private/ui/SurfaceFlingerSynchro.h
deleted file mode 100644
index 7386d337675c6..0000000000000
--- a/include/private/ui/SurfaceFlingerSynchro.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_SURFACE_FLINGER_SYNCHRO_H
-#define ANDROID_SURFACE_FLINGER_SYNCHRO_H
-
-#include
-#include
-#include
-#include
-
-namespace android {
-
-class SurfaceFlinger;
-
-class SurfaceFlingerSynchro
-{
-public:
- // client constructor
- SurfaceFlingerSynchro(const sp& flinger);
- ~SurfaceFlingerSynchro();
-
- // signal surfaceflinger for some work
- status_t signal();
-
-private:
- friend class SurfaceFlinger;
- sp mSurfaceComposer;
-};
-
-}; // namespace android
-
-#endif // ANDROID_SURFACE_FLINGER_SYNCHRO_H
-
diff --git a/include/ui/SurfaceComposerClient.h b/include/ui/SurfaceComposerClient.h
index 8701928ebee80..777b878dd1386 100644
--- a/include/ui/SurfaceComposerClient.h
+++ b/include/ui/SurfaceComposerClient.h
@@ -153,7 +153,7 @@ private:
SharedClient* mControl;
sp mControlMemory;
sp mClient;
- SurfaceFlingerSynchro* mSignalServer;
+ sp mSignalServer;
};
}; // namespace android
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index b56e7d7f8476a..3570e102d96e8 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -99,6 +99,7 @@ public:
uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait);
bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace);
+ bool runScript(Script *s, uint32_t launchID);
void initToClient();
void deinitToClient();
@@ -212,7 +213,6 @@ private:
void initEGL();
- bool runScript(Script *s, uint32_t launchID);
bool runRootScript();
static void * threadProc(void *);
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index 9a962907a1007..436f48b319efd 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -1008,6 +1008,13 @@ static uint32_t SC_toClient(void *data, int cmdID, int len, int waitForSpace)
return rsc->sendMessageToClient(data, cmdID, len, waitForSpace != 0);
}
+static void SC_scriptCall(int scriptID)
+{
+ GET_TLS();
+ rsc->runScript((Script *)scriptID, 0);
+}
+
+
//////////////////////////////////////////////////////////////////////////////
// Class implementation
//////////////////////////////////////////////////////////////////////////////
@@ -1289,6 +1296,9 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
{ "debugHexI32", (void *)&SC_debugHexI32,
"void", "(void *, int)" },
+ { "scriptCall", (void *)&SC_scriptCall,
+ "void", "(int)" },
+
{ NULL, NULL, NULL, NULL }
};
diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp
index 0258cee0dbd1f..7fd5434d05230 100644
--- a/libs/surfaceflinger/Layer.cpp
+++ b/libs/surfaceflinger/Layer.cpp
@@ -454,14 +454,16 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions)
// recompute visible region
recomputeVisibleRegions = true;
-
- // we now have the correct size, unfreeze the screen
- mFreezeLock.clear();
}
+
+ // we now have the correct size, unfreeze the screen
+ mFreezeLock.clear();
}
- // FIXME: signal an event if we have more buffers waiting
- // mFlinger->signalEvent();
+ if (lcblk->getQueuedCount()) {
+ // signal an event if we have more buffers waiting
+ mFlinger->signalEvent();
+ }
if (!mPostedDirtyRegion.isEmpty()) {
reloadTexture( mPostedDirtyRegion );
diff --git a/libs/ui/Android.mk b/libs/ui/Android.mk
index 73d86ea94274c..84aec6198558d 100644
--- a/libs/ui/Android.mk
+++ b/libs/ui/Android.mk
@@ -27,8 +27,7 @@ LOCAL_SRC_FILES:= \
Region.cpp \
SharedBufferStack.cpp \
Surface.cpp \
- SurfaceComposerClient.cpp \
- SurfaceFlingerSynchro.cpp
+ SurfaceComposerClient.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp
index b460757414175..46b6766438764 100644
--- a/libs/ui/SharedBufferStack.cpp
+++ b/libs/ui/SharedBufferStack.cpp
@@ -394,6 +394,12 @@ status_t SharedBufferServer::reallocate()
return NO_ERROR;
}
+int32_t SharedBufferServer::getQueuedCount() const
+{
+ SharedBufferStack& stack( *mSharedStack );
+ return stack.queued;
+}
+
status_t SharedBufferServer::assertReallocate(int buffer)
{
ReallocateCondition condition(this, buffer);
diff --git a/libs/ui/Surface.cpp b/libs/ui/Surface.cpp
index 2d83a8c3106de..f51ca7a953c7b 100644
--- a/libs/ui/Surface.cpp
+++ b/libs/ui/Surface.cpp
@@ -746,6 +746,8 @@ status_t Surface::getBufferLocked(int index, int usage)
currentBuffer->setIndex(index);
mNeedFullUpdate = true;
}
+ } else {
+ err = err<0 ? err : NO_MEMORY;
}
}
return err;
diff --git a/libs/ui/SurfaceComposerClient.cpp b/libs/ui/SurfaceComposerClient.cpp
index 3baa2817aac4b..eda84eff04f42 100644
--- a/libs/ui/SurfaceComposerClient.cpp
+++ b/libs/ui/SurfaceComposerClient.cpp
@@ -42,7 +42,6 @@
#include
#include
-#include
#define VERBOSE(...) ((void)0)
//#define VERBOSE LOGD
@@ -155,7 +154,6 @@ void SurfaceComposerClient::_init(
{
VERBOSE("Creating client %p, conn %p", this, conn.get());
- mSignalServer = 0;
mPrebuiltLayerState = 0;
mTransactionOpen = 0;
mStatus = NO_ERROR;
@@ -168,7 +166,7 @@ void SurfaceComposerClient::_init(
}
mControlMemory = mClient->getControlBlock();
- mSignalServer = new SurfaceFlingerSynchro(sm);
+ mSignalServer = sm;
mControl = static_cast(mControlMemory->getBase());
}
@@ -225,7 +223,6 @@ void SurfaceComposerClient::dispose()
Mutex::Autolock _lg(gLock);
Mutex::Autolock _lm(mLock);
- delete mSignalServer;
mSignalServer = 0;
if (mClient != 0) {
diff --git a/libs/ui/SurfaceFlingerSynchro.cpp b/libs/ui/SurfaceFlingerSynchro.cpp
deleted file mode 100644
index c81db71a81283..0000000000000
--- a/libs/ui/SurfaceFlingerSynchro.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include
-
-#include
-
-namespace android {
-
-// ---------------------------------------------------------------------------
-
-SurfaceFlingerSynchro::SurfaceFlingerSynchro(const sp& flinger)
- : mSurfaceComposer(flinger)
-{
-}
-SurfaceFlingerSynchro::~SurfaceFlingerSynchro()
-{
-}
-
-status_t SurfaceFlingerSynchro::signal()
-{
- mSurfaceComposer->signal();
- return NO_ERROR;
-}
-
-// ---------------------------------------------------------------------------
-
-}; // namespace android
-
diff --git a/services/java/com/android/server/DeviceStorageMonitorService.java b/services/java/com/android/server/DeviceStorageMonitorService.java
index 52e09ca260a55..57af02953415d 100644
--- a/services/java/com/android/server/DeviceStorageMonitorService.java
+++ b/services/java/com/android/server/DeviceStorageMonitorService.java
@@ -43,8 +43,8 @@ import android.provider.Settings;
/**
* This class implements a service to monitor the amount of disk storage space
* on the device. If the free storage on device is less than a tunable threshold value
- * (default is 10%. this value is a gservices parameter) a low memory notification is
- * displayed to alert the user. If the user clicks on the low memory notification the
+ * (default is 10%. this value is a gservices parameter) a low memory notification is
+ * displayed to alert the user. If the user clicks on the low memory notification the
* Application Manager application gets launched to let the user free storage space.
* Event log events:
* A low memory event with the free storage on device in bytes is logged to the event log
@@ -68,32 +68,35 @@ class DeviceStorageMonitorService extends Binder {
private static final int EVENT_LOG_FREE_STORAGE_LEFT = 2746;
private static final long DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD = 2 * 1024 * 1024; // 2MB
private static final long DEFAULT_CHECK_INTERVAL = MONITOR_INTERVAL*60*1000;
- private long mFreeMem;
+ private long mFreeMem; // on /data
private long mLastReportedFreeMem;
private long mLastReportedFreeMemTime;
private boolean mLowMemFlag=false;
private Context mContext;
private ContentResolver mContentResolver;
- long mBlkSize;
- long mTotalMemory;
- StatFs mFileStats;
- private static final String DATA_PATH="/data";
- long mThreadStartTime = -1;
- boolean mClearSucceeded = false;
- boolean mClearingCache;
+ private long mTotalMemory; // on /data
+ private StatFs mDataFileStats;
+ private StatFs mSystemFileStats;
+ private StatFs mCacheFileStats;
+ private static final String DATA_PATH = "/data";
+ private static final String SYSTEM_PATH = "/system";
+ private static final String CACHE_PATH = "/cache";
+ private long mThreadStartTime = -1;
+ private boolean mClearSucceeded = false;
+ private boolean mClearingCache;
private Intent mStorageLowIntent;
private Intent mStorageOkIntent;
private CachePackageDataObserver mClearCacheObserver;
private static final int _TRUE = 1;
private static final int _FALSE = 0;
-
+
/**
* This string is used for ServiceManager access to this class.
*/
static final String SERVICE = "devicestoragemonitor";
-
+
/**
- * Handler that checks the amount of disk space on the device and sends a
+ * Handler that checks the amount of disk space on the device and sends a
* notification if the device runs low on disk space
*/
Handler mHandler = new Handler() {
@@ -107,7 +110,7 @@ class DeviceStorageMonitorService extends Binder {
checkMemory(msg.arg1 == _TRUE);
}
};
-
+
class CachePackageDataObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(String packageName, boolean succeeded) {
mClearSucceeded = succeeded;
@@ -115,12 +118,17 @@ class DeviceStorageMonitorService extends Binder {
if(localLOGV) Log.i(TAG, " Clear succeeded:"+mClearSucceeded
+", mClearingCache:"+mClearingCache+" Forcing memory check");
postCheckMemoryMsg(false, 0);
- }
+ }
}
-
+
private final void restatDataDir() {
- mFileStats.restat(DATA_PATH);
- mFreeMem = mFileStats.getAvailableBlocks()*mBlkSize;
+ try {
+ mDataFileStats.restat(DATA_PATH);
+ mFreeMem = (long) mDataFileStats.getAvailableBlocks() *
+ mDataFileStats.getBlockSize();
+ } catch (IllegalArgumentException e) {
+ // use the old value of mFreeMem
+ }
// Allow freemem to be overridden by debug.freemem for testing
String debugFreeMem = SystemProperties.get("debug.freemem");
if (!"".equals(debugFreeMem)) {
@@ -132,10 +140,27 @@ class DeviceStorageMonitorService extends Binder {
DEFAULT_FREE_STORAGE_LOG_INTERVAL_IN_MINUTES)*60*1000;
//log the amount of free memory in event log
long currTime = SystemClock.elapsedRealtime();
- if((mLastReportedFreeMemTime == 0) ||
- (currTime-mLastReportedFreeMemTime) >= freeMemLogInterval) {
+ if((mLastReportedFreeMemTime == 0) ||
+ (currTime-mLastReportedFreeMemTime) >= freeMemLogInterval) {
mLastReportedFreeMemTime = currTime;
- EventLog.writeEvent(EVENT_LOG_FREE_STORAGE_LEFT, mFreeMem);
+ long mFreeSystem = -1, mFreeCache = -1;
+ try {
+ mSystemFileStats.restat(SYSTEM_PATH);
+ mFreeSystem = (long) mSystemFileStats.getAvailableBlocks() *
+ mSystemFileStats.getBlockSize();
+ } catch (IllegalArgumentException e) {
+ // ignore; report -1
+ }
+ try {
+ mCacheFileStats.restat(CACHE_PATH);
+ mFreeCache = (long) mCacheFileStats.getAvailableBlocks() *
+ mCacheFileStats.getBlockSize();
+ } catch (IllegalArgumentException e) {
+ // ignore; report -1
+ }
+ mCacheFileStats.restat(CACHE_PATH);
+ EventLog.writeEvent(EVENT_LOG_FREE_STORAGE_LEFT,
+ mFreeMem, mFreeSystem, mFreeCache);
}
// Read the reporting threshold from Gservices
long threshold = Gservices.getLong(mContentResolver,
@@ -148,7 +173,7 @@ class DeviceStorageMonitorService extends Binder {
EventLog.writeEvent(EVENT_LOG_STORAGE_BELOW_THRESHOLD, mFreeMem);
}
}
-
+
private final void clearCache() {
if (mClearCacheObserver == null) {
// Lazy instantiation
@@ -165,10 +190,10 @@ class DeviceStorageMonitorService extends Binder {
mClearSucceeded = false;
}
}
-
+
private final void checkMemory(boolean checkCache) {
- //if the thread that was started to clear cache is still running do nothing till its
- //finished clearing cache. Ideally this flag could be modified by clearCache
+ //if the thread that was started to clear cache is still running do nothing till its
+ //finished clearing cache. Ideally this flag could be modified by clearCache
// and should be accessed via a lock but even if it does this test will fail now and
//hopefully the next time this flag will be set to the correct value.
if(mClearingCache) {
@@ -177,11 +202,11 @@ class DeviceStorageMonitorService extends Binder {
long diffTime = System.currentTimeMillis() - mThreadStartTime;
if(diffTime > (10*60*1000)) {
Log.w(TAG, "Thread that clears cache file seems to run for ever");
- }
+ }
} else {
restatDataDir();
if (localLOGV) Log.v(TAG, "freeMemory="+mFreeMem);
-
+
//post intent to NotificationManager to display icon if necessary
long memThreshold = getMemThreshold();
if (mFreeMem < memThreshold) {
@@ -214,7 +239,7 @@ class DeviceStorageMonitorService extends Binder {
//keep posting messages to itself periodically
postCheckMemoryMsg(true, DEFAULT_CHECK_INTERVAL);
}
-
+
private void postCheckMemoryMsg(boolean clearCache, long delay) {
// Remove queued messages
mHandler.removeMessages(DEVICE_MEMORY_WHAT);
@@ -222,16 +247,16 @@ class DeviceStorageMonitorService extends Binder {
clearCache ?_TRUE : _FALSE, 0),
delay);
}
-
+
/*
- * just query settings to retrieve the memory threshold.
+ * just query settings to retrieve the memory threshold.
* Preferred this over using a ContentObserver since Settings.Gservices caches the value
* any way
*/
private long getMemThreshold() {
int value = Settings.Gservices.getInt(
- mContentResolver,
- Settings.Gservices.SYS_STORAGE_THRESHOLD_PERCENTAGE,
+ mContentResolver,
+ Settings.Gservices.SYS_STORAGE_THRESHOLD_PERCENTAGE,
DEFAULT_THRESHOLD_PERCENTAGE);
if(localLOGV) Log.v(TAG, "Threshold Percentage="+value);
//evaluate threshold value
@@ -247,16 +272,17 @@ class DeviceStorageMonitorService extends Binder {
mContext = context;
mContentResolver = mContext.getContentResolver();
//create StatFs object
- mFileStats = new StatFs(DATA_PATH);
- //initialize block size
- mBlkSize = mFileStats.getBlockSize();
+ mDataFileStats = new StatFs(DATA_PATH);
+ mSystemFileStats = new StatFs(SYSTEM_PATH);
+ mCacheFileStats = new StatFs(CACHE_PATH);
//initialize total storage on device
- mTotalMemory = ((long)mFileStats.getBlockCount()*mBlkSize)/100L;
+ mTotalMemory = ((long)mDataFileStats.getBlockCount() *
+ mDataFileStats.getBlockSize())/100L;
mStorageLowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_LOW);
mStorageOkIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_OK);
checkMemory(true);
}
-
+
/**
* This method sends a notification to NotificationManager to display
@@ -271,7 +297,7 @@ class DeviceStorageMonitorService extends Binder {
Intent lowMemIntent = new Intent(Intent.ACTION_MANAGE_PACKAGE_STORAGE);
lowMemIntent.putExtra("memory", mFreeMem);
lowMemIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- NotificationManager mNotificationMgr =
+ NotificationManager mNotificationMgr =
(NotificationManager)mContext.getSystemService(
Context.NOTIFICATION_SERVICE);
CharSequence title = mContext.getText(
@@ -302,7 +328,7 @@ class DeviceStorageMonitorService extends Binder {
mContext.removeStickyBroadcast(mStorageLowIntent);
mContext.sendBroadcast(mStorageOkIntent);
}
-
+
public void updateMemory() {
int callingUid = getCallingUid();
if(callingUid != Process.SYSTEM_UID) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e5c60109fb19a..b8cf844edaeed 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -23,6 +23,7 @@ import com.android.internal.os.SamplingProfilerIntegration;
import dalvik.system.VMRuntime;
import android.app.ActivityManagerNative;
+import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.ContentService;
@@ -172,14 +173,14 @@ class ServerThread extends Thread {
// support Bluetooth - see bug 988521
if (SystemProperties.get("ro.kernel.qemu").equals("1")) {
Log.i(TAG, "Registering null Bluetooth Service (emulator)");
- ServiceManager.addService(Context.BLUETOOTH_SERVICE, null);
+ ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null);
} else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
Log.i(TAG, "Registering null Bluetooth Service (factory test)");
- ServiceManager.addService(Context.BLUETOOTH_SERVICE, null);
+ ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null);
} else {
Log.i(TAG, "Bluetooth Service");
bluetooth = new BluetoothService(context);
- ServiceManager.addService(Context.BLUETOOTH_SERVICE, bluetooth);
+ ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, bluetooth);
bluetooth.initAfterRegistration();
bluetoothA2dp = new BluetoothA2dpService(context, bluetooth);
ServiceManager.addService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE,
diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java
index cf63d0220c036..3d1fb83ee1327 100644
--- a/services/java/com/android/server/status/StatusBarPolicy.java
+++ b/services/java/com/android/server/status/StatusBarPolicy.java
@@ -448,8 +448,7 @@ public class StatusBarPolicy {
mBluetoothData = IconData.makeIcon("bluetooth",
null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0, 0);
mBluetoothIcon = service.addIcon(mBluetoothData, null);
- BluetoothAdapter adapter =
- (BluetoothAdapter) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter != null) {
mBluetoothEnabled = adapter.isEnabled();
} else {
@@ -625,15 +624,20 @@ public class StatusBarPolicy {
pixelFormat = bg.getOpacity();
}
+ int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+ | WindowManager.LayoutParams.FLAG_DIM_BEHIND;
+
+ if (!mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_sf_slowBlur)) {
+ flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND;
+ }
+
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_TOAST,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_BLUR_BEHIND
- | WindowManager.LayoutParams.FLAG_DIM_BEHIND,
- pixelFormat);
+ flags, pixelFormat);
// Get the dim amount from the theme
TypedArray a = mContext.obtainStyledAttributes(