Isolate Keyguard from main thread badness

am: 691546e5b7

* commit '691546e5b7f94a6e2d76630ee1287e0b9c69e7a8':
  Isolate Keyguard from main thread badness
This commit is contained in:
Adrian Roos
2016-02-10 18:22:26 +00:00
committed by android-build-merger
3 changed files with 41 additions and 14 deletions

View File

@@ -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");
}

View File

@@ -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

View File

@@ -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;
}