Skip to content

Commit 7bb89cf

Browse files
Jeff BrownAndroid (Google) Code Review
authored andcommitted
Merge changes I2c09abaa,I9d8406e1 into jb-mr1-dev
* changes: Cure narcolepsy. Allow applications to connect to known wifi displays.
2 parents f21b94a + f9d40f4 commit 7bb89cf

File tree

5 files changed

+53
-42
lines changed

5 files changed

+53
-42
lines changed

core/java/android/hardware/display/DisplayManager.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ public final class DisplayManager {
4646
* The status is provided as a {@link WifiDisplayStatus} object in the
4747
* {@link #EXTRA_WIFI_DISPLAY_STATUS} extra.
4848
* </p><p>
49-
* This broadcast is only sent to registered receivers with the
50-
* {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY} permission and can
51-
* only be sent by the system.
49+
* This broadcast is only sent to registered receivers and can only be sent by the system.
5250
* </p>
5351
* @hide
5452
*/
@@ -163,6 +161,9 @@ public void scanWifiDisplays() {
163161
* <p>
164162
* Automatically remembers the display after a successful connection, if not
165163
* already remembered.
164+
* </p><p>
165+
* Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY} to connect
166+
* to unknown displays. No permissions are required to connect to already known displays.
166167
* </p>
167168
*
168169
* @param deviceAddress The MAC address of the device to which we should connect.
@@ -187,6 +188,8 @@ public void disconnectWifiDisplay() {
187188
* The display must already be remembered for this call to succeed. In other words,
188189
* we must already have successfully connected to the display at least once and then
189190
* not forgotten it.
191+
* </p><p>
192+
* Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
190193
* </p>
191194
*
192195
* @param deviceAddress The MAC address of the device to rename.
@@ -202,6 +205,8 @@ public void renameWifiDisplay(String deviceAddress, String alias) {
202205
* Forgets a previously remembered Wifi display.
203206
* <p>
204207
* Automatically disconnects from the display if currently connected to it.
208+
* </p><p>
209+
* Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
205210
* </p>
206211
*
207212
* @param deviceAddress The MAC address of the device to forget.

core/java/android/hardware/display/IDisplayManager.aidl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ interface IDisplayManager {
2828

2929
void registerCallback(in IDisplayManagerCallback callback);
3030

31-
// Requires CONFIGURE_WIFI_DISPLAY permission.
31+
// No permissions required.
3232
void scanWifiDisplays();
3333

34-
// Requires CONFIGURE_WIFI_DISPLAY permission.
34+
// Requires CONFIGURE_WIFI_DISPLAY permission to connect to an unknown device.
35+
// No permissions required to connect to a known device.
3536
void connectWifiDisplay(String address);
3637

37-
// Requires CONFIGURE_WIFI_DISPLAY permission.
38+
// No permissions required.
3839
void disconnectWifiDisplay();
3940

4041
// Requires CONFIGURE_WIFI_DISPLAY permission.
@@ -43,6 +44,6 @@ interface IDisplayManager {
4344
// Requires CONFIGURE_WIFI_DISPLAY permission.
4445
void forgetWifiDisplay(String address);
4546

46-
// Requires CONFIGURE_WIFI_DISPLAY permission.
47+
// No permissions required.
4748
WifiDisplayStatus getWifiDisplayStatus();
4849
}

services/java/com/android/server/UiModeManagerService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import android.app.PendingIntent;
2626
import android.app.StatusBarManager;
2727
import android.app.UiModeManager;
28-
import android.content.ActivityNotFoundException;
2928
import android.content.BroadcastReceiver;
3029
import android.content.Context;
3130
import android.content.Intent;
@@ -497,7 +496,8 @@ private void sendConfigurationAndStartDreamOrDockAppLocked(String category) {
497496
sendConfigurationLocked();
498497

499498
// If we did not start a dock app, then start dreaming if supported.
500-
if (!dockAppStarted && isScreenSaverEnabled() && isScreenSaverActivatedOnDock()) {
499+
if (category != null && !dockAppStarted
500+
&& isScreenSaverEnabled() && isScreenSaverActivatedOnDock()) {
501501
Slog.i(TAG, "Activating dream while docked.");
502502
try {
503503
IDreamManager dreamManagerService = IDreamManager.Stub.asInterface(

services/java/com/android/server/display/DisplayManagerService.java

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -352,11 +352,6 @@ private void onCallbackDied(int pid) {
352352

353353
@Override // Binder call
354354
public void scanWifiDisplays() {
355-
if (mContext.checkCallingPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
356-
!= PackageManager.PERMISSION_GRANTED) {
357-
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission");
358-
}
359-
360355
final long token = Binder.clearCallingIdentity();
361356
try {
362357
synchronized (mSyncRoot) {
@@ -371,19 +366,16 @@ public void scanWifiDisplays() {
371366

372367
@Override // Binder call
373368
public void connectWifiDisplay(String address) {
374-
if (mContext.checkCallingPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
375-
!= PackageManager.PERMISSION_GRANTED) {
376-
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission");
377-
}
378369
if (address == null) {
379370
throw new IllegalArgumentException("address must not be null");
380371
}
381372

373+
final boolean trusted = canCallerConfigureWifiDisplay();
382374
final long token = Binder.clearCallingIdentity();
383375
try {
384376
synchronized (mSyncRoot) {
385377
if (mWifiDisplayAdapter != null) {
386-
mWifiDisplayAdapter.requestConnectLocked(address);
378+
mWifiDisplayAdapter.requestConnectLocked(address, trusted);
387379
}
388380
}
389381
} finally {
@@ -393,11 +385,6 @@ public void connectWifiDisplay(String address) {
393385

394386
@Override // Binder call
395387
public void disconnectWifiDisplay() {
396-
if (mContext.checkCallingPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
397-
!= PackageManager.PERMISSION_GRANTED) {
398-
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission");
399-
}
400-
401388
final long token = Binder.clearCallingIdentity();
402389
try {
403390
synchronized (mSyncRoot) {
@@ -412,13 +399,13 @@ public void disconnectWifiDisplay() {
412399

413400
@Override // Binder call
414401
public void renameWifiDisplay(String address, String alias) {
415-
if (mContext.checkCallingPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
416-
!= PackageManager.PERMISSION_GRANTED) {
417-
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission");
418-
}
419402
if (address == null) {
420403
throw new IllegalArgumentException("address must not be null");
421404
}
405+
if (!canCallerConfigureWifiDisplay()) {
406+
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission to "
407+
+ "rename a wifi display.");
408+
}
422409

423410
final long token = Binder.clearCallingIdentity();
424411
try {
@@ -434,13 +421,13 @@ public void renameWifiDisplay(String address, String alias) {
434421

435422
@Override // Binder call
436423
public void forgetWifiDisplay(String address) {
437-
if (mContext.checkCallingPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
438-
!= PackageManager.PERMISSION_GRANTED) {
439-
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission");
440-
}
441424
if (address == null) {
442425
throw new IllegalArgumentException("address must not be null");
443426
}
427+
if (!canCallerConfigureWifiDisplay()) {
428+
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission to "
429+
+ "forget a wifi display.");
430+
}
444431

445432
final long token = Binder.clearCallingIdentity();
446433
try {
@@ -456,11 +443,6 @@ public void forgetWifiDisplay(String address) {
456443

457444
@Override // Binder call
458445
public WifiDisplayStatus getWifiDisplayStatus() {
459-
if (mContext.checkCallingPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
460-
!= PackageManager.PERMISSION_GRANTED) {
461-
throw new SecurityException("Requires CONFIGURE_WIFI_DISPLAY permission");
462-
}
463-
464446
final long token = Binder.clearCallingIdentity();
465447
try {
466448
synchronized (mSyncRoot) {
@@ -475,6 +457,11 @@ public WifiDisplayStatus getWifiDisplayStatus() {
475457
}
476458
}
477459

460+
private boolean canCallerConfigureWifiDisplay() {
461+
return mContext.checkCallingPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
462+
== PackageManager.PERMISSION_GRANTED;
463+
}
464+
478465
private void registerDefaultDisplayAdapter() {
479466
// Register default display adapter.
480467
synchronized (mSyncRoot) {

services/java/com/android/server/display/WifiDisplayAdapter.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import android.media.RemoteDisplay;
2828
import android.os.Handler;
2929
import android.os.IBinder;
30+
import android.util.Slog;
3031
import android.view.Surface;
3132

3233
import java.io.PrintWriter;
@@ -121,7 +122,17 @@ public void run() {
121122
});
122123
}
123124

124-
public void requestConnectLocked(final String address) {
125+
public void requestConnectLocked(final String address, final boolean trusted) {
126+
if (!trusted) {
127+
synchronized (getSyncRoot()) {
128+
if (!isRememberedDisplayLocked(address)) {
129+
Slog.w(TAG, "Ignoring request by an untrusted client to connect to "
130+
+ "an unknown wifi display: " + address);
131+
return;
132+
}
133+
}
134+
}
135+
125136
getHandler().post(new Runnable() {
126137
@Override
127138
public void run() {
@@ -132,6 +143,15 @@ public void run() {
132143
});
133144
}
134145

146+
private boolean isRememberedDisplayLocked(String address) {
147+
for (WifiDisplay display : mRememberedDisplays) {
148+
if (display.getDeviceAddress().equals(address)) {
149+
return true;
150+
}
151+
}
152+
return false;
153+
}
154+
135155
public void requestDisconnectLocked() {
136156
getHandler().post(new Runnable() {
137157
@Override
@@ -241,10 +261,8 @@ public void run() {
241261
getWifiDisplayStatusLocked());
242262
}
243263

244-
// Send protected broadcast about wifi display status to receivers that
245-
// have the required permission.
246-
getContext().sendBroadcast(intent,
247-
android.Manifest.permission.CONFIGURE_WIFI_DISPLAY);
264+
// Send protected broadcast about wifi display status to registered receivers.
265+
getContext().sendBroadcast(intent);
248266
}
249267
};
250268

0 commit comments

Comments
 (0)