release-request-999b130a-24cf-4106-967e-4713076535ff-for-git_pi-release-4257729 snap-temp-L14600000090822884
Change-Id: Id38c05239a42d3f5aa92e2d126b24f93e33828c7
This commit is contained in:
@@ -1955,6 +1955,8 @@
|
||||
<string name="wifi_failed_connect_message">Failed to connect to network</string>
|
||||
<!-- Button label to delete a Wi-Fi network -->
|
||||
<string name="wifi_forget">Forget</string>
|
||||
<!-- Button label to modify a Wi-Fi network -->
|
||||
<string name="wifi_modify">Modify</string>
|
||||
<!-- Failured notification for forget -->
|
||||
<string name="wifi_failed_forget_message">Failed to forget network</string>
|
||||
<!-- Button label to save a Wi-Fi network configuration -->
|
||||
@@ -6835,6 +6837,10 @@
|
||||
<!-- [CHAR LIMIT=100] Notification Importance: high importance level description -->
|
||||
<string name="notification_importance_high">Make sound and pop on screen</string>
|
||||
|
||||
<!-- [CHAR LIMIT=100] Notification Importance: high importance level description,
|
||||
when the user has picked high importance but disabled sound for it -->
|
||||
<string name="notification_importance_high_silent">Pop on screen</string>
|
||||
|
||||
<!-- Importance title strings for the Importance page. Also the first part of the importance
|
||||
summary on the channel page-->
|
||||
|
||||
|
||||
@@ -22,16 +22,11 @@
|
||||
android:key="dashboard_tile_placeholder"
|
||||
android:order="1"/>
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="lock_screen_notifications_profile_header"
|
||||
android:title="@string/profile_section_header">
|
||||
|
||||
<com.android.settings.notification.RestrictedDropDownPreference
|
||||
android:key="lock_screen_notifications_profile"
|
||||
android:title="@string/lock_screen_notifications_title"
|
||||
android:summary="@string/summary_placeholder"/>
|
||||
|
||||
</PreferenceCategory>
|
||||
<!-- When device is locked -->
|
||||
<com.android.settings.notification.RestrictedDropDownPreference
|
||||
android:key="lock_screen_notifications"
|
||||
android:title="@string/lock_screen_notifications_title"
|
||||
android:summary="@string/summary_placeholder"/>
|
||||
|
||||
<!-- Notification badging -->
|
||||
<SwitchPreference
|
||||
@@ -43,12 +38,6 @@
|
||||
android:key="notification_pulse"
|
||||
android:title="@string/notification_pulse_title"/>
|
||||
|
||||
<!-- When device is locked -->
|
||||
<com.android.settings.notification.RestrictedDropDownPreference
|
||||
android:key="lock_screen_notifications"
|
||||
android:title="@string/lock_screen_notifications_title"
|
||||
android:summary="@string/summary_placeholder"/>
|
||||
|
||||
<!-- Default notification ringtone -->
|
||||
<com.android.settings.DefaultRingtonePreference
|
||||
android:key="notification_default_ringtone"
|
||||
@@ -62,4 +51,14 @@
|
||||
android:title="@string/fingerprint_swipe_for_notifications_title"
|
||||
android:fragment="com.android.settings.gestures.SwipeToNotificationSettings" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="lock_screen_notifications_profile_header"
|
||||
android:title="@string/profile_section_header">
|
||||
|
||||
<com.android.settings.notification.RestrictedDropDownPreference
|
||||
android:key="lock_screen_notifications_profile"
|
||||
android:title="@string/lock_screen_notifications_title"
|
||||
android:summary="@string/summary_placeholder"/>
|
||||
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
android:key="sms_mirroring"
|
||||
android:title="@string/sms_mirroring_pref"
|
||||
android:icon="@drawable/ic_compare_arrows_24dp"
|
||||
android:summary="@string/summary_placeholder"
|
||||
android:order="-3"/>
|
||||
|
||||
<Preference
|
||||
|
||||
@@ -25,7 +25,6 @@ import android.content.pm.PackageManager;
|
||||
import android.provider.Settings.Secure;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
@@ -55,12 +54,6 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
|
||||
private static final String SHARED_PREF_FILENAME = "suggestions";
|
||||
|
||||
// Suggestion category name and expiration threshold for first impression type. Needs to keep
|
||||
// in sync with suggestion_ordering.xml
|
||||
private static final String CATEGORY_FIRST_IMPRESSION =
|
||||
"com.android.settings.suggested.category.FIRST_IMPRESSION";
|
||||
private static final long FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS = 14 * DateUtils.DAY_IN_MILLIS;
|
||||
|
||||
private final SuggestionRanker mSuggestionRanker;
|
||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
|
||||
@@ -141,12 +134,7 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
|
||||
getSuggestionIdentifier(context, suggestion));
|
||||
|
||||
boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context);
|
||||
if (isSmartSuggestionEnabled) {
|
||||
// Disable smart suggestion if we are still showing first impression suggestions.
|
||||
isSmartSuggestionEnabled = !isShowingFirstImpressionSuggestion(context);
|
||||
}
|
||||
if (!parser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
|
||||
if (!parser.dismissSuggestion(suggestion)) {
|
||||
return;
|
||||
}
|
||||
context.getPackageManager().setComponentEnabledSetting(
|
||||
@@ -155,19 +143,6 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
PackageManager.DONT_KILL_APP);
|
||||
}
|
||||
|
||||
private boolean isShowingFirstImpressionSuggestion(Context context) {
|
||||
final String keySetupTime = CATEGORY_FIRST_IMPRESSION + SuggestionParser.SETUP_TIME;
|
||||
final long currentTime = System.currentTimeMillis();
|
||||
final SharedPreferences sharedPrefs = getSharedPrefs(context);
|
||||
if (!sharedPrefs.contains(keySetupTime)) {
|
||||
return true;
|
||||
}
|
||||
final long setupTime = sharedPrefs.getLong(keySetupTime, 0);
|
||||
final long elapsedTime = currentTime - setupTime;
|
||||
Log.d(TAG, "Day " + elapsedTime / DateUtils.DAY_IN_MILLIS + " for first impression");
|
||||
return elapsedTime <= FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSuggestionIdentifier(Context context, Tile suggestion) {
|
||||
if (suggestion.intent == null || suggestion.intent.getComponent() == null
|
||||
|
||||
@@ -32,6 +32,7 @@ import android.graphics.drawable.LayerDrawable;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.animation.AnimationUtils;
|
||||
@@ -299,7 +300,10 @@ public class FingerprintEnrollEnrolling extends FingerprintEnrollBase
|
||||
|
||||
@Override
|
||||
public void onEnrollmentHelp(CharSequence helpString) {
|
||||
mErrorText.setText(helpString);
|
||||
if (!TextUtils.isEmpty(helpString)) {
|
||||
mErrorText.removeCallbacks(mTouchAgainRunnable);
|
||||
showError(helpString);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.support.annotation.VisibleForTesting;
|
||||
import android.support.v14.preference.PreferenceFragment;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
@@ -163,9 +164,15 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
|
||||
|
||||
public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
|
||||
String packageName) {
|
||||
final Bundle args = new Bundle(2);
|
||||
final Bundle args = new Bundle(3);
|
||||
final PackageManager packageManager = caller.getPackageManager();
|
||||
args.putString(EXTRA_PACKAGE_NAME, packageName);
|
||||
args.putString(EXTRA_POWER_USAGE_PERCENT, Utils.formatPercentage(0));
|
||||
try {
|
||||
args.putInt(EXTRA_UID, packageManager.getPackageUid(packageName, 0 /* no flag */));
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.e(TAG, "Cannot find package: " + packageName, e);
|
||||
}
|
||||
|
||||
caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
|
||||
R.string.battery_details_title, null, new UserHandle(UserHandle.myUserId()));
|
||||
|
||||
@@ -88,8 +88,7 @@ public class TetherPreferenceController extends AbstractPreferenceController imp
|
||||
public TetherPreferenceController(Context context, Lifecycle lifecycle) {
|
||||
super(context);
|
||||
mBluetoothPan = new AtomicReference<>();
|
||||
mAdminDisallowedTetherConfig = checkIfRestrictionEnforced(
|
||||
mContext, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null;
|
||||
mAdminDisallowedTetherConfig = isTetherConfigDisallowed(context);
|
||||
mConnectivityManager =
|
||||
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
||||
@@ -170,6 +169,11 @@ public class TetherPreferenceController extends AbstractPreferenceController imp
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isTetherConfigDisallowed(Context context) {
|
||||
return checkIfRestrictionEnforced(
|
||||
context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void updateSummary() {
|
||||
if (mPreference == null) {
|
||||
|
||||
@@ -17,8 +17,17 @@
|
||||
package com.android.settings.dashboard.suggestions;
|
||||
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -59,18 +68,6 @@ import org.robolectric.annotation.Config;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyBoolean;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH,
|
||||
sdk = TestConfig.SDK_VERSION,
|
||||
@@ -337,7 +334,7 @@ public class SuggestionFeatureProviderImplTest {
|
||||
|
||||
@Test
|
||||
public void dismissSuggestion_hasMoreDismissCount_shouldNotDisableComponent() {
|
||||
when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
|
||||
when(mSuggestionParser.dismissSuggestion(any(Tile.class)))
|
||||
.thenReturn(false);
|
||||
mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
|
||||
|
||||
@@ -348,25 +345,6 @@ public class SuggestionFeatureProviderImplTest {
|
||||
verify(mContext, never()).getPackageManager();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dismissSuggestion_isShowingFirstImpressionType_dismissWithoutSmartSuggestionRule() {
|
||||
mProvider = spy(mProvider);
|
||||
when(mProvider.isSmartSuggestionEnabled(any(Context.class))).thenReturn(true);
|
||||
final SharedPreferences pref = RuntimeEnvironment.application.getSharedPreferences(
|
||||
"test_pref", Context.MODE_PRIVATE);
|
||||
when(mProvider.getSharedPrefs(mContext)).thenReturn(pref);
|
||||
when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
|
||||
.thenReturn(false);
|
||||
|
||||
mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
|
||||
|
||||
verify(mFactory.metricsFeatureProvider).action(
|
||||
eq(mContext),
|
||||
eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION),
|
||||
anyString());
|
||||
verify(mSuggestionParser).dismissSuggestion(any(Tile.class), eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dismissSuggestion_noContext_shouldDoNothing() {
|
||||
mProvider.dismissSuggestion(null, mSuggestionParser, mSuggestion);
|
||||
@@ -376,7 +354,7 @@ public class SuggestionFeatureProviderImplTest {
|
||||
|
||||
@Test
|
||||
public void dismissSuggestion_hasNoMoreDismissCount_shouldDisableComponent() {
|
||||
when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
|
||||
when(mSuggestionParser.dismissSuggestion(any(Tile.class)))
|
||||
.thenReturn(true);
|
||||
|
||||
mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
|
||||
|
||||
@@ -368,6 +368,16 @@ public class AdvancedPowerUsageDetailTest {
|
||||
"0%");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStartBatteryDetailPage_batteryEntryNotExisted_extractUidFromPackageName() throws
|
||||
PackageManager.NameNotFoundException{
|
||||
doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */);
|
||||
|
||||
AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]);
|
||||
|
||||
assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStartBatteryDetailPage_defaultPackageNull_chooseFromBatterySipper() {
|
||||
mBatteryEntry.defaultPackageName = null;
|
||||
|
||||
@@ -89,6 +89,32 @@ public class ShadowSecureSettings {
|
||||
}
|
||||
}
|
||||
|
||||
@Implementation
|
||||
public static boolean putFloatForUser(
|
||||
ContentResolver resolver, String name, float value, int userHandle) {
|
||||
final Table<Integer, String, Object> userTable = getUserTable(resolver);
|
||||
synchronized (userTable) {
|
||||
userTable.put(userHandle, name, value);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Implementation
|
||||
public static float getFloatForUser(
|
||||
ContentResolver resolver, String name, float def, int userHandle) {
|
||||
final Table<Integer, String, Object> userTable = getUserTable(resolver);
|
||||
synchronized (userTable) {
|
||||
final Object object = userTable.get(userHandle, name);
|
||||
return object instanceof Float ? (Float) object : def;
|
||||
}
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
synchronized (sUserDataMap) {
|
||||
sUserDataMap.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private static Table<Integer, String, Object> getUserTable(ContentResolver contentResolver) {
|
||||
synchronized (sUserDataMap) {
|
||||
Table<Integer, String, Object> table = sUserDataMap.get(contentResolver);
|
||||
|
||||
Reference in New Issue
Block a user