From 278a8b0c2e940f0e3dd9c050ae5ce6bad86370e3 Mon Sep 17 00:00:00 2001 From: Joy Babafemi Date: Wed, 8 Sep 2021 16:05:26 +0000 Subject: [PATCH 1/5] DO NOT MERGE: Persist UWB State in AOSP stack. (Cherry-picked from sc-qpr branch) Test: Manual Bug: 191608501 Bug: 212462949 Change-Id: Ib3ff55ab509b5794e2ed0aa0b3a805a6baee8246 --- .../android/server/uwb/UwbServiceImplTest.java | 1 + .../java/com/android/server/uwb/UwbInjector.java | 15 +++++++++++++++ .../com/android/server/uwb/UwbServiceImpl.java | 14 +++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java index 11554c7a7dc55..8c4b4ade233ba 100644 --- a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java @@ -82,6 +82,7 @@ public class UwbServiceImplTest { MockitoAnnotations.initMocks(this); when(mUwbInjector.getVendorService()).thenReturn(mVendorService); when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(true); + when(mUwbInjector.isPersistedUwbStateEnabled()).thenReturn(true); when(mVendorService.asBinder()).thenReturn(mVendorServiceBinder); mUwbServiceImpl = new UwbServiceImpl(mContext, mUwbInjector); } diff --git a/services/uwb/java/com/android/server/uwb/UwbInjector.java b/services/uwb/java/com/android/server/uwb/UwbInjector.java index 64f1da1c8e16a..7445e7f0c5915 100644 --- a/services/uwb/java/com/android/server/uwb/UwbInjector.java +++ b/services/uwb/java/com/android/server/uwb/UwbInjector.java @@ -21,10 +21,13 @@ import static android.content.PermissionChecker.PERMISSION_GRANTED; import android.annotation.NonNull; import android.content.AttributionSource; +import android.content.ContentResolver; import android.content.Context; import android.content.PermissionChecker; import android.os.IBinder; import android.os.ServiceManager; +import android.provider.Settings; +import android.uwb.AdapterState; import android.uwb.IUwbAdapter; @@ -80,4 +83,16 @@ public class UwbInjector { mContext, UWB_RANGING, -1, attributionSource, message); return permissionCheckResult == PERMISSION_GRANTED; } + + /** Returns true if UWB state saved in Settings is enabled. */ + public boolean isPersistedUwbStateEnabled() { + final ContentResolver cr = mContext.getContentResolver(); + try { + return Settings.Global.getInt(cr, Settings.Global.UWB_ENABLED) + == AdapterState.STATE_ENABLED_ACTIVE; + } catch (Settings.SettingNotFoundException e) { + Settings.Global.putInt(cr, Settings.Global.UWB_ENABLED, AdapterState.STATE_DISABLED); + return false; + } + } } diff --git a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java index 4dd26a66cf0ef..da11a9acf2c12 100644 --- a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java +++ b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java @@ -18,13 +18,16 @@ package com.android.server.uwb; import android.annotation.NonNull; import android.content.AttributionSource; +import android.content.ContentResolver; import android.content.Context; import android.os.Binder; import android.os.IBinder; import android.os.PersistableBundle; import android.os.RemoteException; +import android.provider.Settings; import android.util.ArrayMap; import android.util.Log; +import android.uwb.AdapterState; import android.uwb.IUwbAdapter; import android.uwb.IUwbAdapterStateCallbacks; import android.uwb.IUwbRangingCallbacks; @@ -225,13 +228,15 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec mVendorUwbAdapter = null; } - private synchronized IUwbAdapter getVendorUwbAdapter() throws IllegalStateException { + private synchronized IUwbAdapter getVendorUwbAdapter() + throws IllegalStateException, RemoteException { if (mVendorUwbAdapter != null) return mVendorUwbAdapter; mVendorUwbAdapter = mUwbInjector.getVendorService(); if (mVendorUwbAdapter == null) { throw new IllegalStateException("No vendor service found!"); } Log.i(TAG, "Retrieved vendor service"); + mVendorUwbAdapter.setEnabled(mUwbInjector.isPersistedUwbStateEnabled()); linkToVendorServiceDeath(); return mVendorUwbAdapter; } @@ -320,6 +325,13 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec @Override public synchronized void setEnabled(boolean enabled) throws RemoteException { + persistUwbState(enabled); getVendorUwbAdapter().setEnabled(enabled); } + + private void persistUwbState(boolean enabled) { + final ContentResolver cr = mContext.getContentResolver(); + int state = enabled ? AdapterState.STATE_ENABLED_ACTIVE : AdapterState.STATE_DISABLED; + Settings.Global.putInt(cr, Settings.Global.UWB_ENABLED, state); + } } From 63d94a4e6b2c9af6208763f5122f392c194945a3 Mon Sep 17 00:00:00 2001 From: Joy Babafemi Date: Mon, 20 Sep 2021 16:08:50 +0000 Subject: [PATCH 2/5] DO NOT MERGE: Set default UWB state on. (Cherry-picked from sc-qpr branch) Bug: 200101822 Bug: 212462949 Test: Manual Change-Id: I426358779d354dcbcf1866e80d22c375dfd2e997 --- services/uwb/java/com/android/server/uwb/UwbInjector.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/uwb/java/com/android/server/uwb/UwbInjector.java b/services/uwb/java/com/android/server/uwb/UwbInjector.java index 7445e7f0c5915..379a2ff9411eb 100644 --- a/services/uwb/java/com/android/server/uwb/UwbInjector.java +++ b/services/uwb/java/com/android/server/uwb/UwbInjector.java @@ -91,8 +91,9 @@ public class UwbInjector { return Settings.Global.getInt(cr, Settings.Global.UWB_ENABLED) == AdapterState.STATE_ENABLED_ACTIVE; } catch (Settings.SettingNotFoundException e) { - Settings.Global.putInt(cr, Settings.Global.UWB_ENABLED, AdapterState.STATE_DISABLED); - return false; + Settings.Global.putInt(cr, Settings.Global.UWB_ENABLED, + AdapterState.STATE_ENABLED_ACTIVE); + return true; } } } From b8b20bd4cc837119536f45181f58076310eaf3b4 Mon Sep 17 00:00:00 2001 From: Joy Babafemi Date: Tue, 21 Sep 2021 19:42:36 +0000 Subject: [PATCH 3/5] DO NOT MERGE: Clear calling context when adding UWB default setting. (Cherry-picked from sc-qpr branch) Bug: 200346828 Bug: 212462949 Test: Manual Change-Id: I12579263fe0edba16c20a8a152688cd671d66858 --- services/uwb/java/com/android/server/uwb/UwbServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java index da11a9acf2c12..8d2c80a5677b4 100644 --- a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java +++ b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java @@ -236,7 +236,12 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec throw new IllegalStateException("No vendor service found!"); } Log.i(TAG, "Retrieved vendor service"); + long token = Binder.clearCallingIdentity(); + try { mVendorUwbAdapter.setEnabled(mUwbInjector.isPersistedUwbStateEnabled()); + } finally { + Binder.restoreCallingIdentity(token); + } linkToVendorServiceDeath(); return mVendorUwbAdapter; } From 27019c7d95e9140086e5abbb93d65322c0aea035 Mon Sep 17 00:00:00 2001 From: Joy Babafemi Date: Thu, 23 Sep 2021 21:08:58 +0000 Subject: [PATCH 4/5] DO NOT MERGE: Disable UWB in airplane mode. (Cherry-picked from sc-qpr branch) Bug: 199933856 Bug: 212462949 Test: Manual Change-Id: I13c5986e28e7a1a9277518ca96da9a22c5e1c21e --- .../server/uwb/UwbServiceImplTest.java | 1 + .../com/android/server/uwb/UwbInjector.java | 6 ++++ .../android/server/uwb/UwbServiceImpl.java | 29 +++++++++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java index 8c4b4ade233ba..6334e9d3cdc5b 100644 --- a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java @@ -83,6 +83,7 @@ public class UwbServiceImplTest { when(mUwbInjector.getVendorService()).thenReturn(mVendorService); when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(true); when(mUwbInjector.isPersistedUwbStateEnabled()).thenReturn(true); + when(mUwbInjector.isAirplaneModeOn()).thenReturn(false); when(mVendorService.asBinder()).thenReturn(mVendorServiceBinder); mUwbServiceImpl = new UwbServiceImpl(mContext, mUwbInjector); } diff --git a/services/uwb/java/com/android/server/uwb/UwbInjector.java b/services/uwb/java/com/android/server/uwb/UwbInjector.java index 379a2ff9411eb..a7a0500483c27 100644 --- a/services/uwb/java/com/android/server/uwb/UwbInjector.java +++ b/services/uwb/java/com/android/server/uwb/UwbInjector.java @@ -96,4 +96,10 @@ public class UwbInjector { return true; } } + + /** Returns true if airplane mode is turned on. */ + public boolean isAirplaneModeOn() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) == 1; + } } diff --git a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java index 8d2c80a5677b4..70d6aab542a2b 100644 --- a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java +++ b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java @@ -18,8 +18,11 @@ package com.android.server.uwb; import android.annotation.NonNull; import android.content.AttributionSource; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Binder; import android.os.IBinder; import android.os.PersistableBundle; @@ -238,7 +241,7 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec Log.i(TAG, "Retrieved vendor service"); long token = Binder.clearCallingIdentity(); try { - mVendorUwbAdapter.setEnabled(mUwbInjector.isPersistedUwbStateEnabled()); + mVendorUwbAdapter.setEnabled(isEnabled()); } finally { Binder.restoreCallingIdentity(token); } @@ -249,6 +252,7 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec UwbServiceImpl(@NonNull Context context, @NonNull UwbInjector uwbInjector) { mContext = context; mUwbInjector = uwbInjector; + registerAirplaneModeReceiver(); } private void enforceUwbPrivilegedPermission() { @@ -331,7 +335,7 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec @Override public synchronized void setEnabled(boolean enabled) throws RemoteException { persistUwbState(enabled); - getVendorUwbAdapter().setEnabled(enabled); + getVendorUwbAdapter().setEnabled(isEnabled()); } private void persistUwbState(boolean enabled) { @@ -339,4 +343,25 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec int state = enabled ? AdapterState.STATE_ENABLED_ACTIVE : AdapterState.STATE_DISABLED; Settings.Global.putInt(cr, Settings.Global.UWB_ENABLED, state); } + + private void registerAirplaneModeReceiver() { + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + handleAirplaneModeEvent(); + } + }, new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); + } + + private void handleAirplaneModeEvent() { + try { + getVendorUwbAdapter().setEnabled(isEnabled()); + } catch (RemoteException e) { + Log.e(TAG, "Unable to set UWB Adapter state.", e); + } + } + + private boolean isEnabled() { + return mUwbInjector.isPersistedUwbStateEnabled() && !mUwbInjector.isAirplaneModeOn(); + } } From 60a456a0a6fd97696f312cf2b4b16d68b4b208c6 Mon Sep 17 00:00:00 2001 From: Joy Babafemi Date: Thu, 28 Oct 2021 18:23:05 +0000 Subject: [PATCH 5/5] [DO NOT MERGE] Handle IllegalStateException in APM event handling. (Cherry-picked from sc-qpr branch) Test: Manual Bug: 204003158 Bug: 212462949 Change-Id: I8cf2b091b9f323079f54a38dfc9ddfc8af512a43 --- services/uwb/java/com/android/server/uwb/UwbServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java index 70d6aab542a2b..889e182af46b4 100644 --- a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java +++ b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java @@ -356,7 +356,7 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec private void handleAirplaneModeEvent() { try { getVendorUwbAdapter().setEnabled(isEnabled()); - } catch (RemoteException e) { + } catch (RemoteException | IllegalStateException e) { Log.e(TAG, "Unable to set UWB Adapter state.", e); } }