Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java +35 −11 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.UserHandle; Loading @@ -34,10 +33,13 @@ import com.android.systemui.statusbar.policy.KeyguardMonitor; /** * Base class for dialogs that should appear over panels and keyguard. * The SystemUIDialog registers a listener for the screen off / close system dialogs broadcast, * and dismisses itself when it receives the broadcast. */ public class SystemUIDialog extends AlertDialog { private final Context mContext; private final DismissReceiver mDismissReceiver; public SystemUIDialog(Context context) { this(context, R.style.Theme_SystemUI_Dialog); Loading @@ -52,7 +54,19 @@ public class SystemUIDialog extends AlertDialog { attrs.setTitle(getClass().getSimpleName()); getWindow().setAttributes(attrs); registerDismissListener(this); mDismissReceiver = new DismissReceiver(this); } @Override protected void onStart() { super.onStart(); mDismissReceiver.register(); } @Override protected void onStop() { super.onStop(); mDismissReceiver.unregister(); } public void setShowForAllUsers(boolean show) { Loading Loading @@ -100,12 +114,22 @@ public class SystemUIDialog extends AlertDialog { return dialog; } /** * Registers a listener that dismisses the given dialog when it receives * the screen off / close system dialogs broadcast. * <p> * <strong>Note:</strong> Don't call dialog.setOnDismissListener() after * calling this because it causes a leak of BroadcastReceiver. * * @param dialog The dialog to be associated with the listener. */ public static void registerDismissListener(Dialog dialog) { DismissReceiver dismissReceiver = new DismissReceiver(dialog); dialog.setOnDismissListener(d -> dismissReceiver.unregister()); dismissReceiver.register(); } private static class DismissReceiver extends BroadcastReceiver implements OnDismissListener { private static class DismissReceiver extends BroadcastReceiver { private static final IntentFilter INTENT_FILTER = new IntentFilter(); static { INTENT_FILTER.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); Loading @@ -125,16 +149,16 @@ public class SystemUIDialog extends AlertDialog { mRegistered = true; } void unregister() { if (mRegistered) { mDialog.getContext().unregisterReceiver(this); mRegistered = false; } } @Override public void onReceive(Context context, Intent intent) { mDialog.dismiss(); } @Override public void onDismiss(DialogInterface dialog) { if (mRegistered) { mDialog.getContext().unregisterReceiver(this); mRegistered = false; } } }} packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java +9 −2 Original line number Diff line number Diff line Loading @@ -17,9 +17,11 @@ package com.android.systemui.statusbar.phone; import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; Loading Loading @@ -52,13 +54,18 @@ public class SystemUIDialogTest extends SysuiTestCase { @Test public void testRegisterReceiver() { final ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); final ArgumentCaptor<IntentFilter> intentFilterCaptor = ArgumentCaptor.forClass(IntentFilter.class); verify(mContextSpy).registerReceiverAsUser(any(), any(), mDialog.show(); verify(mContextSpy).registerReceiverAsUser(broadcastReceiverCaptor.capture(), any(), intentFilterCaptor.capture(), any(), any()); assertTrue(intentFilterCaptor.getValue().hasAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } mDialog.dismiss(); verify(mContextSpy).unregisterReceiver(eq(broadcastReceiverCaptor.getValue())); } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java +35 −11 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.UserHandle; Loading @@ -34,10 +33,13 @@ import com.android.systemui.statusbar.policy.KeyguardMonitor; /** * Base class for dialogs that should appear over panels and keyguard. * The SystemUIDialog registers a listener for the screen off / close system dialogs broadcast, * and dismisses itself when it receives the broadcast. */ public class SystemUIDialog extends AlertDialog { private final Context mContext; private final DismissReceiver mDismissReceiver; public SystemUIDialog(Context context) { this(context, R.style.Theme_SystemUI_Dialog); Loading @@ -52,7 +54,19 @@ public class SystemUIDialog extends AlertDialog { attrs.setTitle(getClass().getSimpleName()); getWindow().setAttributes(attrs); registerDismissListener(this); mDismissReceiver = new DismissReceiver(this); } @Override protected void onStart() { super.onStart(); mDismissReceiver.register(); } @Override protected void onStop() { super.onStop(); mDismissReceiver.unregister(); } public void setShowForAllUsers(boolean show) { Loading Loading @@ -100,12 +114,22 @@ public class SystemUIDialog extends AlertDialog { return dialog; } /** * Registers a listener that dismisses the given dialog when it receives * the screen off / close system dialogs broadcast. * <p> * <strong>Note:</strong> Don't call dialog.setOnDismissListener() after * calling this because it causes a leak of BroadcastReceiver. * * @param dialog The dialog to be associated with the listener. */ public static void registerDismissListener(Dialog dialog) { DismissReceiver dismissReceiver = new DismissReceiver(dialog); dialog.setOnDismissListener(d -> dismissReceiver.unregister()); dismissReceiver.register(); } private static class DismissReceiver extends BroadcastReceiver implements OnDismissListener { private static class DismissReceiver extends BroadcastReceiver { private static final IntentFilter INTENT_FILTER = new IntentFilter(); static { INTENT_FILTER.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); Loading @@ -125,16 +149,16 @@ public class SystemUIDialog extends AlertDialog { mRegistered = true; } void unregister() { if (mRegistered) { mDialog.getContext().unregisterReceiver(this); mRegistered = false; } } @Override public void onReceive(Context context, Intent intent) { mDialog.dismiss(); } @Override public void onDismiss(DialogInterface dialog) { if (mRegistered) { mDialog.getContext().unregisterReceiver(this); mRegistered = false; } } }}
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java +9 −2 Original line number Diff line number Diff line Loading @@ -17,9 +17,11 @@ package com.android.systemui.statusbar.phone; import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; Loading Loading @@ -52,13 +54,18 @@ public class SystemUIDialogTest extends SysuiTestCase { @Test public void testRegisterReceiver() { final ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); final ArgumentCaptor<IntentFilter> intentFilterCaptor = ArgumentCaptor.forClass(IntentFilter.class); verify(mContextSpy).registerReceiverAsUser(any(), any(), mDialog.show(); verify(mContextSpy).registerReceiverAsUser(broadcastReceiverCaptor.capture(), any(), intentFilterCaptor.capture(), any(), any()); assertTrue(intentFilterCaptor.getValue().hasAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } mDialog.dismiss(); verify(mContextSpy).unregisterReceiver(eq(broadcastReceiverCaptor.getValue())); } }