Isolate Keyguard from main thread badness
am: 691546e5b7
* commit '691546e5b7f94a6e2d76630ee1287e0b9c69e7a8':
Isolate Keyguard from main thread badness
This commit is contained in:
@@ -1405,25 +1405,35 @@ class ContextImpl extends Context {
|
||||
public boolean bindService(Intent service, ServiceConnection conn,
|
||||
int flags) {
|
||||
warnIfCallingFromSystemProcess();
|
||||
return bindServiceCommon(service, conn, flags, Process.myUserHandle());
|
||||
return bindServiceCommon(service, conn, flags, mMainThread.getHandler(),
|
||||
Process.myUserHandle());
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
@Override
|
||||
public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
|
||||
UserHandle user) {
|
||||
return bindServiceCommon(service, conn, flags, user);
|
||||
return bindServiceCommon(service, conn, flags, mMainThread.getHandler(), user);
|
||||
}
|
||||
|
||||
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
|
||||
UserHandle user) {
|
||||
/** @hide */
|
||||
@Override
|
||||
public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
|
||||
Handler handler, UserHandle user) {
|
||||
if (handler == null) {
|
||||
throw new IllegalArgumentException("handler must not be null.");
|
||||
}
|
||||
return bindServiceCommon(service, conn, flags, handler, user);
|
||||
}
|
||||
|
||||
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, Handler
|
||||
handler, UserHandle user) {
|
||||
IServiceConnection sd;
|
||||
if (conn == null) {
|
||||
throw new IllegalArgumentException("connection is null");
|
||||
}
|
||||
if (mPackageInfo != null) {
|
||||
sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
|
||||
mMainThread.getHandler(), flags);
|
||||
sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);
|
||||
} else {
|
||||
throw new RuntimeException("Not supported in system context");
|
||||
}
|
||||
|
||||
@@ -2533,6 +2533,17 @@ public abstract class Context {
|
||||
throw new RuntimeException("Not implemented. Must override in a subclass.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as {@link #bindService(Intent, ServiceConnection, int, UserHandle)}, but with an
|
||||
* explicit non-null Handler to run the ServiceConnection callbacks on.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
|
||||
Handler handler, UserHandle user) {
|
||||
throw new RuntimeException("Not implemented. Must override in a subclass.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect from an application service. You will no longer receive
|
||||
* calls as the service is restarted, and the service is now allowed to
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.view.WindowManagerPolicy.OnKeyguardExitResult;
|
||||
import com.android.internal.policy.IKeyguardDrawnCallback;
|
||||
import com.android.internal.policy.IKeyguardExitCallback;
|
||||
import com.android.internal.policy.IKeyguardService;
|
||||
import com.android.server.UiThread;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -116,8 +117,8 @@ public class KeyguardServiceDelegate {
|
||||
|
||||
public KeyguardServiceDelegate(Context context) {
|
||||
mContext = context;
|
||||
mScrim = createScrim(context);
|
||||
mScrimHandler = new Handler();
|
||||
mScrimHandler = UiThread.getHandler();
|
||||
mScrim = createScrim(context, mScrimHandler);
|
||||
}
|
||||
|
||||
public void bindService(Context context) {
|
||||
@@ -130,7 +131,7 @@ public class KeyguardServiceDelegate {
|
||||
intent.setComponent(keyguardComponent);
|
||||
|
||||
if (!context.bindServiceAsUser(intent, mKeyguardConnection,
|
||||
Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) {
|
||||
Context.BIND_AUTO_CREATE, mScrimHandler, UserHandle.SYSTEM)) {
|
||||
Log.v(TAG, "*** Keyguard: can't bind to " + keyguardComponent);
|
||||
mKeyguardState.showing = false;
|
||||
mKeyguardState.showingAndNotOccluded = false;
|
||||
@@ -334,8 +335,8 @@ public class KeyguardServiceDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
private static final View createScrim(Context context) {
|
||||
View view = new View(context);
|
||||
private static View createScrim(Context context, Handler handler) {
|
||||
final View view = new View(context);
|
||||
|
||||
int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
|
||||
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
|
||||
@@ -345,14 +346,13 @@ public class KeyguardServiceDelegate {
|
||||
|
||||
final int stretch = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
final int type = WindowManager.LayoutParams.TYPE_KEYGUARD_SCRIM;
|
||||
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||
stretch, stretch, type, flags, PixelFormat.TRANSLUCENT);
|
||||
lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
|
||||
lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
|
||||
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED;
|
||||
lp.setTitle("KeyguardScrim");
|
||||
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
|
||||
wm.addView(view, lp);
|
||||
final WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
|
||||
// Disable pretty much everything in statusbar until keyguard comes back and we know
|
||||
// the state of the world.
|
||||
view.setSystemUiVisibility(View.STATUS_BAR_DISABLE_HOME
|
||||
@@ -360,6 +360,12 @@ public class KeyguardServiceDelegate {
|
||||
| View.STATUS_BAR_DISABLE_RECENT
|
||||
| View.STATUS_BAR_DISABLE_EXPAND
|
||||
| View.STATUS_BAR_DISABLE_SEARCH);
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
wm.addView(view, lp);
|
||||
}
|
||||
});
|
||||
return view;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user