• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.print;
18 
19 import android.content.Context;
20 import android.content.res.TypedArray;
21 import android.graphics.drawable.Drawable;
22 import android.os.Bundle;
23 import android.print.PrintJob;
24 import android.print.PrintJobId;
25 import android.print.PrintJobInfo;
26 import android.print.PrintManager;
27 import android.print.PrintManager.PrintJobStateChangeListener;
28 import android.support.v7.preference.Preference;
29 import android.text.TextUtils;
30 import android.text.format.DateUtils;
31 import android.util.Log;
32 import android.view.LayoutInflater;
33 import android.view.Menu;
34 import android.view.MenuInflater;
35 import android.view.MenuItem;
36 import android.view.View;
37 import android.view.ViewGroup;
38 
39 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
40 import com.android.settings.R;
41 import com.android.settings.SettingsPreferenceFragment;
42 
43 import java.text.DateFormat;
44 
45 /**
46  * Fragment for management of a print job.
47  */
48 public class PrintJobSettingsFragment extends SettingsPreferenceFragment {
49     private static final String LOG_TAG = PrintJobSettingsFragment.class.getSimpleName();
50 
51     private static final int MENU_ITEM_ID_CANCEL = 1;
52     private static final int MENU_ITEM_ID_RESTART = 2;
53 
54     private static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID";
55 
56     private static final String PRINT_JOB_PREFERENCE = "print_job_preference";
57     private static final String PRINT_JOB_MESSAGE_PREFERENCE = "print_job_message_preference";
58 
59     private final PrintJobStateChangeListener mPrintJobStateChangeListener =
60             new PrintJobStateChangeListener() {
61         @Override
62         public void onPrintJobStateChanged(PrintJobId printJobId) {
63             updateUi();
64         }
65     };
66 
67     private PrintManager mPrintManager;
68 
69     private Preference mPrintJobPreference;
70     private Preference mMessagePreference;
71 
72     private PrintJobId mPrintJobId;
73 
74     @Override
getMetricsCategory()75     public int getMetricsCategory() {
76         return MetricsEvent.PRINT_JOB_SETTINGS;
77     }
78 
79     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)80     public View onCreateView(LayoutInflater inflater, ViewGroup container,
81             Bundle savedInstanceState) {
82         View view = super.onCreateView(inflater, container, savedInstanceState);
83 
84         addPreferencesFromResource(R.xml.print_job_settings);
85         mPrintJobPreference = findPreference(PRINT_JOB_PREFERENCE);
86         mMessagePreference = findPreference(PRINT_JOB_MESSAGE_PREFERENCE);
87 
88         mPrintManager = ((PrintManager) getActivity().getSystemService(
89                 Context.PRINT_SERVICE)).getGlobalPrintManagerForUser(
90                         getActivity().getUserId());
91 
92         getActivity().getActionBar().setTitle(R.string.print_print_job);
93 
94         processArguments();
95 
96         setHasOptionsMenu(true);
97 
98         return  view;
99     }
100 
101     @Override
onViewCreated(View view, Bundle savedInstanceState)102     public void onViewCreated(View view, Bundle savedInstanceState) {
103         super.onViewCreated(view, savedInstanceState);
104         getListView().setEnabled(false);
105     }
106 
107     @Override
onStart()108     public void onStart() {
109         super.onStart();
110         mPrintManager.addPrintJobStateChangeListener(
111                 mPrintJobStateChangeListener);
112         updateUi();
113     }
114 
115     @Override
onStop()116     public void onStop() {
117         super.onStop();
118         mPrintManager.removePrintJobStateChangeListener(
119                 mPrintJobStateChangeListener);
120     }
121 
122     @Override
onCreateOptionsMenu(Menu menu, MenuInflater inflater)123     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
124         super.onCreateOptionsMenu(menu, inflater);
125 
126         PrintJob printJob = getPrintJob();
127         if (printJob == null) {
128             return;
129         }
130 
131         if (!printJob.getInfo().isCancelling()) {
132             MenuItem cancel = menu.add(0, MENU_ITEM_ID_CANCEL, Menu.NONE,
133                     getString(R.string.print_cancel));
134             cancel.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
135         }
136 
137         if (printJob.isFailed()) {
138             MenuItem restart = menu.add(0, MENU_ITEM_ID_RESTART, Menu.NONE,
139                     getString(R.string.print_restart));
140             restart.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
141         }
142     }
143 
144     @Override
onOptionsItemSelected(MenuItem item)145     public boolean onOptionsItemSelected(MenuItem item) {
146         PrintJob printJob = getPrintJob();
147 
148         if (printJob != null) {
149             switch (item.getItemId()) {
150                 case MENU_ITEM_ID_CANCEL: {
151                     printJob.cancel();
152                     finish();
153                     return true;
154                 }
155 
156                 case MENU_ITEM_ID_RESTART: {
157                     printJob.restart();
158                     finish();
159                     return true;
160                 }
161             }
162         }
163 
164         return super.onOptionsItemSelected(item);
165     }
166 
processArguments()167     private void processArguments() {
168         String printJobId = getArguments().getString(EXTRA_PRINT_JOB_ID);
169         if (printJobId == null) {
170             printJobId = getIntent().getStringExtra(EXTRA_PRINT_JOB_ID);
171 
172             if (printJobId == null) {
173                 Log.w(LOG_TAG, EXTRA_PRINT_JOB_ID + " not set");
174                 finish();
175                 return;
176             }
177         }
178 
179 
180         mPrintJobId = PrintJobId.unflattenFromString(printJobId);
181     }
182 
getPrintJob()183     private PrintJob getPrintJob() {
184         return mPrintManager.getPrintJob(mPrintJobId);
185     }
186 
updateUi()187     private void updateUi() {
188         PrintJob printJob = getPrintJob();
189 
190         if (printJob == null) {
191             finish();
192             return;
193         }
194 
195         if (printJob.isCancelled() || printJob.isCompleted()) {
196             finish();
197             return;
198         }
199 
200         PrintJobInfo info = printJob.getInfo();
201 
202         switch (info.getState()) {
203             case PrintJobInfo.STATE_CREATED: {
204                 mPrintJobPreference.setTitle(getString(
205                         R.string.print_configuring_state_title_template, info.getLabel()));
206             } break;
207             case PrintJobInfo.STATE_QUEUED:
208             case PrintJobInfo.STATE_STARTED: {
209                 if (!printJob.getInfo().isCancelling()) {
210                     mPrintJobPreference.setTitle(getString(
211                             R.string.print_printing_state_title_template, info.getLabel()));
212                 } else {
213                     mPrintJobPreference.setTitle(getString(
214                             R.string.print_cancelling_state_title_template, info.getLabel()));
215                 }
216             } break;
217 
218             case PrintJobInfo.STATE_FAILED: {
219                 mPrintJobPreference.setTitle(getString(
220                         R.string.print_failed_state_title_template, info.getLabel()));
221             } break;
222 
223             case PrintJobInfo.STATE_BLOCKED: {
224                 if (!printJob.getInfo().isCancelling()) {
225                     mPrintJobPreference.setTitle(getString(
226                             R.string.print_blocked_state_title_template, info.getLabel()));
227                 } else {
228                     mPrintJobPreference.setTitle(getString(
229                             R.string.print_cancelling_state_title_template, info.getLabel()));
230                 }
231             } break;
232         }
233 
234         mPrintJobPreference.setSummary(getString(R.string.print_job_summary,
235                 info.getPrinterName(), DateUtils.formatSameDayTime(
236                         info.getCreationTime(), info.getCreationTime(), DateFormat.SHORT,
237                         DateFormat.SHORT)));
238 
239         TypedArray a = getActivity().obtainStyledAttributes(new int[]{
240                 android.R.attr.colorControlNormal});
241         int tintColor = a.getColor(0, 0);
242         a.recycle();
243 
244         switch (info.getState()) {
245             case PrintJobInfo.STATE_QUEUED:
246             case PrintJobInfo.STATE_STARTED: {
247                 Drawable icon = getActivity().getDrawable(com.android.internal.R.drawable.ic_print);
248                 icon.setTint(tintColor);
249                 mPrintJobPreference.setIcon(icon);
250                 break;
251             }
252 
253             case PrintJobInfo.STATE_FAILED:
254             case PrintJobInfo.STATE_BLOCKED: {
255                 Drawable icon = getActivity().getDrawable(
256                         com.android.internal.R.drawable.ic_print_error);
257                 icon.setTint(tintColor);
258                 mPrintJobPreference.setIcon(icon);
259                 break;
260             }
261         }
262 
263         CharSequence status = info.getStatus(getPackageManager());
264         if (!TextUtils.isEmpty(status)) {
265             if (getPreferenceScreen().findPreference(PRINT_JOB_MESSAGE_PREFERENCE) == null) {
266                 getPreferenceScreen().addPreference(mMessagePreference);
267             }
268             mMessagePreference.setSummary(status);
269         } else {
270             getPreferenceScreen().removePreference(mMessagePreference);
271         }
272 
273         getActivity().invalidateOptionsMenu();
274     }
275 }
276