diff --git a/res/xml/print_job_settings.xml b/res/xml/print_job_settings.xml
index 32a80a73d09..877cd628689 100644
--- a/res/xml/print_job_settings.xml
+++ b/res/xml/print_job_settings.xml
@@ -19,13 +19,16 @@
android:title="@string/print_print_job">
+ android:key="print_job_preference"
+ android:title="@string/print_print_job"
+ settings:controller="com.android.settings.print.PrintJobPreferenceController">
+ android:selectable="false"
+ settings:controller="com.android.settings.print.PrintJobMessagePreferenceController">
diff --git a/src/com/android/settings/print/PrintJobMessagePreferenceController.java b/src/com/android/settings/print/PrintJobMessagePreferenceController.java
new file mode 100644
index 00000000000..9573e5d6007
--- /dev/null
+++ b/src/com/android/settings/print/PrintJobMessagePreferenceController.java
@@ -0,0 +1,47 @@
+/*
+ * 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.print.PrintJob;
+import android.print.PrintJobInfo;
+import android.text.TextUtils;
+
+public class PrintJobMessagePreferenceController extends PrintJobPreferenceControllerBase {
+
+ public PrintJobMessagePreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ protected void updateUi() {
+ final PrintJob printJob = getPrintJob();
+
+ if (printJob == null) {
+ mFragment.finish();
+ return;
+ }
+
+ if (printJob.isCancelled() || printJob.isCompleted()) {
+ mFragment.finish();
+ return;
+ }
+
+ final PrintJobInfo info = printJob.getInfo();
+ final CharSequence status = info.getStatus(mContext.getPackageManager());
+ mPreference.setVisible(!TextUtils.isEmpty(status));
+ mPreference.setSummary(status);
+ }
+}
diff --git a/src/com/android/settings/print/PrintJobPreferenceController.java b/src/com/android/settings/print/PrintJobPreferenceController.java
new file mode 100644
index 00000000000..0eff0d6d612
--- /dev/null
+++ b/src/com/android/settings/print/PrintJobPreferenceController.java
@@ -0,0 +1,115 @@
+/*
+ * 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.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.print.PrintJob;
+import android.print.PrintJobInfo;
+import android.text.format.DateUtils;
+
+import com.android.settings.R;
+
+import java.text.DateFormat;
+
+public class PrintJobPreferenceController extends PrintJobPreferenceControllerBase {
+
+ public PrintJobPreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ protected void updateUi() {
+ final PrintJob printJob = getPrintJob();
+
+ if (printJob == null) {
+ mFragment.finish();
+ return;
+ }
+
+ if (printJob.isCancelled() || printJob.isCompleted()) {
+ mFragment.finish();
+ return;
+ }
+
+ PrintJobInfo info = printJob.getInfo();
+
+ switch (info.getState()) {
+ case PrintJobInfo.STATE_CREATED: {
+ mPreference.setTitle(mContext.getString(
+ R.string.print_configuring_state_title_template, info.getLabel()));
+ }
+ break;
+ case PrintJobInfo.STATE_QUEUED:
+ case PrintJobInfo.STATE_STARTED: {
+ if (!printJob.getInfo().isCancelling()) {
+ mPreference.setTitle(mContext.getString(
+ R.string.print_printing_state_title_template, info.getLabel()));
+ } else {
+ mPreference.setTitle(mContext.getString(
+ R.string.print_cancelling_state_title_template, info.getLabel()));
+ }
+ }
+ break;
+
+ case PrintJobInfo.STATE_FAILED: {
+ mPreference.setTitle(mContext.getString(
+ R.string.print_failed_state_title_template, info.getLabel()));
+ }
+ break;
+
+ case PrintJobInfo.STATE_BLOCKED: {
+ if (!printJob.getInfo().isCancelling()) {
+ mPreference.setTitle(mContext.getString(
+ R.string.print_blocked_state_title_template, info.getLabel()));
+ } else {
+ mPreference.setTitle(mContext.getString(
+ R.string.print_cancelling_state_title_template, info.getLabel()));
+ }
+ }
+ break;
+ }
+
+ mPreference.setSummary(mContext.getString(R.string.print_job_summary,
+ info.getPrinterName(), DateUtils.formatSameDayTime(
+ info.getCreationTime(), info.getCreationTime(), DateFormat.SHORT,
+ DateFormat.SHORT)));
+
+ TypedArray a = mContext.obtainStyledAttributes(new int[]{
+ android.R.attr.colorControlNormal});
+ int tintColor = a.getColor(0, 0);
+ a.recycle();
+
+ switch (info.getState()) {
+ case PrintJobInfo.STATE_QUEUED:
+ case PrintJobInfo.STATE_STARTED: {
+ Drawable icon = mContext.getDrawable(com.android.internal.R.drawable.ic_print);
+ icon.setTint(tintColor);
+ mPreference.setIcon(icon);
+ break;
+ }
+
+ case PrintJobInfo.STATE_FAILED:
+ case PrintJobInfo.STATE_BLOCKED: {
+ Drawable icon = mContext.getDrawable(
+ com.android.internal.R.drawable.ic_print_error);
+ icon.setTint(tintColor);
+ mPreference.setIcon(icon);
+ break;
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/print/PrintJobPreferenceControllerBase.java b/src/com/android/settings/print/PrintJobPreferenceControllerBase.java
new file mode 100644
index 00000000000..0726a19f4d1
--- /dev/null
+++ b/src/com/android/settings/print/PrintJobPreferenceControllerBase.java
@@ -0,0 +1,99 @@
+/*
+ * 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.print.PrintJob;
+import android.print.PrintJobId;
+import android.print.PrintManager;
+import android.util.Log;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+public abstract class PrintJobPreferenceControllerBase extends BasePreferenceController implements
+ LifecycleObserver, OnStart, OnStop, PrintManager.PrintJobStateChangeListener {
+ private static final String TAG = "PrintJobPrefCtrlBase";
+
+ private static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID";
+
+ private final PrintManager mPrintManager;
+ protected Preference mPreference;
+ protected PrintJobSettingsFragment mFragment;
+ protected PrintJobId mPrintJobId;
+
+ public PrintJobPreferenceControllerBase(Context context, String key) {
+ super(context, key);
+ mPrintManager = ((PrintManager) mContext.getSystemService(
+ Context.PRINT_SERVICE)).getGlobalPrintManagerForUser(mContext.getUserId());
+ }
+
+ @Override
+ public void onStart() {
+ mPrintManager.addPrintJobStateChangeListener(this);
+ updateUi();
+ }
+
+ @Override
+ public void onStop() {
+ mPrintManager.removePrintJobStateChangeListener(this);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void onPrintJobStateChanged(PrintJobId printJobId) {
+ updateUi();
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ public void init(PrintJobSettingsFragment fragment) {
+ mFragment = fragment;
+ processArguments();
+ }
+
+ protected PrintJob getPrintJob() {
+ return mPrintManager.getPrintJob(mPrintJobId);
+ }
+
+ protected abstract void updateUi();
+
+ private void processArguments() {
+ String printJobId = mFragment.getArguments().getString(EXTRA_PRINT_JOB_ID);
+ if (printJobId == null) {
+ printJobId = mFragment.getActivity().getIntent().getStringExtra(EXTRA_PRINT_JOB_ID);
+
+ if (printJobId == null) {
+ Log.w(TAG, EXTRA_PRINT_JOB_ID + " not set");
+ mFragment.finish();
+ return;
+ }
+ }
+ mPrintJobId = PrintJobId.unflattenFromString(printJobId);
+ }
+}
diff --git a/src/com/android/settings/print/PrintJobSettingsFragment.java b/src/com/android/settings/print/PrintJobSettingsFragment.java
index ba0172ba560..1d6ff5a1451 100644
--- a/src/com/android/settings/print/PrintJobSettingsFragment.java
+++ b/src/com/android/settings/print/PrintJobSettingsFragment.java
@@ -17,114 +17,59 @@
package com.android.settings.print;
import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.print.PrintJob;
-import android.print.PrintJobId;
-import android.print.PrintJobInfo;
-import android.print.PrintManager;
-import android.print.PrintManager.PrintJobStateChangeListener;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.preference.Preference;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
-
-import java.text.DateFormat;
+import com.android.settings.dashboard.DashboardFragment;
/**
* Fragment for management of a print job.
*/
-public class PrintJobSettingsFragment extends SettingsPreferenceFragment {
- private static final String LOG_TAG = PrintJobSettingsFragment.class.getSimpleName();
+public class PrintJobSettingsFragment extends DashboardFragment {
+ private static final String TAG = "PrintJobSettingsFragment";
private static final int MENU_ITEM_ID_CANCEL = 1;
private static final int MENU_ITEM_ID_RESTART = 2;
- private static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID";
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.print_job_settings;
+ }
- private static final String PRINT_JOB_PREFERENCE = "print_job_preference";
- private static final String PRINT_JOB_MESSAGE_PREFERENCE = "print_job_message_preference";
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
- private final PrintJobStateChangeListener mPrintJobStateChangeListener =
- new PrintJobStateChangeListener() {
- @Override
- public void onPrintJobStateChanged(PrintJobId printJobId) {
- updateUi();
- }
- };
-
- private PrintManager mPrintManager;
-
- private Preference mPrintJobPreference;
- private Preference mMessagePreference;
-
- private PrintJobId mPrintJobId;
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ use(PrintJobPreferenceController.class).init(this);
+ use(PrintJobMessagePreferenceController.class).init(this);
+ }
@Override
public int getMetricsCategory() {
return MetricsEvent.PRINT_JOB_SETTINGS;
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = super.onCreateView(inflater, container, savedInstanceState);
-
- addPreferencesFromResource(R.xml.print_job_settings);
- mPrintJobPreference = findPreference(PRINT_JOB_PREFERENCE);
- mMessagePreference = findPreference(PRINT_JOB_MESSAGE_PREFERENCE);
-
- mPrintManager = ((PrintManager) getActivity().getSystemService(
- Context.PRINT_SERVICE)).getGlobalPrintManagerForUser(
- getActivity().getUserId());
-
- getActivity().getActionBar().setTitle(R.string.print_print_job);
-
- processArguments();
-
- setHasOptionsMenu(true);
-
- return view;
- }
-
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getListView().setEnabled(false);
}
- @Override
- public void onStart() {
- super.onStart();
- mPrintManager.addPrintJobStateChangeListener(
- mPrintJobStateChangeListener);
- updateUi();
- }
-
- @Override
- public void onStop() {
- super.onStop();
- mPrintManager.removePrintJobStateChangeListener(
- mPrintJobStateChangeListener);
- }
-
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
- PrintJob printJob = getPrintJob();
+ final PrintJob printJob = use(PrintJobPreferenceController.class).getPrintJob();
if (printJob == null) {
return;
}
@@ -144,7 +89,7 @@ public class PrintJobSettingsFragment extends SettingsPreferenceFragment {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- PrintJob printJob = getPrintJob();
+ final PrintJob printJob = use(PrintJobPreferenceController.class).getPrintJob();
if (printJob != null) {
switch (item.getItemId()) {
@@ -164,113 +109,4 @@ public class PrintJobSettingsFragment extends SettingsPreferenceFragment {
return super.onOptionsItemSelected(item);
}
-
- private void processArguments() {
- String printJobId = getArguments().getString(EXTRA_PRINT_JOB_ID);
- if (printJobId == null) {
- printJobId = getIntent().getStringExtra(EXTRA_PRINT_JOB_ID);
-
- if (printJobId == null) {
- Log.w(LOG_TAG, EXTRA_PRINT_JOB_ID + " not set");
- finish();
- return;
- }
- }
-
-
- mPrintJobId = PrintJobId.unflattenFromString(printJobId);
- }
-
- private PrintJob getPrintJob() {
- return mPrintManager.getPrintJob(mPrintJobId);
- }
-
- private void updateUi() {
- PrintJob printJob = getPrintJob();
-
- if (printJob == null) {
- finish();
- return;
- }
-
- if (printJob.isCancelled() || printJob.isCompleted()) {
- finish();
- return;
- }
-
- PrintJobInfo info = printJob.getInfo();
-
- switch (info.getState()) {
- case PrintJobInfo.STATE_CREATED: {
- mPrintJobPreference.setTitle(getString(
- R.string.print_configuring_state_title_template, info.getLabel()));
- } break;
- case PrintJobInfo.STATE_QUEUED:
- case PrintJobInfo.STATE_STARTED: {
- if (!printJob.getInfo().isCancelling()) {
- mPrintJobPreference.setTitle(getString(
- R.string.print_printing_state_title_template, info.getLabel()));
- } else {
- mPrintJobPreference.setTitle(getString(
- R.string.print_cancelling_state_title_template, info.getLabel()));
- }
- } break;
-
- case PrintJobInfo.STATE_FAILED: {
- mPrintJobPreference.setTitle(getString(
- R.string.print_failed_state_title_template, info.getLabel()));
- } break;
-
- case PrintJobInfo.STATE_BLOCKED: {
- if (!printJob.getInfo().isCancelling()) {
- mPrintJobPreference.setTitle(getString(
- R.string.print_blocked_state_title_template, info.getLabel()));
- } else {
- mPrintJobPreference.setTitle(getString(
- R.string.print_cancelling_state_title_template, info.getLabel()));
- }
- } break;
- }
-
- mPrintJobPreference.setSummary(getString(R.string.print_job_summary,
- info.getPrinterName(), DateUtils.formatSameDayTime(
- info.getCreationTime(), info.getCreationTime(), DateFormat.SHORT,
- DateFormat.SHORT)));
-
- TypedArray a = getActivity().obtainStyledAttributes(new int[]{
- android.R.attr.colorControlNormal});
- int tintColor = a.getColor(0, 0);
- a.recycle();
-
- switch (info.getState()) {
- case PrintJobInfo.STATE_QUEUED:
- case PrintJobInfo.STATE_STARTED: {
- Drawable icon = getActivity().getDrawable(com.android.internal.R.drawable.ic_print);
- icon.setTint(tintColor);
- mPrintJobPreference.setIcon(icon);
- break;
- }
-
- case PrintJobInfo.STATE_FAILED:
- case PrintJobInfo.STATE_BLOCKED: {
- Drawable icon = getActivity().getDrawable(
- com.android.internal.R.drawable.ic_print_error);
- icon.setTint(tintColor);
- mPrintJobPreference.setIcon(icon);
- break;
- }
- }
-
- CharSequence status = info.getStatus(getPackageManager());
- if (!TextUtils.isEmpty(status)) {
- if (getPreferenceScreen().findPreference(PRINT_JOB_MESSAGE_PREFERENCE) == null) {
- getPreferenceScreen().addPreference(mMessagePreference);
- }
- mMessagePreference.setSummary(status);
- } else {
- getPreferenceScreen().removePreference(mMessagePreference);
- }
-
- getActivity().invalidateOptionsMenu();
- }
}
diff --git a/tests/robotests/src/com/android/settings/print/PrintJobMessagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/print/PrintJobMessagePreferenceControllerTest.java
new file mode 100644
index 00000000000..50dd38b183b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/print/PrintJobMessagePreferenceControllerTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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 androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.print.PrintJob;
+import android.print.PrintJobInfo;
+import android.print.PrintManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+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.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class PrintJobMessagePreferenceControllerTest {
+ private static final String PREF_KEY = "print_job_message_preference";
+
+ @Mock
+ private PrintManager mPrintManager;
+ @Mock
+ private PrintJob mPrintJob;
+ @Mock
+ private PrintJobInfo mPrintJobInfo;
+ @Mock
+ private PreferenceScreen mScreen;
+
+ private Context mContext;
+ private PrintJobMessagePreferenceController mController;
+ private Preference mPreference;
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ mPreference = new Preference(mContext);
+ when(mContext.getSystemService(Context.PRINT_SERVICE)).thenReturn(mPrintManager);
+ when(mPrintManager.getGlobalPrintManagerForUser(anyInt())).thenReturn(mPrintManager);
+ when(mPrintManager.getPrintJob(anyObject())).thenReturn(mPrintJob);
+ when(mPrintJob.getInfo()).thenReturn(mPrintJobInfo);
+ mController = new PrintJobMessagePreferenceController(mContext, PREF_KEY);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+ mController.displayPreference(mScreen);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mLifecycle.addObserver(mController);
+ }
+
+ @Test
+ public void onStartStop_shouldRegisterPrintStateListener() {
+ mLifecycle.handleLifecycleEvent(ON_START);
+ mLifecycle.handleLifecycleEvent(ON_STOP);
+
+ verify(mPrintManager).addPrintJobStateChangeListener(mController);
+ verify(mPrintManager).removePrintJobStateChangeListener(mController);
+ }
+
+ @Test
+ public void updateUi_visiblePreference() {
+ when(mPrintJobInfo.getStatus(anyObject())).thenReturn("TestPrint");
+ mLifecycle.handleLifecycleEvent(ON_START);
+
+ assertThat(mPreference.isVisible()).isTrue();
+
+ mLifecycle.handleLifecycleEvent(ON_STOP);
+ }
+
+ @Test
+ public void updateUi_invisiblePreference() {
+ when(mPrintJobInfo.getStatus(anyObject())).thenReturn(null);
+ mLifecycle.handleLifecycleEvent(ON_START);
+
+ assertThat(mPreference.isVisible()).isFalse();
+
+ mLifecycle.handleLifecycleEvent(ON_STOP);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/print/PrintJobPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/print/PrintJobPreferenceControllerTest.java
new file mode 100644
index 00000000000..fc92eb3cc8f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/print/PrintJobPreferenceControllerTest.java
@@ -0,0 +1,189 @@
+/*
+ * 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 androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.print.PrintJob;
+import android.print.PrintJobInfo;
+import android.print.PrintManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+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.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class PrintJobPreferenceControllerTest {
+ private static final String PREF_KEY = "print_job_preference";
+
+ @Mock
+ private PrintManager mPrintManager;
+ @Mock
+ private PrintJob mPrintJob;
+ @Mock
+ private PrintJobInfo mPrintJobInfo;
+ @Mock
+ private PreferenceScreen mScreen;
+
+ private Context mContext;
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+ private PrintJobPreferenceController mController;
+ private Preference mPreference;
+ private String mTestLabel;
+
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ mPreference = new Preference(mContext);
+ mTestLabel = "PrintTest";
+ when(mContext.getSystemService(Context.PRINT_SERVICE)).thenReturn(mPrintManager);
+ when(mPrintManager.getGlobalPrintManagerForUser(anyInt())).thenReturn(mPrintManager);
+ when(mPrintManager.getPrintJob(anyObject())).thenReturn(mPrintJob);
+ when(mPrintJob.getInfo()).thenReturn(mPrintJobInfo);
+ mController = new PrintJobPreferenceController(mContext, PREF_KEY);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+ when(mPrintJobInfo.getLabel()).thenReturn(mTestLabel);
+ mController.displayPreference(mScreen);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mLifecycle.addObserver(mController);
+ }
+
+ @Test
+ public void onStartStop_shouldRegisterPrintStateListener() {
+ mLifecycle.handleLifecycleEvent(ON_START);
+ mLifecycle.handleLifecycleEvent(ON_STOP);
+
+ verify(mPrintManager).addPrintJobStateChangeListener(mController);
+ verify(mPrintManager).removePrintJobStateChangeListener(mController);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_CREATED() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_CREATED);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_configuring_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_QUEUED() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_QUEUED);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_printing_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_STARTED() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_STARTED);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_printing_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_QUEUED_and_jobInfo_CANCELLING() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_QUEUED);
+ when(mPrintJobInfo.isCancelling()).thenReturn(true);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_cancelling_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_STARTED_and_jobInfo_CANCELLING() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_STARTED);
+ when(mPrintJobInfo.isCancelling()).thenReturn(true);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_cancelling_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_FAILED() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_FAILED);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_failed_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_BLOCKED() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_BLOCKED);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_blocked_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void updateUi_jobState_STATE_BLOCKED_and_jobInfo_CANCELLING() {
+ when(mPrintJobInfo.getState()).thenReturn(PrintJobInfo.STATE_BLOCKED);
+ when(mPrintJobInfo.isCancelling()).thenReturn(true);
+
+ mController.onStart();
+ String title = mContext.getString(
+ R.string.print_cancelling_state_title_template, mTestLabel);
+
+ assertThat(mPreference.getTitle()).isEqualTo(title);
+ }
+}