Merge "Radio Interface changes to pass the encryption object, including the key,to the modem." into oc-dr1-dev
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 7dc72db7..f02c45c 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -17,24 +17,25 @@
package android.provider;
import static com.google.android.collect.Sets.newHashSet;
+
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
+
import static java.lang.reflect.Modifier.isFinal;
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;
-import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
/** Tests that ensure appropriate settings are backed up. */
@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -446,6 +447,8 @@
Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH,
Settings.Secure.MULTI_PRESS_TIMEOUT,
Settings.Secure.NFC_PAYMENT_FOREGROUND,
+ Settings.Secure.NIGHT_DISPLAY_ACTIVATED,
+ Settings.Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
Settings.Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME,
Settings.Secure.PACKAGE_VERIFIER_STATE,
Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT,
diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java
index 0a1de33..2b5ac5e 100644
--- a/media/java/android/media/AudioManagerInternal.java
+++ b/media/java/android/media/AudioManagerInternal.java
@@ -59,4 +59,15 @@
int getRingerModeAffectedStreams(int streams);
}
+
+ /**
+ * Disable or restore the ability to play audio for a given UID.
+ * When a UID isn't meant to be tracked anymore (e.g. client died), re-enable audio for this UID
+ * to prevent disabling audio for future UIDs that would reuse the same value.
+ * This operation is asynchronous.
+ * @param disable when true, prevents playback of audio streams from the given uid. If false,
+ * restores the ability to play, or no-op if playback hadn't been disabled before.
+ * @param uid the client UID whose ability to play will be affected.
+ */
+ public abstract void disableAudioForUid(boolean disable, int uid);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
index 924a82f..426dc7c 100755
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
@@ -281,6 +281,7 @@
mIconTint = fillColor;
mFramePaint.setColor(backgroundColor);
mBoltPaint.setColor(fillColor);
+ mPlusPaint.setColor(fillColor);
mChargeColor = fillColor;
invalidateSelf();
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java
index aa92fa4..01df0ec 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java
@@ -13,6 +13,7 @@
import org.junit.runner.RunWith;
import static com.google.common.truth.Truth.assertThat;
+import static junit.framework.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyFloat;
import static org.mockito.Matchers.anyString;
@@ -101,4 +102,17 @@
private boolean isRectZero(Rect r) {
return r.left == 0 && r.top == 0 && r.right == 0 && r.bottom == 0;
}
+
+ @Test
+ public void testPlusPaint_isEqualToBoltPaint() {
+ // Before setting color
+ assertTrue(mBatteryDrawable.mPlusPaint.hasEqualAttributes(mBatteryDrawable.mBoltPaint));
+
+ final int fakeFillColor = 123;
+ final int fakeBackgrundColor = 456;
+
+ // After
+ mBatteryDrawable.setColors(fakeFillColor, fakeBackgrundColor);
+ assertTrue(mBatteryDrawable.mPlusPaint.hasEqualAttributes(mBatteryDrawable.mBoltPaint));
+ }
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 1e171d3..8abdc64 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -37,10 +37,12 @@
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArraySet;
+import android.util.Slog;
import java.util.Locale;
public class SettingsHelper {
+ private static final String TAG = "SettingsHelper";
private static final String SILENT_RINGTONE = "_silent";
private Context mContext;
private AudioManager mAudioManager;
@@ -324,11 +326,17 @@
*/
void setLocaleData(byte[] data, int size) {
// Check if locale was set by the user:
- Configuration conf = mContext.getResources().getConfiguration();
- // TODO: The following is not working as intended because the network is forcing a locale
- // change after registering. Need to find some other way to detect if the user manually
- // changed the locale
- if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard
+ final ContentResolver cr = mContext.getContentResolver();
+ final boolean userSetLocale = mContext.getResources().getConfiguration().userSetLocale;
+ final boolean provisioned = Settings.Global.getInt(cr,
+ Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+ if (userSetLocale || provisioned) {
+ // Don't change if user set it in the SetupWizard, or if this is a post-setup
+ // deferred restore operation
+ Slog.i(TAG, "Not applying restored locale; "
+ + (userSetLocale ? "user already specified" : "device already provisioned"));
+ return;
+ }
final String[] availableLocales = mContext.getAssets().getLocales();
// Replace "_" with "-" to deal with older backups.
diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml
index 2bf4d9c..a621c7c 100644
--- a/packages/SystemUI/res/layout/navigation_layout.xml
+++ b/packages/SystemUI/res/layout/navigation_layout.xml
@@ -18,7 +18,11 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:layout_marginStart="@dimen/rounded_corner_content_padding"
+ android:layout_marginEnd="@dimen/rounded_corner_content_padding"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp">
<FrameLayout
android:id="@+id/nav_buttons"
diff --git a/packages/SystemUI/res/layout/navigation_layout_rot90.xml b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
index 7601efc..bf48c7f 100644
--- a/packages/SystemUI/res/layout/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
@@ -18,7 +18,11 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:layout_marginTop="@dimen/rounded_corner_content_padding"
+ android:layout_marginBottom="@dimen/rounded_corner_content_padding"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp">
<FrameLayout
android:id="@+id/nav_buttons"
diff --git a/packages/SystemUI/res/values-sw372dp/config.xml b/packages/SystemUI/res/values-sw372dp/config.xml
new file mode 100644
index 0000000..07b797a
--- /dev/null
+++ b/packages/SystemUI/res/values-sw372dp/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** 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.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources>
+ <!-- Nav bar button default ordering/layout -->
+ <string name="config_navBarLayout" translatable="false">left[.25W],back[.5WC];home;recent[.5WC],right[.25W]</string>
+</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 74b0702..2ad6f2d 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -293,7 +293,7 @@
<string name="config_systemUIFactoryComponent" translatable="false">com.android.systemui.SystemUIFactory</string>
<!-- Nav bar button default ordering/layout -->
- <string name="config_navBarLayout" translatable="false">left,back;home;recent,right</string>
+ <string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string>
<bool name="quick_settings_show_full_alarm">false</bool>
diff --git a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
index 6132540..74a1505 100644
--- a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
+++ b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
@@ -98,14 +98,6 @@
TunablePadding.addTunablePadding(statusBar.findViewById(R.id.keyguard_header), PADDING,
padding, FLAG_END);
- View navigationBarWindow = sb.getNavigationBarWindow();
- // Not all devices have on screen navigation bars.
- if (navigationBarWindow != null) {
- FragmentHostManager.get(navigationBarWindow).addTagListener(
- NavigationBarFragment.TAG,
- new TunablePaddingTagListener(padding, 0));
- }
-
FragmentHostManager fragmentHostManager = FragmentHostManager.get(statusBar);
fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG,
new TunablePaddingTagListener(padding, R.id.status_bar));
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index ae936db..1ece5fc 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -158,13 +158,16 @@
break;
case DOZE:
case DOZE_AOD:
- case DOZE_AOD_PAUSED:
mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE);
mDozeSensors.setListening(true);
if (oldState != DozeMachine.State.INITIALIZED) {
mDozeSensors.reregisterAllSensors();
}
break;
+ case DOZE_AOD_PAUSED:
+ mDozeSensors.setProxListening(true);
+ mDozeSensors.setListening(false);
+ break;
case DOZE_PULSING:
mDozeSensors.setProxListening(true);
break;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index 720ca14..a14d1bc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -19,9 +19,11 @@
import android.content.res.Configuration;
import android.graphics.drawable.Icon;
import android.util.AttributeSet;
+import android.util.Log;
import android.util.SparseArray;
import android.view.Display;
import android.view.Display.Mode;
+import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -43,6 +45,8 @@
import java.util.List;
import java.util.Objects;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+
public class NavigationBarInflaterView extends FrameLayout
implements Tunable, PluginListener<NavBarButtonProvider> {
@@ -71,6 +75,8 @@
public static final String KEY_CODE_START = "(";
public static final String KEY_IMAGE_DELIM = ":";
public static final String KEY_CODE_END = ")";
+ private static final String WEIGHT_SUFFIX = "W";
+ private static final String WEIGHT_CENTERED_SUFFIX = "WC";
private final List<NavBarButtonProvider> mPlugins = new ArrayList<>();
@@ -219,26 +225,27 @@
String[] center = sets[1].split(BUTTON_SEPARATOR);
String[] end = sets[2].split(BUTTON_SEPARATOR);
// Inflate these in start to end order or accessibility traversal will be messed up.
- inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape);
- inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape);
+ inflateButtons(start, mRot0.findViewById(R.id.ends_group), isRot0Landscape, true);
+ inflateButtons(start, mRot90.findViewById(R.id.ends_group), !isRot0Landscape, true);
- inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), isRot0Landscape);
- inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), !isRot0Landscape);
+ inflateButtons(center, mRot0.findViewById(R.id.center_group), isRot0Landscape, false);
+ inflateButtons(center, mRot90.findViewById(R.id.center_group), !isRot0Landscape, false);
- addGravitySpacer((LinearLayout) mRot0.findViewById(R.id.ends_group));
- addGravitySpacer((LinearLayout) mRot90.findViewById(R.id.ends_group));
+ addGravitySpacer(mRot0.findViewById(R.id.ends_group));
+ addGravitySpacer(mRot90.findViewById(R.id.ends_group));
- inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape);
- inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape);
+ inflateButtons(end, mRot0.findViewById(R.id.ends_group), isRot0Landscape, false);
+ inflateButtons(end, mRot90.findViewById(R.id.ends_group), !isRot0Landscape, false);
}
private void addGravitySpacer(LinearLayout layout) {
layout.addView(new Space(mContext), new LinearLayout.LayoutParams(0, 0, 1));
}
- private void inflateButtons(String[] buttons, ViewGroup parent, boolean landscape) {
+ private void inflateButtons(String[] buttons, ViewGroup parent, boolean landscape,
+ boolean start) {
for (int i = 0; i < buttons.length; i++) {
- inflateButton(buttons[i], parent, landscape);
+ inflateButton(buttons[i], parent, landscape, start);
}
}
@@ -251,16 +258,13 @@
}
@Nullable
- protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape) {
+ protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape,
+ boolean start) {
LayoutInflater inflater = landscape ? mLandscapeInflater : mLayoutInflater;
- float size = extractSize(buttonSpec);
- View v = createView(buttonSpec, parent, inflater, landscape);
+ View v = createView(buttonSpec, parent, inflater);
if (v == null) return null;
- if (size != 0) {
- ViewGroup.LayoutParams params = v.getLayoutParams();
- params.width = (int) (params.width * size);
- }
+ v = applySize(v, buttonSpec, landscape, start);
parent.addView(v);
addToDispatchers(v);
View lastView = landscape ? mLastLandscape : mLastPortrait;
@@ -275,16 +279,41 @@
return v;
}
- private View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater,
- boolean landscape) {
+ private View applySize(View v, String buttonSpec, boolean landscape, boolean start) {
+ String sizeStr = extractSize(buttonSpec);
+ if (sizeStr == null) return v;
+
+ if (sizeStr.contains(WEIGHT_SUFFIX)) {
+ float weight = Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX)));
+ FrameLayout frame = new FrameLayout(mContext);
+ LayoutParams childParams = new LayoutParams(v.getLayoutParams());
+ if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) {
+ childParams.gravity = Gravity.CENTER;
+ } else {
+ childParams.gravity = landscape ? (start ? Gravity.BOTTOM : Gravity.TOP)
+ : (start ? Gravity.START : Gravity.END);
+ }
+ frame.addView(v, childParams);
+ frame.setLayoutParams(new LinearLayout.LayoutParams(0, MATCH_PARENT, weight));
+ frame.setClipChildren(false);
+ frame.setClipToPadding(false);
+ return frame;
+ }
+ float size = Float.parseFloat(sizeStr);
+ ViewGroup.LayoutParams params = v.getLayoutParams();
+ params.width = (int) (params.width * size);
+ return v;
+ }
+
+ private View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater) {
View v = null;
String button = extractButton(buttonSpec);
if (LEFT.equals(button)) {
- buttonSpec = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, NAVSPACE);
- button = extractButton(buttonSpec);
+ String s = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, NAVSPACE);
+ button = extractButton(s);
} else if (RIGHT.equals(button)) {
- buttonSpec = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME);
- button = extractButton(buttonSpec);
+ String s = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME);
+ button = extractButton(s);
}
// Let plugins go first so they can override a standard view if they want.
for (NavBarButtonProvider provider : mPlugins) {
@@ -340,13 +369,12 @@
return Integer.parseInt(subStr);
}
- public static float extractSize(String buttonSpec) {
+ public static String extractSize(String buttonSpec) {
if (!buttonSpec.contains(SIZE_MOD_START)) {
- return 1;
+ return null;
}
final int sizeStart = buttonSpec.indexOf(SIZE_MOD_START);
- String sizeStr = buttonSpec.substring(sizeStart + 1, buttonSpec.indexOf(SIZE_MOD_END));
- return Float.parseFloat(sizeStr);
+ return buttonSpec.substring(sizeStart + 1, buttonSpec.indexOf(SIZE_MOD_END));
}
public static String extractButton(String buttonSpec) {
@@ -379,8 +407,8 @@
mButtonDispatchers.valueAt(i).clear();
}
}
- clearAllChildren((ViewGroup) mRot0.findViewById(R.id.nav_buttons));
- clearAllChildren((ViewGroup) mRot90.findViewById(R.id.nav_buttons));
+ clearAllChildren(mRot0.findViewById(R.id.nav_buttons));
+ clearAllChildren(mRot90.findViewById(R.id.nav_buttons));
}
private void clearAllChildren(ViewGroup group) {
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index f1f8757..e3da4eb 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -5688,13 +5688,15 @@
PerformFullTransportBackupTask pftbt = null;
synchronized (mQueueLock) {
if (mRunningFullBackupTask != null) {
- if (DEBUG_SCHEDULING) {
- Slog.i(TAG, "Telling running backup to stop");
- }
pftbt = mRunningFullBackupTask;
}
}
- pftbt.handleCancel(true);
+ if (pftbt != null) {
+ if (DEBUG_SCHEDULING) {
+ Slog.i(TAG, "Telling running backup to stop");
+ }
+ pftbt.handleCancel(true);
+ }
}
};
new Thread(endFullBackupRunnable, "end-full-backup").start();
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index e5ab784..2199bba 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -239,6 +239,7 @@
private static final int MSG_SET_A2DP_SRC_CONNECTION_STATE = 101;
private static final int MSG_SET_A2DP_SINK_CONNECTION_STATE = 102;
private static final int MSG_A2DP_DEVICE_CONFIG_CHANGE = 103;
+ private static final int MSG_DISABLE_AUDIO_FOR_UID = 104;
// end of messages handled under wakelock
private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000;
@@ -4871,6 +4872,12 @@
mAudioEventWakeLock.release();
break;
+ case MSG_DISABLE_AUDIO_FOR_UID:
+ mPlaybackMonitor.disableAudioForUid( msg.arg1 == 1 /* disable */,
+ msg.arg2 /* uid */);
+ mAudioEventWakeLock.release();
+ break;
+
case MSG_REPORT_NEW_ROUTES: {
int N = mRoutesObservers.beginBroadcast();
if (N > 0) {
@@ -6591,6 +6598,13 @@
}
}
}
+
+ @Override
+ public void disableAudioForUid(boolean disable, int uid) {
+ queueMsgUnderWakeLock(mAudioHandler, MSG_DISABLE_AUDIO_FOR_UID,
+ disable ? 1 : 0 /* arg1 */, uid /* arg2 */,
+ null /* obj */, 0 /* delay */);
+ }
}
//==========================================================================================
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index f9e4d94..663559f 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -95,6 +95,43 @@
}
//=================================================================
+ private final ArrayList<Integer> mBannedUids = new ArrayList<Integer>();
+
+ // see AudioManagerInternal.disableAudioForUid(boolean disable, int uid)
+ public void disableAudioForUid(boolean disable, int uid) {
+ synchronized(mPlayerLock) {
+ final int index = mBannedUids.indexOf(new Integer(uid));
+ if (index >= 0) {
+ if (!disable) {
+ mBannedUids.remove(index);
+ // nothing else to do, future playback requests from this uid are ok
+ } // no else to handle, uid already present, so disabling again is no-op
+ } else {
+ if (disable) {
+ for (AudioPlaybackConfiguration apc : mPlayers.values()) {
+ checkBanPlayer(apc, uid);
+ }
+ mBannedUids.add(new Integer(uid));
+ } // no else to handle, uid already not in list, so enabling again is no-op
+ }
+ }
+ }
+
+ private boolean checkBanPlayer(@NonNull AudioPlaybackConfiguration apc, int uid) {
+ final boolean toBan = (apc.getClientUid() == uid);
+ if (toBan) {
+ final int piid = apc.getPlayerInterfaceId();
+ try {
+ Log.v(TAG, "banning player " + piid + " uid:" + uid);
+ apc.getPlayerProxy().pause();
+ } catch (Exception e) {
+ Log.e(TAG, "error banning player " + piid + " uid:" + uid, e);
+ }
+ }
+ return toBan;
+ }
+
+ //=================================================================
// Track players and their states
// methods playerAttributes, playerEvent, releasePlayer are all oneway calls
// into AudioService. They trigger synchronous dispatchPlaybackChange() which updates
@@ -137,6 +174,14 @@
if (apc == null) {
return;
}
+ if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) {
+ for (Integer uidInteger: mBannedUids) {
+ if (checkBanPlayer(apc, uidInteger.intValue())) {
+ // player was banned, do not update its state
+ return;
+ }
+ }
+ }
if (apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
// FIXME SoundPool not ready for state reporting
return;
@@ -186,10 +231,17 @@
pw.println("\n ducked players:");
mDuckingManager.dump(pw);
// players muted due to the device ringing or being in a call
- pw.println("\n muted player piids:");
+ pw.print("\n muted player piids:");
for (int piid : mMutedPlayers) {
- pw.println(" " + piid);
+ pw.print(" " + piid);
}
+ pw.println();
+ // banned players:
+ pw.print("\n banned uids:");
+ for (int uid : mBannedUids) {
+ pw.print(" " + uid);
+ }
+ pw.println();
}
}
diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
index 5339bac..370e569 100644
--- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
+++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
@@ -79,7 +79,7 @@
}
if (!authenticated) {
if (receiver != null) {
- FingerprintUtils.vibrateFingerprintError(getContext());
+ vibrateError();
}
// allow system-defined limit of number of attempts before giving up
int lockoutMode = handleFailedAttempt();
@@ -99,7 +99,7 @@
result |= lockoutMode != LOCKOUT_NONE; // in a lockout mode
} else {
if (receiver != null) {
- FingerprintUtils.vibrateFingerprintSuccess(getContext());
+ vibrateSuccess();
}
result |= true; // we have a valid fingerprint, done
resetFailedAttempts();
diff --git a/services/core/java/com/android/server/fingerprint/ClientMonitor.java b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
index 1a2e144..3eae157 100644
--- a/services/core/java/com/android/server/fingerprint/ClientMonitor.java
+++ b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
@@ -23,6 +23,8 @@
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.util.Slog;
import java.util.NoSuchElementException;
@@ -36,14 +38,18 @@
protected static final String TAG = FingerprintService.TAG; // TODO: get specific name
protected static final int ERROR_ESRCH = 3; // Likely fingerprint HAL is dead. See errno.h.
protected static final boolean DEBUG = FingerprintService.DEBUG;
+ private static final long[] DEFAULT_SUCCESS_VIBRATION_PATTERN = new long[] {0, 30};
+ private final Context mContext;
+ private final long mHalDeviceId;
+ private final int mTargetUserId;
+ private final int mGroupId;
+ // True if client does not have MANAGE_FINGERPRINT permission
+ private final boolean mIsRestricted;
+ private final String mOwner;
+ private final VibrationEffect mSuccessVibrationEffect;
+ private final VibrationEffect mErrorVibrationEffect;
private IBinder mToken;
private IFingerprintServiceReceiver mReceiver;
- private int mTargetUserId;
- private int mGroupId;
- private boolean mIsRestricted; // True if client does not have MANAGE_FINGERPRINT permission
- private String mOwner;
- private Context mContext;
- private long mHalDeviceId;
protected boolean mAlreadyCancelled;
/**
@@ -68,6 +74,8 @@
mGroupId = groupId;
mIsRestricted = restricted;
mOwner = owner;
+ mSuccessVibrationEffect = getSuccessVibrationEffect(context);
+ mErrorVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
try {
if (token != null) {
token.linkToDeath(this, 0);
@@ -79,7 +87,7 @@
/**
* Contacts fingerprint HAL to start the client.
- * @return 0 on succes, errno from driver on failure
+ * @return 0 on success, errno from driver on failure
*/
public abstract int start();
@@ -211,4 +219,39 @@
public final IBinder getToken() {
return mToken;
}
+
+ public final void vibrateSuccess() {
+ Vibrator vibrator = mContext.getSystemService(Vibrator.class);
+ if (vibrator != null) {
+ vibrator.vibrate(mSuccessVibrationEffect);
+ }
+ }
+
+ public final void vibrateError() {
+ Vibrator vibrator = mContext.getSystemService(Vibrator.class);
+ if (vibrator != null) {
+ vibrator.vibrate(mErrorVibrationEffect);
+ }
+ }
+
+ private static VibrationEffect getSuccessVibrationEffect(Context ctx) {
+ int[] arr = ctx.getResources().getIntArray(
+ com.android.internal.R.array.config_longPressVibePattern);
+ final long[] vibePattern;
+ if (arr == null || arr.length == 0) {
+ vibePattern = DEFAULT_SUCCESS_VIBRATION_PATTERN;
+ } else {
+ vibePattern = new long[arr.length];
+ for (int i = 0; i < arr.length; i++) {
+ vibePattern[i] = arr[i];
+ }
+ }
+ if (vibePattern.length == 1) {
+ return VibrationEffect.createOneShot(
+ vibePattern[0], VibrationEffect.DEFAULT_AMPLITUDE);
+ } else {
+ return VibrationEffect.createWaveform(vibePattern, -1);
+ }
+ }
+
}
diff --git a/services/core/java/com/android/server/fingerprint/EnrollClient.java b/services/core/java/com/android/server/fingerprint/EnrollClient.java
index 6170894..c9efcf2 100644
--- a/services/core/java/com/android/server/fingerprint/EnrollClient.java
+++ b/services/core/java/com/android/server/fingerprint/EnrollClient.java
@@ -65,7 +65,7 @@
if (receiver == null)
return true; // client not listening
- FingerprintUtils.vibrateFingerprintSuccess(getContext());
+ vibrateSuccess();
MetricsLogger.action(getContext(), MetricsEvent.ACTION_FINGERPRINT_ENROLL);
try {
receiver.onEnrollResult(getHalDeviceId(), fpId, groupId, remaining);
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java b/services/core/java/com/android/server/fingerprint/FingerprintUtils.java
index 49dc8e4..5fbd735 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintUtils.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.hardware.fingerprint.Fingerprint;
-import android.os.Vibrator;
import android.text.TextUtils;
import android.util.SparseArray;
@@ -31,9 +30,6 @@
*/
public class FingerprintUtils {
- private static final long[] FP_ERROR_VIBRATE_PATTERN = new long[] {0, 30, 100, 30};
- private static final long[] FP_SUCCESS_VIBRATE_PATTERN = new long[] {0, 30};
-
private static final Object sInstanceLock = new Object();
private static FingerprintUtils sInstance;
@@ -72,20 +68,6 @@
getStateForUser(ctx, userId).renameFingerprint(fingerId, name);
}
- public static void vibrateFingerprintError(Context context) {
- Vibrator vibrator = context.getSystemService(Vibrator.class);
- if (vibrator != null) {
- vibrator.vibrate(FP_ERROR_VIBRATE_PATTERN, -1);
- }
- }
-
- public static void vibrateFingerprintSuccess(Context context) {
- Vibrator vibrator = context.getSystemService(Vibrator.class);
- if (vibrator != null) {
- vibrator.vibrate(FP_SUCCESS_VIBRATE_PATTERN, -1);
- }
- }
-
private FingerprintsUserState getStateForUser(Context ctx, int userId) {
synchronized (this) {
FingerprintsUserState state = mUsers.get(userId);
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index f3a292b..20d7b28 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -1018,7 +1018,7 @@
throw new RuntimeException(e.getMessage(), e);
}
try {
- ResolveInfo ri = mInterface.resolveIntent(intent, null, 0, mTargetUser);
+ ResolveInfo ri = mInterface.resolveIntent(intent, intent.getType(), 0, mTargetUser);
PrintWriter pw = getOutPrintWriter();
if (ri == null) {
pw.println("No activity found");
@@ -1040,7 +1040,7 @@
throw new RuntimeException(e.getMessage(), e);
}
try {
- List<ResolveInfo> result = mInterface.queryIntentActivities(intent, null, 0,
+ List<ResolveInfo> result = mInterface.queryIntentActivities(intent, intent.getType(), 0,
mTargetUser).getList();
PrintWriter pw = getOutPrintWriter();
if (result == null || result.size() <= 0) {
@@ -1074,7 +1074,7 @@
throw new RuntimeException(e.getMessage(), e);
}
try {
- List<ResolveInfo> result = mInterface.queryIntentServices(intent, null, 0,
+ List<ResolveInfo> result = mInterface.queryIntentServices(intent, intent.getType(), 0,
mTargetUser).getList();
PrintWriter pw = getOutPrintWriter();
if (result == null || result.size() <= 0) {
@@ -1108,7 +1108,7 @@
throw new RuntimeException(e.getMessage(), e);
}
try {
- List<ResolveInfo> result = mInterface.queryIntentReceivers(intent, null, 0,
+ List<ResolveInfo> result = mInterface.queryIntentReceivers(intent, intent.getType(), 0,
mTargetUser).getList();
PrintWriter pw = getOutPrintWriter();
if (result == null || result.size() <= 0) {