Merge "A11y timeout api: build breaks fixed"
diff --git a/api/current.txt b/api/current.txt
index 9c851e9..dc383fd 100755
--- a/api/current.txt
+++ b/api/current.txt
@@ -14993,7 +14993,7 @@
method public final int getLevel();
method public int getMinimumHeight();
method public int getMinimumWidth();
- method public abstract int getOpacity();
+ method public abstract deprecated int getOpacity();
method public android.graphics.Insets getOpticalInsets();
method public void getOutline(android.graphics.Outline);
method public boolean getPadding(android.graphics.Rect);
diff --git a/api/system-current.txt b/api/system-current.txt
index d8f7f4a..da1adac 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -3832,6 +3832,14 @@
}
+package android.net.wifi.p2p {
+
+ public class WifiP2pManager {
+ method public void factoryReset(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ }
+
+}
+
package android.net.wifi.rtt {
public static final class RangingRequest.Builder {
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index e95f9ab..713f752 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -857,11 +857,17 @@
@Override
public BiometricManager createService(ContextImpl ctx)
throws ServiceNotFoundException {
- final IBinder binder =
- ServiceManager.getServiceOrThrow(Context.BIOMETRIC_SERVICE);
- final IBiometricService service =
- IBiometricService.Stub.asInterface(binder);
- return new BiometricManager(ctx.getOuterContext(), service);
+ if (BiometricManager.hasBiometrics(ctx)) {
+ final IBinder binder =
+ ServiceManager.getServiceOrThrow(Context.BIOMETRIC_SERVICE);
+ final IBiometricService service =
+ IBiometricService.Stub.asInterface(binder);
+ return new BiometricManager(ctx.getOuterContext(), service);
+ } else {
+ // Allow access to the manager when service is null. This saves memory
+ // on devices without biometric hardware.
+ return new BiometricManager(ctx.getOuterContext(), null);
+ }
}
});
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java
index fe00604..ff58c75 100644
--- a/core/java/android/hardware/biometrics/BiometricManager.java
+++ b/core/java/android/hardware/biometrics/BiometricManager.java
@@ -22,6 +22,7 @@
import android.annotation.IntDef;
import android.annotation.RequiresPermission;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.util.Slog;
@@ -64,6 +65,19 @@
private final Context mContext;
private final IBiometricService mService;
+ private final boolean mHasHardware;
+
+ /**
+ * @param context
+ * @return
+ * @hide
+ */
+ public static boolean hasBiometrics(Context context) {
+ final PackageManager pm = context.getPackageManager();
+ return pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
+ || pm.hasSystemFeature(PackageManager.FEATURE_IRIS)
+ || pm.hasSystemFeature(PackageManager.FEATURE_FACE);
+ }
/**
* @hide
@@ -73,6 +87,8 @@
public BiometricManager(Context context, IBiometricService service) {
mContext = context;
mService = service;
+
+ mHasHardware = hasBiometrics(context);
}
/**
@@ -93,8 +109,12 @@
throw e.rethrowFromSystemServer();
}
} else {
- Slog.w(TAG, "hasEnrolledBiometrics(): Service not connected");
- return BIOMETRIC_ERROR_UNAVAILABLE;
+ if (!mHasHardware) {
+ return BIOMETRIC_ERROR_NO_HARDWARE;
+ } else {
+ Slog.w(TAG, "hasEnrolledBiometrics(): Service not connected");
+ return BIOMETRIC_ERROR_UNAVAILABLE;
+ }
}
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f1f4b0c..8e4de9f 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4895,6 +4895,7 @@
MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NETWORK_SHOW_RSSI);
MOVED_TO_GLOBAL.add(Settings.Global.WIFI_WATCHDOG_ON);
MOVED_TO_GLOBAL.add(Settings.Global.WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED);
+ MOVED_TO_GLOBAL.add(Settings.Global.WIFI_P2P_PENDING_FACTORY_RESET);
MOVED_TO_GLOBAL.add(Settings.Global.WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON);
MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_ENABLE);
MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_TIMEOUT);
@@ -9995,6 +9996,15 @@
"wifi_rtt_background_exec_gap_ms";
/**
+ * Indicate whether factory reset request is pending.
+ *
+ * Type: int (0 for false, 1 for true)
+ * @hide
+ */
+ public static final String WIFI_P2P_PENDING_FACTORY_RESET =
+ "wifi_p2p_pending_factory_reset";
+
+ /**
* Whether soft AP will shut down after a timeout period when no devices are connected.
*
* Type: int (0 for false, 1 for true)
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index 5433393..3a908dc 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -64,5 +64,8 @@
// OPEN: Biometric Enrollment (android.settings.BIOMETRIC_ENROLL action intent)
BIOMETRIC_ENROLL_ACTIVITY = 1586;
+
+ // OPEN: Settings > Privacy
+ TOP_LEVEL_PRIVACY = 1587;
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index d5dc903..3342266 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -497,6 +497,7 @@
Settings.Global.WIFI_NUM_OPEN_NETWORKS_KEPT,
Settings.Global.WIFI_ON,
Settings.Global.WIFI_P2P_DEVICE_NAME,
+ Settings.Global.WIFI_P2P_PENDING_FACTORY_RESET,
Settings.Global.WIFI_REENABLE_DELAY_MS,
Settings.Global.WIFI_RTT_BACKGROUND_EXEC_GAP_MS,
Settings.Global.WIFI_SAVED_STATE,
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index e1f7263..caf610b 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -934,11 +934,13 @@
* do account for the value of {@link #setAlpha}, but the general behavior is dependent
* upon the implementation of the subclass.
*
+ * @deprecated This method is no longer used in graphics optimizations
+ *
* @return int The opacity class of the Drawable.
*
* @see android.graphics.PixelFormat
*/
- public abstract @PixelFormat.Opacity int getOpacity();
+ @Deprecated public abstract @PixelFormat.Opacity int getOpacity();
/**
* Return the appropriate opacity value for two source opacities. If
diff --git a/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java b/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
index 8fee822..6f437bd5 100644
--- a/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
+++ b/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
@@ -15,6 +15,7 @@
*/
package android.ext.services.notification;
+import static android.app.Notification.CATEGORY_MESSAGE;
import static android.app.NotificationChannel.USER_LOCKED_IMPORTANCE;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
@@ -148,6 +149,18 @@
return Objects.equals(getNotification().category, category);
}
+ /**
+ * Similar to {@link #isCategory(String)}, but checking the public version of the notification,
+ * if available.
+ */
+ public boolean isPublicVersionCategory(String category) {
+ Notification publicVersion = getNotification().publicVersion;
+ if (publicVersion == null) {
+ return false;
+ }
+ return Objects.equals(publicVersion.category, category);
+ }
+
public boolean isAudioAttributesUsage(int usage) {
return mAttributes != null && mAttributes.getUsage() == usage;
}
@@ -175,9 +188,9 @@
}
protected boolean isMessaging() {
- return isCategory(Notification.CATEGORY_MESSAGE)
- || hasStyle(Notification.MessagingStyle.class)
- || hasInlineReply();
+ return isCategory(CATEGORY_MESSAGE)
+ || isPublicVersionCategory(CATEGORY_MESSAGE)
+ || hasStyle(Notification.MessagingStyle.class);
}
public boolean hasInlineReply() {
diff --git a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
index 37a98fd..b2fc417 100644
--- a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
+++ b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
@@ -19,23 +19,22 @@
import android.annotation.Nullable;
import android.app.Notification;
import android.app.RemoteAction;
-import android.app.RemoteInput;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.Process;
-import android.os.SystemProperties;
-import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.view.textclassifier.ConversationActions;
import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
public class SmartActionsHelper {
private static final ArrayList<Notification.Action> EMPTY_ACTION_LIST = new ArrayList<>();
@@ -50,12 +49,18 @@
private static final int MAX_ACTION_EXTRACTION_TEXT_LENGTH = 400;
private static final int MAX_ACTIONS_PER_LINK = 1;
private static final int MAX_SMART_ACTIONS = Notification.MAX_ACTION_BUTTONS;
- // Allow us to test out smart reply with dumb suggestions, it is disabled by default.
- // TODO: Removed this once we have the model.
- private static final String SYS_PROP_SMART_REPLIES_EXPERIMENT =
- "persist.sys.smart_replies_experiment";
+ private static final int MAX_SUGGESTED_REPLIES = 3;
- SmartActionsHelper() {}
+ private static final ConversationActions.TypeConfig TYPE_CONFIG =
+ new ConversationActions.TypeConfig.Builder().setIncludedTypes(
+ Collections.singletonList(ConversationActions.TYPE_TEXT_REPLY))
+ .includeTypesFromTextClassifier(false)
+ .build();
+ private static final List<String> HINTS =
+ Collections.singletonList(ConversationActions.HINT_FOR_NOTIFICATION);
+
+ SmartActionsHelper() {
+ }
/**
* Adds action adjustments based on the notification contents.
@@ -92,8 +97,31 @@
if (context == null) {
return EMPTY_REPLY_LIST;
}
- // TODO: replaced this with our model when it is ready.
- return new ArrayList<>(Arrays.asList("Yes, please", "No, thanks"));
+ TextClassificationManager tcm = context.getSystemService(TextClassificationManager.class);
+ if (tcm == null) {
+ return EMPTY_REPLY_LIST;
+ }
+ CharSequence text = getMostSalientActionText(entry.getNotification());
+ ConversationActions.Message message =
+ new ConversationActions.Message.Builder()
+ .setText(text)
+ .build();
+
+ ConversationActions.Request request =
+ new ConversationActions.Request.Builder(Collections.singletonList(message))
+ .setMaxSuggestions(MAX_SUGGESTED_REPLIES)
+ .setHints(HINTS)
+ .setTypeConfig(TYPE_CONFIG)
+ .build();
+
+ TextClassifier textClassifier = tcm.getTextClassifier();
+ List<ConversationActions.ConversationAction> conversationActions =
+ textClassifier.suggestConversationActions(request).getConversationActions();
+
+ return conversationActions.stream()
+ .map(conversationAction -> conversationAction.getTextReply())
+ .filter(textReply -> !TextUtils.isEmpty(textReply))
+ .collect(Collectors.toCollection(ArrayList::new));
}
/**
@@ -124,20 +152,30 @@
}
private boolean isEligibleForReplyAdjustment(@NonNull NotificationEntry entry) {
- if (!SystemProperties.getBoolean(SYS_PROP_SMART_REPLIES_EXPERIMENT, false)) {
+ if (!Process.myUserHandle().equals(entry.getSbn().getUser())) {
return false;
}
- Notification notification = entry.getNotification();
- if (notification.actions == null) {
+ String pkg = entry.getSbn().getPackageName();
+ if (TextUtils.isEmpty(pkg) || pkg.equals("android")) {
return false;
}
- return entry.hasInlineReply();
+ // For now, we are only interested in messages.
+ if (!entry.isMessaging()) {
+ return false;
+ }
+ // Does not make sense to provide suggested replies if it is not something that can be
+ // replied.
+ if (!entry.hasInlineReply()) {
+ return false;
+ }
+ return true;
}
/** Returns the text most salient for action extraction in a notification. */
@Nullable
private CharSequence getMostSalientActionText(@NonNull Notification notification) {
/* If it's messaging style, use the most recent message. */
+ // TODO: Use the last few X messages instead and take the Person object into consideration.
Parcelable[] messages = notification.extras.getParcelableArray(Notification.EXTRA_MESSAGES);
if (messages != null && messages.length != 0) {
Bundle lastMessage = (Bundle) messages[messages.length - 1];
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
index dd8bfda..92fd868 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
@@ -51,6 +51,8 @@
public static final String CATEGORY_GESTURES = "com.android.settings.category.ia.gestures";
public static final String CATEGORY_NIGHT_DISPLAY =
"com.android.settings.category.ia.night_display";
+ public static final String CATEGORY_PRIVACY =
+ "com.android.settings.category.ia.privacy";
public static final Map<String, String> KEY_COMPAT_MAP;
diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto
index ddd0c2c..a947ea1 100644
--- a/proto/src/metrics_constants/metrics_constants.proto
+++ b/proto/src/metrics_constants/metrics_constants.proto
@@ -2832,7 +2832,7 @@
// ACTION: Logs the end to end time taken by all provisioning tasks.
PROVISIONING_TOTAL_TASK_TIME_MS = 627;
- // OPEN: Settings > Privacy
+ // OPEN: Settings > Security
// CATEGORY: SETTINGS
// OS: O
ENTERPRISE_PRIVACY_SETTINGS = 628;
@@ -6579,6 +6579,11 @@
// OS: Q
BIOMETRIC_ENROLL_ACTIVITY = 1586;
+ // OPEN: Settings > Privacy
+ // CATEGORY: SETTINGS
+ // OS: Q
+ TOP_LEVEL_PRIVACY = 1587;
+
// ---- End Q Constants, all Q constants go above this line ----
// Add new aosp constants above this line.
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 5fa667a..b788935 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -2122,7 +2122,8 @@
// Only system declares background permissions, hence mapping does never change.
mBackgroundPermissions = new ArrayMap<>();
for (BasePermission bp : mSettings.getAllPermissionsLocked()) {
- if (bp.perm.info != null && bp.perm.info.backgroundPermission != null) {
+ if (bp.perm != null && bp.perm.info != null
+ && bp.perm.info.backgroundPermission != null) {
String fgPerm = bp.name;
String bgPerm = bp.perm.info.backgroundPermission;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 1dae396..97af045 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -41,6 +41,7 @@
import static android.os.Build.VERSION_CODES.O;
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.Display.INVALID_DISPLAY;
import static android.view.Display.STATE_OFF;
import static android.view.WindowManager.DOCKED_LEFT;
import static android.view.WindowManager.DOCKED_RIGHT;
@@ -155,6 +156,7 @@
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
+import android.app.ActivityOptions;
import android.app.ActivityTaskManager;
import android.app.ActivityThread;
import android.app.AppOpsManager;
@@ -665,9 +667,6 @@
SleepToken mDreamingSleepToken;
SleepToken mScreenOffSleepToken;
volatile boolean mKeyguardOccluded;
- boolean mHomePressed;
- boolean mHomeConsumed;
- boolean mHomeDoubleTapPending;
Intent mHomeIntent;
Intent mCarDockIntent;
Intent mDeskDockIntent;
@@ -865,7 +864,7 @@
launchVoiceAssistWithWakeLock();
break;
case MSG_POWER_DELAYED_PRESS:
- powerPress((Long)msg.obj, msg.arg1 != 0, msg.arg2);
+ powerPress((Long) msg.obj, msg.arg1 != 0, msg.arg2);
finishPowerKeyPress();
break;
case MSG_POWER_LONG_PRESS:
@@ -1340,7 +1339,7 @@
case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:
goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,
PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
- launchHomeFromHotKey();
+ launchHomeFromHotKey(DEFAULT_DISPLAY);
break;
case SHORT_PRESS_POWER_GO_HOME:
shortPressPowerGoHome();
@@ -1369,7 +1368,8 @@
}
private void shortPressPowerGoHome() {
- launchHomeFromHotKey(true /* awakenFromDreams */, false /*respectKeyguard*/);
+ launchHomeFromHotKey(DEFAULT_DISPLAY, true /* awakenFromDreams */,
+ false /*respectKeyguard*/);
if (isKeyguardShowingAndNotOccluded()) {
// Notify keyguard so it can do any special handling for the power button since the
// device will not power off and only launch home.
@@ -1505,7 +1505,8 @@
private void sleepPress() {
if (mShortPressOnSleepBehavior == SHORT_PRESS_SLEEP_GO_TO_SLEEP_AND_GO_HOME) {
- launchHomeFromHotKey(false /* awakenDreams */, true /*respectKeyguard*/);
+ launchHomeFromHotKey(DEFAULT_DISPLAY, false /* awakenDreams */,
+ true /*respectKeyguard*/);
}
}
@@ -1683,7 +1684,7 @@
Settings.Secure.TV_USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0;
}
- private void handleShortPressOnHome() {
+ private void handleShortPressOnHome(int displayId) {
// Turn on the connected TV and switch HDMI input if we're a HDMI playback device.
final HdmiControl hdmiControl = getHdmiControl();
if (hdmiControl != null) {
@@ -1698,7 +1699,7 @@
}
// Go home!
- launchHomeFromHotKey();
+ launchHomeFromHotKey(displayId);
}
/**
@@ -1745,26 +1746,6 @@
}
}
- private void handleLongPressOnHome(int deviceId) {
- if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_NOTHING) {
- return;
- }
- mHomeConsumed = true;
- performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false,
- "Home - Long Press");
- switch (mLongPressOnHomeBehavior) {
- case LONG_PRESS_HOME_ALL_APPS:
- launchAllAppsAction();
- break;
- case LONG_PRESS_HOME_ASSIST:
- launchAssistAction(null, deviceId);
- break;
- default:
- Log.w(TAG, "Undefined home long press behavior: " + mLongPressOnHomeBehavior);
- break;
- }
- }
-
private void launchAllAppsAction() {
Intent intent = new Intent(Intent.ACTION_ALL_APPS);
if (mHasFeatureLeanback) {
@@ -1781,13 +1762,6 @@
startActivityAsUser(intent, UserHandle.CURRENT);
}
- private void handleDoubleTapOnHome() {
- if (mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI) {
- mHomeConsumed = true;
- toggleRecentApps();
- }
- }
-
private void showPictureInPictureMenu(KeyEvent event) {
if (DEBUG_INPUT) Log.d(TAG, "showPictureInPictureMenu event=" + event);
mHandler.removeMessages(MSG_SHOW_PICTURE_IN_PICTURE_MENU);
@@ -1803,15 +1777,147 @@
}
}
- private final Runnable mHomeDoubleTapTimeoutRunnable = new Runnable() {
- @Override
- public void run() {
- if (mHomeDoubleTapPending) {
- mHomeDoubleTapPending = false;
- handleShortPressOnHome();
+ /** A handler to handle home keys per display */
+ private class DisplayHomeButtonHandler {
+
+ private final int mDisplayId;
+
+ private boolean mHomeDoubleTapPending;
+ private boolean mHomePressed;
+ private boolean mHomeConsumed;
+
+ private final Runnable mHomeDoubleTapTimeoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mHomeDoubleTapPending) {
+ mHomeDoubleTapPending = false;
+ handleShortPressOnHome(mDisplayId);
+ }
+ }
+ };
+
+ DisplayHomeButtonHandler(int displayId) {
+ mDisplayId = displayId;
+ }
+
+ int handleHomeButton(WindowState win, KeyEvent event) {
+ final boolean keyguardOn = keyguardOn();
+ final int repeatCount = event.getRepeatCount();
+ final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
+ final boolean canceled = event.isCanceled();
+
+ if (DEBUG_INPUT) {
+ Log.d(TAG, String.format("handleHomeButton in display#%d mHomePressed = %b",
+ mDisplayId, mHomePressed));
+ }
+
+ // If we have released the home key, and didn't do anything else
+ // while it was pressed, then it is time to go home!
+ if (!down) {
+ if (mDisplayId == DEFAULT_DISPLAY) {
+ cancelPreloadRecentApps();
+ }
+
+ mHomePressed = false;
+ if (mHomeConsumed) {
+ mHomeConsumed = false;
+ return -1;
+ }
+
+ if (canceled) {
+ Log.i(TAG, "Ignoring HOME; event canceled.");
+ return -1;
+ }
+
+ // Delay handling home if a double-tap is possible.
+ if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_NOTHING) {
+ mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable); // just in case
+ mHomeDoubleTapPending = true;
+ mHandler.postDelayed(mHomeDoubleTapTimeoutRunnable,
+ ViewConfiguration.getDoubleTapTimeout());
+ return -1;
+ }
+
+ handleShortPressOnHome(mDisplayId);
+ return -1;
+ }
+
+ // If a system window has focus, then it doesn't make sense
+ // right now to interact with applications.
+ WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
+ if (attrs != null) {
+ final int type = attrs.type;
+ if (type == TYPE_KEYGUARD_DIALOG
+ || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
+ // the "app" is keyguard, so give it the key
+ return 0;
+ }
+ for (int t : WINDOW_TYPES_WHERE_HOME_DOESNT_WORK) {
+ if (type == t) {
+ // don't do anything, but also don't pass it to the app
+ return -1;
+ }
+ }
+ }
+
+ // Remember that home is pressed and handle special actions.
+ if (repeatCount == 0) {
+ mHomePressed = true;
+ if (mHomeDoubleTapPending) {
+ mHomeDoubleTapPending = false;
+ mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable);
+ handleDoubleTapOnHome();
+ // TODO(multi-display): Remove display id check once we support recents on
+ // multi-display
+ } else if (mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI
+ && mDisplayId == DEFAULT_DISPLAY) {
+ preloadRecentApps();
+ }
+ } else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {
+ if (!keyguardOn) {
+ handleLongPressOnHome(event.getDeviceId());
+ }
+ }
+ return -1;
+ }
+
+ private void handleDoubleTapOnHome() {
+ if (mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI) {
+ mHomeConsumed = true;
+ toggleRecentApps();
}
}
- };
+
+ private void handleLongPressOnHome(int deviceId) {
+ if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_NOTHING) {
+ return;
+ }
+ mHomeConsumed = true;
+ performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false,
+ "Home - Long Press");
+ switch (mLongPressOnHomeBehavior) {
+ case LONG_PRESS_HOME_ALL_APPS:
+ launchAllAppsAction();
+ break;
+ case LONG_PRESS_HOME_ASSIST:
+ launchAssistAction(null, deviceId);
+ break;
+ default:
+ Log.w(TAG, "Undefined home long press behavior: "
+ + mLongPressOnHomeBehavior);
+ break;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return String.format("mDisplayId = %d, mHomePressed = %b", mDisplayId, mHomePressed);
+ }
+ }
+
+ /** A DisplayHomeButtonHandler map indexed by display id */
+ private final SparseArray<DisplayHomeButtonHandler> mDisplayHomeButtonHandlers =
+ new SparseArray<>();
private boolean isRoundWindow() {
return mContext.getResources().getConfiguration().isScreenRound();
@@ -3259,6 +3365,7 @@
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
};
+ // TODO(b/117479243): handle it in InputPolicy
/** {@inheritDoc} */
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
@@ -3269,11 +3376,11 @@
final int flags = event.getFlags();
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final boolean canceled = event.isCanceled();
+ final int displayId = event.getDisplayId();
if (DEBUG_INPUT) {
Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
- + repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed
- + " canceled=" + canceled);
+ + repeatCount + " keyguardOn=" + keyguardOn + " canceled=" + canceled);
}
// If we think we might have a volume down & power key chord on the way
@@ -3358,71 +3465,12 @@
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {
-
- // If we have released the home key, and didn't do anything else
- // while it was pressed, then it is time to go home!
- if (!down) {
- cancelPreloadRecentApps();
-
- mHomePressed = false;
- if (mHomeConsumed) {
- mHomeConsumed = false;
- return -1;
- }
-
- if (canceled) {
- Log.i(TAG, "Ignoring HOME; event canceled.");
- return -1;
- }
-
- // Delay handling home if a double-tap is possible.
- if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_NOTHING) {
- mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable); // just in case
- mHomeDoubleTapPending = true;
- mHandler.postDelayed(mHomeDoubleTapTimeoutRunnable,
- ViewConfiguration.getDoubleTapTimeout());
- return -1;
- }
-
- handleShortPressOnHome();
- return -1;
+ DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
+ if (handler == null) {
+ handler = new DisplayHomeButtonHandler(displayId);
+ mDisplayHomeButtonHandlers.put(displayId, handler);
}
-
- // If a system window has focus, then it doesn't make sense
- // right now to interact with applications.
- WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
- if (attrs != null) {
- final int type = attrs.type;
- if (type == TYPE_KEYGUARD_DIALOG
- || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
- // the "app" is keyguard, so give it the key
- return 0;
- }
- final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;
- for (int i=0; i<typeCount; i++) {
- if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {
- // don't do anything, but also don't pass it to the app
- return -1;
- }
- }
- }
-
- // Remember that home is pressed and handle special actions.
- if (repeatCount == 0) {
- mHomePressed = true;
- if (mHomeDoubleTapPending) {
- mHomeDoubleTapPending = false;
- mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable);
- handleDoubleTapOnHome();
- } else if (mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI) {
- preloadRecentApps();
- }
- } else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {
- if (!keyguardOn) {
- handleLongPressOnHome(event.getDeviceId());
- }
- }
- return -1;
+ return handler.handleHomeButton(win, event);
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
// Hijack modified menu keys for debugging features
final int chordBug = KeyEvent.META_SHIFT_ON;
@@ -3820,6 +3868,7 @@
}
}
+ // TODO(b/117479243): handle it in InputPolicy
/** {@inheritDoc} */
@Override
public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) {
@@ -3862,7 +3911,7 @@
event.getAction(), fallbackAction.keyCode,
event.getRepeatCount(), fallbackAction.metaState,
event.getDeviceId(), event.getScanCode(),
- flags, event.getSource(), null);
+ flags, event.getSource(), event.getDisplayId(), null);
if (!interceptFallback(win, fallbackEvent, policyFlags)) {
fallbackEvent.recycle();
@@ -3991,8 +4040,12 @@
}
private void startActivityAsUser(Intent intent, UserHandle handle) {
+ startActivityAsUser(intent, null, handle);
+ }
+
+ private void startActivityAsUser(Intent intent, Bundle bundle, UserHandle handle) {
if (isUserSetupComplete()) {
- mContext.startActivityAsUser(intent, handle);
+ mContext.startActivityAsUser(intent, bundle, handle);
} else {
Slog.i(TAG, "Not starting activity because user setup is in progress: " + intent);
}
@@ -4067,15 +4120,16 @@
}
}
- void launchHomeFromHotKey() {
- launchHomeFromHotKey(true /* awakenFromDreams */, true /*respectKeyguard*/);
+ void launchHomeFromHotKey(int displayId) {
+ launchHomeFromHotKey(displayId, true /* awakenFromDreams */, true /*respectKeyguard*/);
}
/**
* A home key -> launch home action was detected. Take the appropriate action
* given the situation with the keyguard.
*/
- void launchHomeFromHotKey(final boolean awakenFromDreams, final boolean respectKeyguard) {
+ void launchHomeFromHotKey(int displayId, final boolean awakenFromDreams,
+ final boolean respectKeyguard) {
// Abort possibly stuck animations.
mHandler.post(mWindowManagerFuncs::triggerAnimationFailsafe);
@@ -4092,7 +4146,7 @@
@Override
public void onKeyguardExitResult(boolean success) {
if (success) {
- startDockOrHome(true /*fromHomeKey*/, awakenFromDreams);
+ startDockOrHome(displayId, true /*fromHomeKey*/, awakenFromDreams);
}
}
});
@@ -4113,7 +4167,7 @@
hideRecentApps(false, true);
} else {
// Otherwise, just launch Home
- startDockOrHome(true /*fromHomeKey*/, awakenFromDreams);
+ startDockOrHome(displayId, true /*fromHomeKey*/, awakenFromDreams);
}
}
@@ -5677,7 +5731,7 @@
mDefaultDisplayPolicy.setHdmiPlugged(plugged, true /* force */);
}
-
+ // TODO(b/117479243): handle it in InputPolicy
/** {@inheritDoc} */
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
@@ -5690,6 +5744,7 @@
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final boolean canceled = event.isCanceled();
final int keyCode = event.getKeyCode();
+ final int displayId = event.getDisplayId();
final boolean isInjected = (policyFlags & WindowManagerPolicy.FLAG_INJECTED) != 0;
@@ -6193,7 +6248,7 @@
return true;
}
-
+ // TODO(b/117479243): handle it in InputPolicy
/** {@inheritDoc} */
@Override
public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) {
@@ -7269,7 +7324,7 @@
return null;
}
- void startDockOrHome(boolean fromHomeKey, boolean awakenFromDreams) {
+ void startDockOrHome(int displayId, boolean fromHomeKey, boolean awakenFromDreams) {
try {
ActivityManager.getService().stopAppSwitches();
} catch (RemoteException e) {}
@@ -7299,8 +7354,13 @@
} else {
intent = mHomeIntent;
}
+ final Bundle bundle = getLaunchDisplayIdBundle(displayId);
+ startActivityAsUser(intent, bundle, UserHandle.CURRENT);
+ }
- startActivityAsUser(intent, UserHandle.CURRENT);
+ private @Nullable Bundle getLaunchDisplayIdBundle(int displayId) {
+ return (displayId == INVALID_DISPLAY) ? null
+ : ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle();
}
/**
@@ -7314,7 +7374,7 @@
}
if (false) {
// This code always brings home to the front.
- startDockOrHome(false /*fromHomeKey*/, true /* awakenFromDreams */);
+ startDockOrHome(DEFAULT_DISPLAY, false /*fromHomeKey*/, true /* awakenFromDreams */);
} else {
// This code brings home to the front or, if it is already
// at the front, puts the device to sleep.
@@ -7325,7 +7385,7 @@
} else {
ActivityManager.getService().stopAppSwitches();
sendCloseSystemWindows();
- Intent dock = createHomeDockIntent();
+ final Intent dock = createHomeDockIntent();
if (dock != null) {
int result = ActivityTaskManager.getService()
.startActivityAsUser(null, null, dock,
@@ -8013,7 +8073,13 @@
pw.print(incallBackBehaviorToString(mIncallBackBehavior));
pw.print(" mEndcallBehavior=");
pw.println(endcallBehaviorToString(mEndcallBehavior));
- pw.print(prefix); pw.print("mHomePressed="); pw.println(mHomePressed);
+ pw.print(prefix);
+ // TODO(b/117479243): handle it in InputPolicy
+ pw.print("mDisplayHomeButtonHandlers=");
+ for (int i = 0; i < mDisplayHomeButtonHandlers.size(); i++) {
+ final int key = mDisplayHomeButtonHandlers.keyAt(i);
+ pw.println(mDisplayHomeButtonHandlers.get(key));
+ }
pw.print(prefix); pw.print("mDockLayer="); pw.print(mDockLayer);
pw.print(" mStatusBarLayer="); pw.println(mStatusBarLayer);
pw.print(prefix); pw.print("mShowingDream="); pw.print(mShowingDream);
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index f32761e..6034f81 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -2626,8 +2626,7 @@
}
ActivityRecord getDefaultDisplayHomeActivityForUser(int userId) {
- getActivityDisplay(DEFAULT_DISPLAY).getHomeActivityForUser(userId);
- return null;
+ return getActivityDisplay(DEFAULT_DISPLAY).getHomeActivityForUser(userId);
}
void resizeStackLocked(ActivityStack stack, Rect bounds, Rect tempTaskBounds,
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 89193f7..433c05a 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -6267,8 +6267,11 @@
FLAG_ACTIVITY_TASK_ON_HOME);
ActivityOptions activityOptions = options != null
? new ActivityOptions(options) : ActivityOptions.makeBasic();
- activityOptions.setLaunchTaskId(
- mStackSupervisor.getDefaultDisplayHomeActivity().getTask().taskId);
+ final ActivityRecord homeActivity =
+ mStackSupervisor.getDefaultDisplayHomeActivity();
+ if (homeActivity != null) {
+ activityOptions.setLaunchTaskId(homeActivity.getTask().taskId);
+ }
mContext.startActivityAsUser(intent, activityOptions.toBundle(),
UserHandle.CURRENT);
} finally {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e364e9a..933eac6 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1627,7 +1627,7 @@
if (hasFeatureFace || hasFeatureIris || hasFeatureFingerprint) {
// Start this service after all biometric services.
- traceBeginAndSlog("StartBiometricPromptService");
+ traceBeginAndSlog("StartBiometricService");
mSystemServiceManager.startService(BiometricService.class);
traceEnd();
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 5a4c898..e6892be 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -16,9 +16,13 @@
package android.net.wifi.p2p;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
-import android.annotation.SystemService;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemApi;
+import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.net.wifi.WpsInfo;
@@ -480,6 +484,12 @@
/** @hide */
public static final int REPORT_NFC_HANDOVER_FAILED = BASE + 81;
+ /** @hide */
+ public static final int FACTORY_RESET = BASE + 82;
+ /** @hide */
+ public static final int FACTORY_RESET_FAILED = BASE + 83;
+ /** @hide */
+ public static final int FACTORY_RESET_SUCCEEDED = BASE + 84;
/**
* Create a new WifiP2pManager instance. Applications use
@@ -776,6 +786,7 @@
case STOP_LISTEN_FAILED:
case SET_CHANNEL_FAILED:
case REPORT_NFC_HANDOVER_FAILED:
+ case FACTORY_RESET_FAILED:
if (listener != null) {
((ActionListener) listener).onFailure(message.arg1);
}
@@ -802,6 +813,7 @@
case STOP_LISTEN_SUCCEEDED:
case SET_CHANNEL_SUCCEEDED:
case REPORT_NFC_HANDOVER_SUCCEEDED:
+ case FACTORY_RESET_SUCCEEDED:
if (listener != null) {
((ActionListener) listener).onSuccess();
}
@@ -1521,4 +1533,21 @@
c.mAsyncChannel.sendMessage(RESPONDER_REPORT_NFC_HANDOVER, 0,
c.putListener(listener), bundle);
}
+
+ /**
+ * Removes all saved p2p groups.
+ * @param c is the channel created at {@link #initialize}.
+ * @param listener for callback on success or failure. Can be null.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
+ public void factoryReset(@NonNull Channel c, @Nullable ActionListener listener) {
+ checkChannel(c);
+ Bundle callingPackage = new Bundle();
+ callingPackage.putString(CALLING_PACKAGE, c.mContext.getOpPackageName());
+ c.mAsyncChannel.sendMessage(FACTORY_RESET, 0, c.putListener(listener),
+ callingPackage);
+ }
+
}
diff --git a/wifi/java/com/android/server/wifi/AbstractWifiService.java b/wifi/java/com/android/server/wifi/AbstractWifiService.java
new file mode 100644
index 0000000..eede23b
--- /dev/null
+++ b/wifi/java/com/android/server/wifi/AbstractWifiService.java
@@ -0,0 +1,415 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") {
+ * throw new UnsupportedOperationException();
+ }
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi;
+
+import android.content.pm.ParceledListSlice;
+import android.net.DhcpInfo;
+import android.net.Network;
+import android.net.wifi.INetworkRequestMatchCallback;
+import android.net.wifi.ISoftApCallback;
+import android.net.wifi.ITrafficStateCallback;
+import android.net.wifi.IWifiManager;
+import android.net.wifi.PasspointManagementObjectDefinition;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiActivityEnergyInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.hotspot2.IProvisioningCallback;
+import android.net.wifi.hotspot2.OsuProvider;
+import android.net.wifi.hotspot2.PasspointConfiguration;
+import android.os.IBinder;
+import android.os.Messenger;
+import android.os.ResultReceiver;
+import android.os.WorkSource;
+import android.util.Slog;
+
+import java.util.List;
+
+/**
+ * Abstract class implementing IWifiManager with stub methods throwing runtime exceptions.
+ *
+ * This class is meant to be extended by real implementations of IWifiManager in order to facilitate
+ * cross-repo changes to WiFi internal APIs, including the introduction of new APIs, the removal of
+ * deprecated APIs, or the migration of existing API signatures.
+ *
+ * When an existing API is scheduled for removal, it can be removed from IWifiManager.aidl
+ * immediately and marked as @Deprecated first in this class. Children inheriting this class are
+ * then given a short grace period to update themselves before the @Deprecated stub is removed for
+ * good. If the API scheduled for removal has a replacement or an overload (signature change),
+ * these should be introduced before the stub is removed to allow children to migrate.
+ */
+public abstract class AbstractWifiService extends IWifiManager.Stub {
+
+ private static final String TAG = AbstractWifiService.class.getSimpleName();
+
+ @Override
+ public int getSupportedFeatures() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public WifiActivityEnergyInfo reportActivityInfo() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void requestActivityInfo(ResultReceiver result) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public ParceledListSlice getConfiguredNetworks() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public ParceledListSlice getPrivilegedConfiguredNetworks() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public WifiConfiguration getMatchingWifiConfig(ScanResult scanResult) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<WifiConfiguration> getAllMatchingWifiConfigs(ScanResult scanResult) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<OsuProvider> getMatchingOsuProviders(ScanResult scanResult) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int addOrUpdateNetwork(WifiConfiguration config, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean addOrUpdatePasspointConfiguration(
+ PasspointConfiguration config, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean removePasspointConfiguration(String fqdn, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<PasspointConfiguration> getPasspointConfigurations() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void queryPasspointIcon(long bssid, String fileName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int matchProviderWithCurrentNetwork(String fqdn) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void deauthenticateNetwork(long holdoff, boolean ess) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean removeNetwork(int netId, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean enableNetwork(int netId, boolean disableOthers, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean disableNetwork(int netId, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean startScan(String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ScanResult> getScanResults(String callingPackage) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void disconnect(String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void reconnect(String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void reassociate(String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public WifiInfo getConnectionInfo(String callingPackage) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean setWifiEnabled(String packageName, boolean enable) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int getWifiEnabledState() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setCountryCode(String country) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getCountryCode() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isDualBandSupported() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean needs5GHzToAnyApBandConversion() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public DhcpInfo getDhcpInfo() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isScanAlwaysAvailable() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean acquireWifiLock(IBinder lock, int lockType, String tag, WorkSource ws) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void updateWifiLockWorkSource(IBinder lock, WorkSource ws) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean releaseWifiLock(IBinder lock) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void initializeMulticastFiltering() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isMulticastEnabled() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void acquireMulticastLock(IBinder binder, String tag) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void releaseMulticastLock(String tag) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void updateInterfaceIpState(String ifaceName, int mode) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean startSoftAp(WifiConfiguration wifiConfig) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean stopSoftAp() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int startLocalOnlyHotspot(Messenger messenger, IBinder binder, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void stopLocalOnlyHotspot() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void startWatchLocalOnlyHotspot(Messenger messenger, IBinder binder) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void stopWatchLocalOnlyHotspot() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int getWifiApEnabledState() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public WifiConfiguration getWifiApConfiguration() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean setWifiApConfiguration(WifiConfiguration wifiConfig, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void notifyUserOfApBandConversion(String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Messenger getWifiServiceMessenger(String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void enableTdls(String remoteIPAddress, boolean enable) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void enableTdlsWithMacAddress(String remoteMacAddress, boolean enable) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getCurrentNetworkWpsNfcConfigurationToken() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void enableVerboseLogging(int verbose) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int getVerboseLoggingLevel() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void enableWifiConnectivityManager(boolean enabled) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void disableEphemeralNetwork(String SSID, String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void factoryReset(String packageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Network getCurrentNetwork() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public byte[] retrieveBackupData() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void restoreBackupData(byte[] data) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void restoreSupplicantBackupData(byte[] supplicantData, byte[] ipConfigData) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void startSubscriptionProvisioning(
+ OsuProvider provider, IProvisioningCallback callback) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void registerSoftApCallback(
+ IBinder binder, ISoftApCallback callback, int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void unregisterSoftApCallback(int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void registerTrafficStateCallback(
+ IBinder binder, ITrafficStateCallback callback, int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void unregisterTrafficStateCallback(int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void registerNetworkRequestMatchCallback(
+ IBinder binder, INetworkRequestMatchCallback callback, int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void unregisterNetworkRequestMatchCallback(int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
+}