Snap for 4600820 from 9017e45d09 to pi-release

Change-Id: I22a1576301c40605cf1311ff8c8e9f9e662d40cb
This commit is contained in:
android-build-team Robot
2018-02-13 08:38:09 +00:00
34 changed files with 470 additions and 596 deletions

View File

@@ -1984,11 +1984,6 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
</intent-filter>
<intent-filter android:priority="2">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.device" />
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.print.PrintSettingsFragment" />
</activity>

View File

@@ -1,5 +1,3 @@
[Hook Scripts]
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
-fw src/com/android/settings/print/
checkcolor_hook = ${REPO_ROOT}/prebuilts/checkcolor/checkcolor.py -p .

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FF000000"
android:pathData="M20,2C21.1,2 22,2.9 22,4L22,16C22,17.1 21.1,18 20,18L6,18L2,22L2.01,4C2.01,2.9 2.9,2 4,2L20,2ZM8,8L4,12L8,16L8,13L14,13L14,11L8,11L8,8ZM19.666,7.872L16.038,4.372L16.038,6.997L10,6.997L10,9L16.038,9L16.038,11.372L19.666,7.872Z"/>
</vector>

View File

@@ -8130,9 +8130,6 @@
and powering other device [CHAR LIMIT=NONE] -->
<string name="usb_summary_MIDI_power">MIDI and supplying power</string>
<!-- Settings item title for SMS Mirroring preference [CHAR LIMIT=35] -->
<string name="sms_mirroring_pref">SMS Mirroring</string>
<!-- Settings item title for background check prefs [CHAR LIMIT=35] -->
<string name="background_check_pref">Background check</string>

View File

@@ -42,13 +42,6 @@
android:icon="@drawable/ic_android"
android:order="-4"/>
<Preference
android:key="sms_mirroring"
android:title="@string/sms_mirroring_pref"
android:icon="@drawable/ic_sms_mirroring_24dp"
android:summary="@string/summary_placeholder"
android:order="-3"/>
<SwitchPreference
android:key="bluetooth_on_while_driving"
android:title="@string/bluetooth_on_while_driving_pref"
@@ -57,6 +50,14 @@
settings:controller="com.android.settings.connecteddevice.BluetoothOnWhileDrivingPreferenceController"
android:order="-2"/>
<Preference
android:key="connected_device_printing"
android:title="@string/print_settings"
android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_settings_print"
android:fragment="com.android.settings.print.PrintSettingsFragment"
android:order="-1"/>
<Preference
android:key="bt_received_files"
android:icon="@drawable/ic_folder_vd_theme_24"

View File

@@ -39,13 +39,6 @@
android:icon="@drawable/ic_android"
android:order="-4"/>
<Preference
android:key="sms_mirroring"
android:title="@string/sms_mirroring_pref"
android:icon="@drawable/ic_sms_mirroring_24dp"
android:summary="@string/summary_placeholder"
android:order="-3"/>
<Preference
android:key="usb_mode"
android:title="@string/usb_pref"

View File

@@ -18,7 +18,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="print_settings_screen"
android:title="@string/print_settings_title"
android:title="@string/print_settings"
settings:keywords="@string/keywords_printing">
<PreferenceCategory

View File

@@ -802,11 +802,6 @@ public class SettingsActivity extends SettingsDrawerActivity
!UserManager.isDeviceInDemoMode(this), isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.PrintSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_PRINTING), isAdmin)
|| somethingChanged;
final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
&& !Utils.isMonkeyRunning();

View File

@@ -103,7 +103,8 @@ public class AccountTypePreference extends AppPreference implements OnPreference
}
Utils.startWithFragment(getContext(), mFragment, mFragmentArguments,
null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName,
mTitleResId, null /* title */, mMetricsCategory);
mTitleResId, null /* title */,false /* isShortCut */, mMetricsCategory,
0 /* flag */);
return true;
}
return false;

View File

@@ -29,6 +29,7 @@ import com.android.settings.connecteddevice.usb.UsbModePreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.nfc.NfcPreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.print.PrintSettingPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -43,7 +44,6 @@ import java.util.List;
public class AdvancedConnectedDeviceDashboardFragment extends DashboardFragment {
private static final String TAG = "AdvancedConnectedDeviceFrag";
private UsbModePreferenceController mUsbPrefController;
@Override
public int getMetricsCategory() {
@@ -67,27 +67,32 @@ public class AdvancedConnectedDeviceDashboardFragment extends DashboardFragment
@Override
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
return buildControllers(context, getLifecycle());
}
private static List<AbstractPreferenceController> buildControllers(Context context,
Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final Lifecycle lifecycle = getLifecycle();
final NfcPreferenceController nfcPreferenceController =
new NfcPreferenceController(context);
lifecycle.addObserver(nfcPreferenceController);
controllers.add(nfcPreferenceController);
mUsbPrefController = new UsbModePreferenceController(context, new UsbBackend(context));
lifecycle.addObserver(mUsbPrefController);
controllers.add(mUsbPrefController);
controllers.add(new UsbModePreferenceController(
context, new UsbBackend(context), lifecycle));
final BluetoothSwitchPreferenceController bluetoothPreferenceController =
new BluetoothSwitchPreferenceController(context);
lifecycle.addObserver(bluetoothPreferenceController);
controllers.add(bluetoothPreferenceController);
SmsMirroringFeatureProvider smsMirroringFeatureProvider =
FeatureFactory.getFactory(context).getSmsMirroringFeatureProvider();
AbstractPreferenceController smsMirroringController =
smsMirroringFeatureProvider.getController(context);
controllers.add(smsMirroringController);
controllers.add(new BluetoothFilesPreferenceController(context));
controllers.add(new BluetoothOnWhileDrivingPreferenceController(context));
final PrintSettingPreferenceController printerController =
new PrintSettingPreferenceController(context);
if (lifecycle != null) {
lifecycle.addObserver(printerController);
lifecycle.addObserver(nfcPreferenceController);
lifecycle.addObserver(bluetoothPreferenceController);
}
controllers.add(printerController);
return controllers;
}
@@ -114,13 +119,13 @@ public class AdvancedConnectedDeviceDashboardFragment extends DashboardFragment
}
keys.add(BluetoothMasterSwitchPreferenceController.KEY_TOGGLE_BLUETOOTH);
SmsMirroringFeatureProvider smsMirroringFeatureProvider =
FeatureFactory.getFactory(context).getSmsMirroringFeatureProvider();
SmsMirroringPreferenceController smsMirroringController =
smsMirroringFeatureProvider.getController(context);
smsMirroringController.updateNonIndexableKeys(keys);
return keys;
}
@Override
public List<AbstractPreferenceController> getPreferenceControllers(
Context context) {
return buildControllers(context, null /* lifecycle */);
}
};
}

View File

@@ -80,8 +80,8 @@ public class ConnectedDeviceDashboardFragmentOld extends DashboardFragment {
new NfcPreferenceController(context);
lifecycle.addObserver(nfcPreferenceController);
controllers.add(nfcPreferenceController);
mUsbPrefController = new UsbModePreferenceController(context, new UsbBackend(context));
lifecycle.addObserver(mUsbPrefController);
mUsbPrefController = new UsbModePreferenceController(context, new UsbBackend(context),
lifecycle);
controllers.add(mUsbPrefController);
final BluetoothMasterSwitchPreferenceController bluetoothPreferenceController =
new BluetoothMasterSwitchPreferenceController(
@@ -90,11 +90,6 @@ public class ConnectedDeviceDashboardFragmentOld extends DashboardFragment {
lifecycle.addObserver(bluetoothPreferenceController);
controllers.add(bluetoothPreferenceController);
SmsMirroringFeatureProvider smsMirroringFeatureProvider =
FeatureFactory.getFactory(context).getSmsMirroringFeatureProvider();
AbstractPreferenceController smsMirroringController =
smsMirroringFeatureProvider.getController(context);
controllers.add(smsMirroringController);
return controllers;
}
@@ -157,12 +152,6 @@ public class ConnectedDeviceDashboardFragmentOld extends DashboardFragment {
}
keys.add(BluetoothMasterSwitchPreferenceController.KEY_TOGGLE_BLUETOOTH);
SmsMirroringFeatureProvider smsMirroringFeatureProvider =
FeatureFactory.getFactory(context).getSmsMirroringFeatureProvider();
SmsMirroringPreferenceController smsMirroringController =
smsMirroringFeatureProvider.getController(context);
smsMirroringController.updateNonIndexableKeys(keys);
return keys;
}
};

View File

@@ -1,28 +0,0 @@
/*
* Copyright (C) 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.
*/
package com.android.settings.connecteddevice;
import android.content.Context;
public interface SmsMirroringFeatureProvider {
/** Returns whether to show SMS mirroring. */
boolean shouldShowSmsMirroring(Context context);
/** Returns a preference controller for SMS mirroring. */
SmsMirroringPreferenceController getController(Context context);
}

View File

@@ -1,31 +0,0 @@
/*
* Copyright (C) 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.
*/
package com.android.settings.connecteddevice;
import android.content.Context;
public class SmsMirroringFeatureProviderImpl implements SmsMirroringFeatureProvider {
@Override
public boolean shouldShowSmsMirroring(Context context) {
return false;
}
@Override
public SmsMirroringPreferenceController getController(Context context) {
return new SmsMirroringPreferenceController(context);
}
}

View File

@@ -1,45 +0,0 @@
/*
* Copyright (C) 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.
*/
package com.android.settings.connecteddevice;
import android.content.Context;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
public class SmsMirroringPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin {
static final String KEY_SMS_MIRRORING = "sms_mirroring";
private SmsMirroringFeatureProvider mFeatureProvider;
public SmsMirroringPreferenceController(Context context) {
super(context);
mFeatureProvider = FeatureFactory.getFactory(context).getSmsMirroringFeatureProvider();
}
@Override
public boolean isAvailable() {
return mFeatureProvider.shouldShowSmsMirroring(mContext);
}
@Override
public String getPreferenceKey() {
return KEY_SMS_MIRRORING;
}
}

View File

@@ -23,6 +23,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
@@ -37,12 +38,16 @@ public class UsbModePreferenceController extends AbstractPreferenceController
UsbConnectionBroadcastReceiver mUsbReceiver;
private Preference mUsbPreference;
public UsbModePreferenceController(Context context, UsbBackend usbBackend) {
public UsbModePreferenceController(Context context, UsbBackend usbBackend,
Lifecycle lifecycle) {
super(context);
mUsbBackend = usbBackend;
mUsbReceiver = new UsbConnectionBroadcastReceiver(mContext, (connected, newMode) -> {
updateSummary(mUsbPreference, connected, newMode);
}, mUsbBackend);
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override

View File

@@ -21,6 +21,7 @@ import android.util.Log;
import com.android.settings.search.ResultPayload;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -70,6 +71,8 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl
protected final String mPreferenceKey;
protected Lifecycle mLifecycle;
public BasePreferenceController(Context context, String preferenceKey) {
super(context);
mPreferenceKey = preferenceKey;

View File

@@ -35,6 +35,7 @@ import com.android.settings.R;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
* Adapter for showing {@link TimeZoneInfo} objects in a recycler view.
@@ -55,7 +56,11 @@ class TimeZoneAdapter extends RecyclerView.Adapter {
TimeZoneAdapter(View.OnClickListener onClickListener, Context context) {
mOnClickListener = onClickListener;
mContext = context;
mTimeFormat = DateFormat.getTimeInstance(SimpleDateFormat.SHORT);
// Use android.text.format.DateFormat to observe 24-hour settings and find the best pattern
// using ICU with skeleton.
mTimeFormat = new SimpleDateFormat(
android.text.format.DateFormat.getTimeFormatString(context),
Locale.getDefault());
mDateFormat = DateFormat.getDateInstance(SimpleDateFormat.MEDIUM);
mDateFormat.setContext(DisplayContext.CAPITALIZATION_NONE);
mCurrentTimeZone = TimeZone.getDefault().getID();

View File

@@ -79,7 +79,7 @@ public class AmbientDisplaySettings extends DashboardFragment {
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle(),
new AmbientDisplayConfiguration(context), mMetricsFeatureProvider,
() -> { updatePreferenceStates(); });
this::updatePreferenceStates);
}
@Override

View File

@@ -102,4 +102,9 @@ public class DoubleTapScreenPreferenceController extends GesturePreferenceContro
return new InlineSwitchPayload(SECURE_KEY, ResultPayload.SettingsSource.SECURE,
ON /* onValue */, intent, isAvailable(), ON /* defaultValue */);
}
@Override
protected boolean canHandleClicks() {
return !mAmbientConfig.alwaysOnEnabled(mUserId);
}
}

View File

@@ -24,7 +24,6 @@ import com.android.settings.R;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider;
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
@@ -103,8 +102,6 @@ public abstract class FeatureFactory {
public abstract BluetoothFeatureProvider getBluetoothFeatureProvider(Context context);
public abstract SmsMirroringFeatureProvider getSmsMirroringFeatureProvider();
public abstract SlicesFeatureProvider getSlicesFeatureProvider();
public abstract AccountFeatureProvider getAccountFeatureProvider();

View File

@@ -29,8 +29,6 @@ import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProviderImpl;
import com.android.settings.bluetooth.BluetoothFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProviderImpl;
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
import com.android.settings.connecteddevice.SmsMirroringFeatureProviderImpl;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProviderImpl;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
@@ -75,7 +73,6 @@ public class FeatureFactoryImpl extends FeatureFactory {
private AssistGestureFeatureProvider mAssistGestureFeatureProvider;
private UserFeatureProvider mUserFeatureProvider;
private BluetoothFeatureProvider mBluetoothFeatureProvider;
private SmsMirroringFeatureProvider mSmsMirroringFeatureProvider;
private SlicesFeatureProvider mSlicesFeatureProvider;
private AccountFeatureProvider mAccountFeatureProvider;
@@ -196,14 +193,6 @@ public class FeatureFactoryImpl extends FeatureFactory {
return mAssistGestureFeatureProvider;
}
@Override
public SmsMirroringFeatureProvider getSmsMirroringFeatureProvider() {
if (mSmsMirroringFeatureProvider == null) {
mSmsMirroringFeatureProvider = new SmsMirroringFeatureProviderImpl();
}
return mSmsMirroringFeatureProvider;
}
@Override
public SlicesFeatureProvider getSlicesFeatureProvider() {
if (mSlicesFeatureProvider == null) {

View File

@@ -0,0 +1,135 @@
/*
* Copyright (C) 2018 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.
*/
package com.android.settings.print;
import android.content.Context;
import android.content.pm.PackageManager;
import android.print.PrintJob;
import android.print.PrintJobId;
import android.print.PrintJobInfo;
import android.print.PrintManager;
import android.printservice.PrintServiceInfo;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.wrapper.PrintManagerWrapper;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
import java.util.List;
/**
* {@link BasePreferenceController} for Print settings.
*/
public class PrintSettingPreferenceController extends BasePreferenceController implements
LifecycleObserver, OnStart, OnStop, PrintManager.PrintJobStateChangeListener {
private final PackageManager mPackageManager;
private PrintManagerWrapper mPrintManager;
private Preference mPreference;
public PrintSettingPreferenceController(Context context) {
super(context, "connected_device_printing" /* preferenceKey */);
mPackageManager = context.getPackageManager();
mPrintManager = new PrintManagerWrapper(context);
}
@Override
public int getAvailabilityStatus() {
return mPackageManager.hasSystemFeature(PackageManager.FEATURE_PRINTING)
? AVAILABLE : DISABLED_UNSUPPORTED;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
}
@Override
public void onStart() {
mPrintManager.addPrintJobStateChanegListener(this);
}
@Override
public void onStop() {
mPrintManager.removePrintJobStateChangeListener(this);
}
@Override
public void onPrintJobStateChanged(PrintJobId printJobId) {
updateState(mPreference);
}
@Override
public void updateState(Preference preference) {
if (preference == null) {
return;
}
preference.setSummary(getSummary());
}
@Override
public String getSummary() {
final List<PrintJob> printJobs = mPrintManager.getPrintJobs();
int numActivePrintJobs = 0;
if (printJobs != null) {
for (PrintJob job : printJobs) {
if (shouldShowToUser(job.getInfo())) {
numActivePrintJobs++;
}
}
}
if (numActivePrintJobs > 0) {
return mContext.getResources().getQuantityString(
R.plurals.print_jobs_summary, numActivePrintJobs, numActivePrintJobs);
} else {
final List<PrintServiceInfo> services =
mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES);
if (services == null || services.isEmpty()) {
return mContext.getString(R.string.print_settings_summary_no_service);
} else {
final int count = services.size();
return mContext.getResources().getQuantityString(
R.plurals.print_settings_summary, count, count);
}
}
}
/**
* Should the print job the shown to the user in the settings app.
*
* @param printJob The print job in question.
* @return true iff the print job should be shown.
*/
static boolean shouldShowToUser(PrintJobInfo printJob) {
switch (printJob.getState()) {
case PrintJobInfo.STATE_QUEUED:
case PrintJobInfo.STATE_STARTED:
case PrintJobInfo.STATE_BLOCKED:
case PrintJobInfo.STATE_FAILED: {
return true;
}
}
return false;
}
}

View File

@@ -16,6 +16,8 @@
package com.android.settings.print;
import static com.android.settings.print.PrintSettingPreferenceController.shouldShowToUser;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ActivityNotFoundException;
import android.content.AsyncTaskLoader;
@@ -37,7 +39,6 @@ import android.print.PrintServicesLoader;
import android.printservice.PrintServiceInfo;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.text.TextUtils;
@@ -52,7 +53,6 @@ import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.utils.ProfileSettingsPreferenceFragment;
@@ -130,11 +130,6 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment
startSubSettingsIfNeeded();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -359,7 +354,7 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment
printJob.getCreationTime(), printJob.getCreationTime(),
DateFormat.SHORT, DateFormat.SHORT)));
TypedArray a = getActivity().obtainStyledAttributes(new int[]{
TypedArray a = getActivity().obtainStyledAttributes(new int[] {
android.R.attr.colorControlNormal});
int tintColor = a.getColor(0, 0);
a.recycle();
@@ -494,136 +489,17 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment
}
}
/**
* Should the print job the shown to the user in the settings app.
*
* @param printJob The print job in question.
* @return true iff the print job should be shown.
*/
private static boolean shouldShowToUser(PrintJobInfo printJob) {
switch (printJob.getState()) {
case PrintJobInfo.STATE_QUEUED:
case PrintJobInfo.STATE_STARTED:
case PrintJobInfo.STATE_BLOCKED:
case PrintJobInfo.STATE_FAILED: {
return true;
}
}
return false;
}
/**
* Provider for the print settings summary
*/
@VisibleForTesting
static class PrintSummaryProvider
implements SummaryLoader.SummaryProvider, PrintJobStateChangeListener {
private final Context mContext;
private final PrintManagerWrapper mPrintManager;
private final SummaryLoader mSummaryLoader;
/**
* Create a new {@link PrintSummaryProvider}.
*
* @param context The context this provider is for
* @param summaryLoader The summary load using this provider
*/
PrintSummaryProvider(Context context, SummaryLoader summaryLoader,
PrintManagerWrapper printManager) {
mContext = context;
mSummaryLoader = summaryLoader;
mPrintManager = printManager;
}
@Override
public void setListening(boolean isListening) {
if (mPrintManager != null) {
if (isListening) {
mPrintManager.addPrintJobStateChanegListner(this);
onPrintJobStateChanged(null);
} else {
mPrintManager.removePrintJobStateChangeListener(this);
}
}
}
@Override
public void onPrintJobStateChanged(PrintJobId printJobId) {
final List<PrintJob> printJobs = mPrintManager.getPrintJobs();
int numActivePrintJobs = 0;
if (printJobs != null) {
for (PrintJob job : printJobs) {
if (shouldShowToUser(job.getInfo())) {
numActivePrintJobs++;
}
}
}
if (numActivePrintJobs > 0) {
mSummaryLoader.setSummary(this, mContext.getResources().getQuantityString(
R.plurals.print_jobs_summary, numActivePrintJobs, numActivePrintJobs));
} else {
List<PrintServiceInfo> services =
mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES);
if (services == null || services.isEmpty()) {
mSummaryLoader.setSummary(this,
mContext.getString(R.string.print_settings_summary_no_service));
} else {
final int count = services.size();
mSummaryLoader.setSummary(this,
mContext.getResources().getQuantityString(
R.plurals.print_settings_summary, count, count));
}
}
}
static class PrintManagerWrapper {
private final PrintManager mPrintManager;
PrintManagerWrapper(Context context) {
mPrintManager = ((PrintManager) context.getSystemService(Context.PRINT_SERVICE))
.getGlobalPrintManagerForUser(context.getUserId());
}
public List<PrintServiceInfo> getPrintServices(int selectionFlags) {
return mPrintManager.getPrintServices(selectionFlags);
}
public void addPrintJobStateChanegListner(PrintJobStateChangeListener listener) {
mPrintManager.addPrintJobStateChangeListener(listener);
}
public void removePrintJobStateChangeListener(PrintJobStateChangeListener listener) {
mPrintManager.removePrintJobStateChangeListener(listener);
}
public List<PrintJob> getPrintJobs() {
return mPrintManager.getPrintJobs();
}
}
}
/**
* A factory for {@link PrintSummaryProvider providers} the settings app can use to read the
* print summary.
*/
public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
(activity, summaryLoader) -> new PrintSummaryProvider(activity, summaryLoader,
new PrintSummaryProvider.PrintManagerWrapper(activity));
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
List<SearchIndexableResource> indexables = new ArrayList<>();
SearchIndexableResource indexable = new SearchIndexableResource(context);
indexable.xmlResId = R.xml.print_settings;
indexables.add(indexable);
return indexables;
}
};
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
List<SearchIndexableResource> indexables = new ArrayList<>();
SearchIndexableResource indexable = new SearchIndexableResource(context);
indexable.xmlResId = R.xml.print_settings;
indexables.add(indexable);
return indexables;
}
};
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) 2018 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.
*/
package com.android.settings.wrapper;
import android.content.Context;
import android.print.PrintJob;
import android.print.PrintManager;
import android.printservice.PrintServiceInfo;
import java.util.List;
/**
* Wrapper class for {@link PrintManager}. This is necessary to increase testability in Robolectric.
*/
public class PrintManagerWrapper {
private final PrintManager mPrintManager;
public PrintManagerWrapper(Context context) {
mPrintManager = ((PrintManager) context.getSystemService(Context.PRINT_SERVICE))
.getGlobalPrintManagerForUser(context.getUserId());
}
public List<PrintServiceInfo> getPrintServices(int selectionFlags) {
return mPrintManager.getPrintServices(selectionFlags);
}
public void addPrintJobStateChanegListener(PrintManager.PrintJobStateChangeListener listener) {
mPrintManager.addPrintJobStateChangeListener(listener);
}
public void removePrintJobStateChangeListener(
PrintManager.PrintJobStateChangeListener listener) {
mPrintManager.removePrintJobStateChangeListener(listener);
}
public List<PrintJob> getPrintJobs() {
return mPrintManager.getPrintJobs();
}
}

View File

@@ -16,7 +16,6 @@
package com.android.settings.connecteddevice;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -24,9 +23,6 @@ import android.content.pm.PackageManager;
import android.provider.SearchIndexableResource;
import com.android.settings.TestConfig;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.nfc.NfcPreferenceController;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;
import com.android.settingslib.drawer.CategoryKey;
@@ -52,38 +48,14 @@ public class AdvancedConnectedDeviceDashboardFragmentTest {
@Mock
private PackageManager mManager;
private FakeFeatureFactory mFeatureFactory;
private SmsMirroringFeatureProvider mFeatureProvider;
private AdvancedConnectedDeviceDashboardFragment mFragment;
private TestSmsMirroringPreferenceController mSmsMirroringPreferenceController;
private static final class TestSmsMirroringPreferenceController
extends SmsMirroringPreferenceController implements PreferenceControllerMixin {
private boolean mIsAvailable;
public TestSmsMirroringPreferenceController(Context context) {
super(context);
}
@Override
public boolean isAvailable() {
return mIsAvailable;
}
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mFeatureFactory = FakeFeatureFactory.setupForTest();
mFeatureProvider = mFeatureFactory.smsMirroringFeatureProvider;
mFragment = new AdvancedConnectedDeviceDashboardFragment();
when(mContext.getPackageManager()).thenReturn(mManager);
mSmsMirroringPreferenceController = new TestSmsMirroringPreferenceController(mContext);
when(mFeatureProvider.getController(mContext)).thenReturn(
mSmsMirroringPreferenceController);
when(mContext.getApplicationContext().getPackageManager()).thenReturn(mManager);
}
@Test
@@ -101,52 +73,6 @@ public class AdvancedConnectedDeviceDashboardFragmentTest {
assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
}
@Test
public void testSearchIndexProvider_NoNfc_KeyAdded() {
when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(false);
final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mContext);
assertThat(keys).isNotNull();
assertThat(keys).contains(NfcPreferenceController.KEY_TOGGLE_NFC);
assertThat(keys).contains(NfcPreferenceController.KEY_ANDROID_BEAM_SETTINGS);
}
@Test
public void testSearchIndexProvider_NFC_KeyNotAdded() {
when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mContext);
assertThat(keys).isNotNull();
assertThat(keys).doesNotContain(NfcPreferenceController.KEY_TOGGLE_NFC);
assertThat(keys).doesNotContain(NfcPreferenceController.KEY_ANDROID_BEAM_SETTINGS);
}
@Test
public void testSearchIndexProvider_NoSmsMirroring_KeyAdded() {
when(mFeatureProvider.shouldShowSmsMirroring(mContext)).thenReturn(false);
mSmsMirroringPreferenceController.mIsAvailable = false;
final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mContext);
assertThat(keys).isNotNull();
assertThat(keys).contains(mSmsMirroringPreferenceController.getPreferenceKey());
}
@Test
public void testSearchIndexProvider_SmsMirroring_KeyNotAdded() {
when(mFeatureProvider.shouldShowSmsMirroring(mContext)).thenReturn(true);
mSmsMirroringPreferenceController.mIsAvailable = true;
final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mContext);
assertThat(keys).isNotNull();
assertThat(keys).doesNotContain(mSmsMirroringPreferenceController.getPreferenceKey());
}
@Test
public void testGetCategoryKey_returnCategoryDevice() {
assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_DEVICE);

View File

@@ -60,37 +60,15 @@ public class ConnectedDeviceDashboardFragment2Test {
private PackageManager mManager;
private FakeFeatureFactory mFeatureFactory;
private SmsMirroringFeatureProvider mFeatureProvider;
private ConnectedDeviceDashboardFragmentOld mFragment;
private TestSmsMirroringPreferenceController mSmsMirroringPreferenceController;
private static final class TestSmsMirroringPreferenceController
extends SmsMirroringPreferenceController implements PreferenceControllerMixin {
private boolean mIsAvailable;
public TestSmsMirroringPreferenceController(Context context) {
super(context);
}
@Override
public boolean isAvailable() {
return mIsAvailable;
}
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mFeatureFactory = FakeFeatureFactory.setupForTest();
mFeatureProvider = mFeatureFactory.smsMirroringFeatureProvider;
mFragment = new ConnectedDeviceDashboardFragmentOld();
when(mContext.getPackageManager()).thenReturn(mManager);
mSmsMirroringPreferenceController = new TestSmsMirroringPreferenceController(mContext);
when(mFeatureProvider.getController(mContext)).thenReturn(
mSmsMirroringPreferenceController);
}
@Test
@@ -130,30 +108,6 @@ public class ConnectedDeviceDashboardFragment2Test {
assertThat(keys).doesNotContain(NfcPreferenceController.KEY_ANDROID_BEAM_SETTINGS);
}
@Test
public void testSearchIndexProvider_NoSmsMirroring_KeyAdded() {
when(mFeatureProvider.shouldShowSmsMirroring(mContext)).thenReturn(false);
mSmsMirroringPreferenceController.mIsAvailable = false;
final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mContext);
assertThat(keys).isNotNull();
assertThat(keys).contains(mSmsMirroringPreferenceController.getPreferenceKey());
}
@Test
public void testSearchIndexProvider_SmsMirroring_KeyNotAdded() {
when(mFeatureProvider.shouldShowSmsMirroring(mContext)).thenReturn(true);
mSmsMirroringPreferenceController.mIsAvailable = true;
final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mContext);
assertThat(keys).isNotNull();
assertThat(keys).doesNotContain(mSmsMirroringPreferenceController.getPreferenceKey());
}
@Test
public void testNonIndexableKeys_existInXmlLayout() {
final Context context = RuntimeEnvironment.application;

View File

@@ -1,12 +1,15 @@
package com.android.settings.connecteddevice.usb;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
@@ -16,20 +19,12 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class UsbModePreferenceControllerTest {
@Mock(answer = RETURNS_DEEP_STUBS)
private UsbBackend mUsbBackend;
@Mock(answer = RETURNS_DEEP_STUBS)
private PreferenceScreen mScreen;
@Mock
private UsbConnectionBroadcastReceiver mUsbConnectionBroadcastReceiver;
@@ -40,7 +35,7 @@ public class UsbModePreferenceControllerTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = ShadowApplication.getInstance().getApplicationContext();
mController = new UsbModePreferenceController(mContext, mUsbBackend);
mController = new UsbModePreferenceController(mContext, mUsbBackend, null /* lifecycle */);
mController.mUsbReceiver = mUsbConnectionBroadcastReceiver;
}

View File

@@ -16,14 +16,11 @@
package com.android.settings.core;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController
.DISABLED_DEPENDENT_SETTING;
import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED;
import static com.android.settings.core.BasePreferenceController.UNAVAILABLE_UNKNOWN;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import com.android.settings.TestConfig;
@@ -41,7 +38,7 @@ import org.robolectric.annotation.Config;
public class BasePreferenceControllerTest {
@Mock
BasePreferenceController mPreferenceController;
private BasePreferenceController mPreferenceController;
@Before
public void setUp() {

View File

@@ -15,13 +15,18 @@
*/
package com.android.settings.datetime.timezone;
import android.content.Context;
import android.icu.util.TimeZone;
import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
import android.widget.FrameLayout;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -29,8 +34,11 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import java.util.Collections;
import java.util.Locale;
import static com.google.common.truth.Truth.assertThat;
@@ -38,17 +46,39 @@ import static com.google.common.truth.Truth.assertThat;
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = {
SettingsShadowResources.class,
SettingsShadowResources.SettingsShadowTheme.class})
SettingsShadowResources.SettingsShadowTheme.class,
TimeZoneAdapterTest.ShadowDataFormat.class})
public class TimeZoneAdapterTest {
@Mock
private View.OnClickListener mOnClickListener;
private TimeZoneAdapter mTimeZoneAdapter;
private Context mContext;
private Locale mDefaultLocale;
@Before
public void setUp() {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, RuntimeEnvironment.application);
mContext = RuntimeEnvironment.application;
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, mContext);
mDefaultLocale = Locale.getDefault();
}
@After
public void tearDown() throws Exception {
Locale.setDefault(mDefaultLocale);
}
@Implements(android.text.format.DateFormat.class)
public static class ShadowDataFormat {
public static String mTimeFormatString = "";
@Implementation
public static String getTimeFormatString(Context context) {
return mTimeFormatString;
}
}
@Test
@@ -89,6 +119,38 @@ public class TimeZoneAdapterTest {
assertThat(viewHolder.mDstView.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void bindViewHolder_on24Hour() {
Locale.setDefault(Locale.US);
ShadowDataFormat.mTimeFormatString = "HH:mm";
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, mContext);
final TimeZoneInfo tzi = dummyTimeZoneInfo(TimeZone.getTimeZone("Etc/UTC"));
mTimeZoneAdapter.setTimeZoneInfos(Collections.singletonList(tzi));
final FrameLayout parent = new FrameLayout(RuntimeEnvironment.application);
final ViewHolder viewHolder = (ViewHolder) mTimeZoneAdapter.createViewHolder(parent, TimeZoneAdapter.VIEW_TYPE_NORMAL);
mTimeZoneAdapter.bindViewHolder(viewHolder, 0);
assertThat(viewHolder.mTimeView.getText().toString()).hasLength(5);
}
@Test
public void bindViewHolder_on12Hour() {
Locale.setDefault(Locale.US);
ShadowDataFormat.mTimeFormatString = "hh:mm a";
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, mContext);
final TimeZoneInfo tzi = dummyTimeZoneInfo(TimeZone.getTimeZone("Etc/UTC"));
mTimeZoneAdapter.setTimeZoneInfos(Collections.singletonList(tzi));
final FrameLayout parent = new FrameLayout(RuntimeEnvironment.application);
final ViewHolder viewHolder = (ViewHolder) mTimeZoneAdapter.createViewHolder(parent, TimeZoneAdapter.VIEW_TYPE_NORMAL);
mTimeZoneAdapter.bindViewHolder(viewHolder, 0);
assertThat(viewHolder.mTimeView.getText().toString()).hasLength(8);
}
// Pick an arbitrary time zone that's not the current default.
private static TimeZone getNonDefaultTimeZone() {
final String[] availableIDs = TimeZone.getAvailableIDs();

View File

@@ -161,4 +161,16 @@ public class DoubleTapScreenPreferenceControllerTest {
assertThat(DoubleTapScreenPreferenceController.isSuggestionComplete(
mAmbientDisplayConfiguration, prefs)).isTrue();
}
@Test
public void canHandleClicks_falseWhenAlwaysOnEnabled() {
when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
assertThat(mController.canHandleClicks()).isFalse();
}
@Test
public void canHandleClicks_trueWhenAlwaysOnDisabled() {
when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(false);
assertThat(mController.canHandleClicks()).isTrue();
}
}

View File

@@ -1,102 +0,0 @@
/*
* Copyright (C) 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.
*/
package com.android.settings.print;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.res.Resources;
import android.print.PrintJob;
import android.print.PrintJobInfo;
import android.print.PrintManager;
import android.printservice.PrintServiceInfo;
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class PrintSettingsFragmentTest {
@Mock
private PrintSettingsFragment.PrintSummaryProvider.PrintManagerWrapper mPrintManager;
@Mock
private Activity mActivity;
@Mock
private Resources mRes;
@Mock
private SummaryLoader mSummaryLoader;
private SummaryLoader.SummaryProvider mSummaryProvider;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mActivity.getResources()).thenReturn(mRes);
mSummaryProvider = new PrintSettingsFragment.PrintSummaryProvider(mActivity, mSummaryLoader,
mPrintManager);
}
@Test
public void testSummary_hasActiveJob_shouldSetSummaryToNumberOfJobs() {
final List<PrintJob> printJobs = new ArrayList<>();
final PrintJob job = mock(PrintJob.class, Mockito.RETURNS_DEEP_STUBS);
printJobs.add(job);
when(job.getInfo().getState()).thenReturn(PrintJobInfo.STATE_STARTED);
when(mPrintManager.getPrintJobs()).thenReturn(printJobs);
mSummaryProvider.setListening(true);
verify(mRes).getQuantityString(R.plurals.print_jobs_summary, 1, 1);
}
@Test
public void testSummary_shouldSetSummaryToNumberOfPrintServices() {
final List<PrintServiceInfo> printServices = mock(List.class);
when(printServices.isEmpty()).thenReturn(false);
when(printServices.size()).thenReturn(2);
// 2 services
when(mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES))
.thenReturn(printServices);
mSummaryProvider.setListening(true);
verify(mRes).getQuantityString(R.plurals.print_settings_summary, 2, 2);
// No service
when(mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES)).thenReturn(null);
mSummaryProvider.setListening(true);
verify(mActivity).getString(R.string.print_settings_summary_no_service);
}
}

View File

@@ -0,0 +1,125 @@
/*
* Copyright (C) 2018 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.
*/
package com.android.settings.print;
import static android.arch.lifecycle.Lifecycle.Event.ON_START;
import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.print.PrintJob;
import android.print.PrintJobInfo;
import android.print.PrintManager;
import android.printservice.PrintServiceInfo;
import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.wrapper.PrintManagerWrapper;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class PrintSettingsPreferenceControllerTest {
@Mock
private PrintManagerWrapper mPrintManager;
private Context mContext;
private Preference mPreference;
private PrintSettingPreferenceController mController;
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mPreference = new Preference(mContext);
mController = new PrintSettingPreferenceController(mContext);
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
ReflectionHelpers.setField(mController, "mPrintManager", mPrintManager);
mLifecycle.addObserver(mController);
}
@Test
public void onStartStop_shouldRegisterPrintStateListener() {
mLifecycle.handleLifecycleEvent(ON_START);
mLifecycle.handleLifecycleEvent(ON_STOP);
verify(mPrintManager).addPrintJobStateChanegListener(mController);
verify(mPrintManager).removePrintJobStateChangeListener(mController);
}
@Test
public void updateState_hasActiveJob_shouldSetSummaryToNumberOfJobs() {
final List<PrintJob> printJobs = new ArrayList<>();
final PrintJob job = mock(PrintJob.class, Mockito.RETURNS_DEEP_STUBS);
printJobs.add(job);
when(job.getInfo().getState()).thenReturn(PrintJobInfo.STATE_STARTED);
when(mPrintManager.getPrintJobs()).thenReturn(printJobs);
mController.updateState(mPreference);
assertThat(mPreference.getSummary())
.isEqualTo(mContext.getResources()
.getQuantityString(R.plurals.print_jobs_summary, 1, 1));
}
@Test
public void updateState_shouldSetSummaryToNumberOfPrintServices() {
final List<PrintServiceInfo> printServices = mock(List.class);
when(printServices.isEmpty()).thenReturn(false);
when(printServices.size()).thenReturn(2);
// 2 services
when(mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES))
.thenReturn(printServices);
mController.updateState(mPreference);
assertThat(mPreference.getSummary())
.isEqualTo(mContext.getResources()
.getQuantityString(R.plurals.print_settings_summary, 2, 2));
// No service
when(mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES)).thenReturn(null);
mController.updateState(mPreference);
assertThat(mPreference.getSummary())
.isEqualTo(mContext.getString(R.string.print_settings_summary_no_service));
}
}

View File

@@ -24,7 +24,6 @@ import android.content.Context;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider;
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
@@ -61,7 +60,6 @@ public class FakeFeatureFactory extends FeatureFactory {
public final UserFeatureProvider userFeatureProvider;
public final AssistGestureFeatureProvider assistGestureFeatureProvider;
public final BluetoothFeatureProvider bluetoothFeatureProvider;
public final SmsMirroringFeatureProvider smsMirroringFeatureProvider;
public final SlicesFeatureProvider slicesFeatureProvider;
public SearchFeatureProvider searchFeatureProvider;
public final AccountFeatureProvider mAccountFeatureProvider;
@@ -101,7 +99,6 @@ public class FakeFeatureFactory extends FeatureFactory {
userFeatureProvider = mock(UserFeatureProvider.class);
assistGestureFeatureProvider = mock(AssistGestureFeatureProvider.class);
bluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
smsMirroringFeatureProvider = mock(SmsMirroringFeatureProvider.class);
slicesFeatureProvider = mock(SlicesFeatureProvider.class);
mAccountFeatureProvider = mock(AccountFeatureProvider.class);
}
@@ -176,11 +173,6 @@ public class FakeFeatureFactory extends FeatureFactory {
return assistGestureFeatureProvider;
}
@Override
public SmsMirroringFeatureProvider getSmsMirroringFeatureProvider() {
return smsMirroringFeatureProvider;
}
@Override
public SlicesFeatureProvider getSlicesFeatureProvider() {
return slicesFeatureProvider;

View File

@@ -74,7 +74,6 @@ public class UniquePreferenceTest {
"toggle_bluetooth",
"toggle_nfc",
"android_beam_settings",
"sms_mirroring",
// Dup keys from About Phone v2 experiment.
"ims_reg_state",
"bt_address",