Merge "Deprecate NavigationState APIs, rm androidx.car-cluster refs"
diff --git a/service/src/com/android/car/CarProjectionService.java b/service/src/com/android/car/CarProjectionService.java
index def3299..3c7d842 100644
--- a/service/src/com/android/car/CarProjectionService.java
+++ b/service/src/com/android/car/CarProjectionService.java
@@ -49,15 +49,16 @@
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.graphics.Rect;
+import android.net.wifi.WifiClient;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiManager.LocalOnlyHotspotCallback;
 import android.net.wifi.WifiManager.LocalOnlyHotspotReservation;
-import android.net.wifi.WifiManager.SoftApCallback;
 import android.net.wifi.WifiScanner;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.HandlerExecutor;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Messenger;
@@ -595,7 +596,7 @@
 
         if (mSoftApCallback == null) {
             mSoftApCallback = new ProjectionSoftApCallback();
-            mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler);
+            mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler));
             ensureApConfiguration();
         }
 
@@ -940,7 +941,7 @@
         }
     }
 
-    private class ProjectionSoftApCallback implements SoftApCallback {
+    private class ProjectionSoftApCallback implements WifiManager.SoftApCallback {
         private boolean mCurrentStateCall = true;
 
         @Override
@@ -982,8 +983,11 @@
         }
 
         @Override
-        public void onNumClientsChanged(int numClients) {
-            Log.i(TAG, "ProjectionSoftApCallback, onNumClientsChanged: " + numClients);
+        public void onConnectedClientsChanged(List<WifiClient> clients) {
+            if (DBG) {
+                Log.d(TAG, "ProjectionSoftApCallback, onConnectedClientsChanged with "
+                        + clients.size() + " clients");
+            }
         }
     }
 
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherPreferenceController.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherPreferenceController.java
index 3ce80a5..3097e3b 100644
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherPreferenceController.java
+++ b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherPreferenceController.java
@@ -16,14 +16,11 @@
 
 package com.android.car.developeroptions.wifi.tether;
 
-import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.net.ConnectivityManager;
+import android.net.wifi.WifiClient;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
-import android.provider.Settings;
 import android.text.BidiFormatter;
 
 import androidx.annotation.VisibleForTesting;
@@ -39,6 +36,8 @@
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
 
+import java.util.List;
+
 public class WifiTetherPreferenceController extends AbstractPreferenceController
         implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop {
 
@@ -128,13 +127,14 @@
                     }
 
                     @Override
-                    public void onNumClientsChanged(int numClients) {
+                    public void onConnectedClientsChanged(List<WifiClient> clients) {
                         if (mPreference != null
                                 && mSoftApState == WifiManager.WIFI_AP_STATE_ENABLED) {
                             // Only show the number of clients when state is on
+                            int numberOfClients = clients.size();
                             mPreference.setSummary(mContext.getResources().getQuantityString(
-                                    R.plurals.wifi_tether_connected_summary, numClients,
-                                    numClients));
+                                    R.plurals.wifi_tether_connected_summary, numberOfClients,
+                                    numberOfClients));
                         }
                     }
                 });
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherSoftApManager.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherSoftApManager.java
index f31a64f..0d3f8d2 100644
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherSoftApManager.java
+++ b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/wifi/tether/WifiTetherSoftApManager.java
@@ -1,7 +1,11 @@
 package com.android.car.developeroptions.wifi.tether;
 
+import android.net.wifi.WifiClient;
 import android.net.wifi.WifiManager;
 import android.os.Handler;
+import android.os.HandlerExecutor;
+
+import java.util.List;
 
 /**
  * Wrapper for {@link android.net.wifi.WifiManager.SoftApCallback} to pass the robo test
@@ -18,8 +22,8 @@
         }
 
         @Override
-        public void onNumClientsChanged(int numClients) {
-            mWifiTetherSoftApCallback.onNumClientsChanged(numClients);
+        public void onConnectedClientsChanged(List<WifiClient> clients) {
+            mWifiTetherSoftApCallback.onConnectedClientsChanged(clients);
         }
     };
     private Handler mHandler;
@@ -32,7 +36,7 @@
     }
 
     public void registerSoftApCallback() {
-        mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler);
+        mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler));
     }
 
     public void unRegisterSoftApCallback() {
@@ -42,6 +46,11 @@
     public interface WifiTetherSoftApCallback {
         void onStateChanged(int state, int failureReason);
 
-        void onNumClientsChanged(int numClients);
+        /**
+         * Called when the connected clients to soft AP changes.
+         *
+         * @param clients the currently connected clients
+         */
+        void onConnectedClientsChanged(List<WifiClient> clients);
     }
 }
diff --git a/tools/keventreader/server/keymap.cpp b/tools/keventreader/server/keymap.cpp
index 2e7c06d..5a86ff1 100644
--- a/tools/keventreader/server/keymap.cpp
+++ b/tools/keventreader/server/keymap.cpp
@@ -28,7 +28,7 @@
     fillMap();
 }
 
-std::string_view Keymap::getDisplayName(int keycode) {
+std::string Keymap::getDisplayName(int keycode) {
     auto iter = mKeyMap.find(keycode), end = mKeyMap.end();
     if (iter == end) {
         std::stringstream ss;
diff --git a/tools/keventreader/server/keymap.h b/tools/keventreader/server/keymap.h
index 28f68d6..86ec4d5 100644
--- a/tools/keventreader/server/keymap.h
+++ b/tools/keventreader/server/keymap.h
@@ -25,7 +25,7 @@
     public:
         static Keymap& get();
 
-        std::string_view getDisplayName(int keycode);
+        std::string getDisplayName(int keycode);
 
     private:
         std::map<int, const char*> mKeyMap;