diff options
19 files changed, 779 insertions, 158 deletions
diff --git a/api/current.txt b/api/current.txt index 9c851e96ffcf..dc383fdb3176 100755 --- a/api/current.txt +++ b/api/current.txt @@ -14993,7 +14993,7 @@ package android.graphics.drawable { 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 d8f7f4a1ad10..da1adac5bddf 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3832,6 +3832,14 @@ package android.net.wifi.aware { } +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 e95f9abed908..713f752fc45b 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -857,11 +857,17 @@ final class SystemServiceRegistry { @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 fe006045bf0f..ff58c7525a3a 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -22,6 +22,7 @@ import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL; 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 @@ public class BiometricManager { 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 class BiometricManager { public BiometricManager(Context context, IBiometricService service) { mContext = context; mService = service; + + mHasHardware = hasBiometrics(context); } /** @@ -93,8 +109,12 @@ public class BiometricManager { 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 f1f4b0c89bab..8e4de9f11334 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4895,6 +4895,7 @@ public final class Settings { 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 @@ public final class Settings { "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 54333938c52d..3a908dc28e4c 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -64,5 +64,8 @@ enum PageId { // 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 d5dc9034ef85..3342266c1dfd 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -497,6 +497,7 @@ public class SettingsBackupTest { 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 e1f726320839..caf610b8c236 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -934,11 +934,13 @@ public abstract class Drawable { * 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 8fee822f11c0..6f437bd5d96f 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 @@ public class NotificationEntry { 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 @@ public class NotificationEntry { } 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 37a98fd1dd6c..b2fc41783516 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.NonNull; 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 @@ public class SmartActionsHelper { 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 @@ public class SmartActionsHelper { 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 @@ public class SmartActionsHelper { } 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; + } + // 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 entry.hasInlineReply(); + 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 dd8bfda43ff9..92fd86894d56 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 final class CategoryKey { 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 ddd0c2cd2531..a947ea1e6b0f 100644 --- a/proto/src/metrics_constants/metrics_constants.proto +++ b/proto/src/metrics_constants/metrics_constants.proto @@ -2832,7 +2832,7 @@ message MetricsEvent { // 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 @@ message MetricsEvent { // 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 5fa667adb16e..b7889357ea25 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 @@ public class PermissionManagerService { // 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 1dae396af76d..97af04524d5a 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.M; 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 static com.android.server.wm.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { SleepToken mDreamingSleepToken; SleepToken mScreenOffSleepToken; volatile boolean mKeyguardOccluded; - boolean mHomePressed; - boolean mHomeConsumed; - boolean mHomeDoubleTapPending; Intent mHomeIntent; Intent mCarDockIntent; Intent mDeskDockIntent; @@ -865,7 +864,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } // Go home! - launchHomeFromHotKey(); + launchHomeFromHotKey(displayId); } /** @@ -1745,26 +1746,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { // 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; - } - - // 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()); - } + DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId); + if (handler == null) { + handler = new DisplayHomeButtonHandler(displayId); + mDisplayHomeButtonHandlers.put(displayId, handler); } - 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + // TODO(b/117479243): handle it in InputPolicy /** {@inheritDoc} */ @Override public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) { @@ -3862,7 +3911,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void onKeyguardExitResult(boolean success) { if (success) { - startDockOrHome(true /*fromHomeKey*/, awakenFromDreams); + startDockOrHome(displayId, true /*fromHomeKey*/, awakenFromDreams); } } }); @@ -4113,7 +4167,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { hideRecentApps(false, true); } else { // Otherwise, just launch Home - startDockOrHome(true /*fromHomeKey*/, awakenFromDreams); + startDockOrHome(displayId, true /*fromHomeKey*/, awakenFromDreams); } } @@ -5677,7 +5731,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { return true; } - + // TODO(b/117479243): handle it in InputPolicy /** {@inheritDoc} */ @Override public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) { @@ -7269,7 +7324,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 f32761e27800..6034f81f9cc8 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 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } 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 89193f76a538..433c05a8693d 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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { 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 e364e9a1d876..933eac682b54 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1627,7 +1627,7 @@ public final class SystemServer { 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 5a4c898c0bcd..e6892bea4595 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 @@ public class WifiP2pManager { /** @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 @@ public class WifiP2pManager { 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 @@ public class WifiP2pManager { 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 @@ public class WifiP2pManager { 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 000000000000..eede23b22387 --- /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(); + } +} |