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 17package com.android.settings.print; 18 19import android.content.Context; 20import android.graphics.drawable.Drawable; 21import android.os.Bundle; 22import android.preference.Preference; 23import android.print.PrintJob; 24import android.print.PrintJobId; 25import android.print.PrintJobInfo; 26import android.print.PrintManager; 27import android.print.PrintManager.PrintJobStateChangeListener; 28import android.text.TextUtils; 29import android.text.format.DateUtils; 30import android.view.Menu; 31import android.view.MenuInflater; 32import android.view.MenuItem; 33import android.view.View; 34 35import com.android.internal.logging.MetricsLogger; 36import com.android.settings.R; 37import com.android.settings.SettingsPreferenceFragment; 38 39import java.text.DateFormat; 40 41/** 42 * Fragment for management of a print job. 43 */ 44public class PrintJobSettingsFragment extends SettingsPreferenceFragment { 45 private static final int MENU_ITEM_ID_CANCEL = 1; 46 private static final int MENU_ITEM_ID_RESTART = 2; 47 48 private static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID"; 49 50 private static final String PRINT_JOB_PREFERENCE = "print_job_preference"; 51 private static final String PRINT_JOB_MESSAGE_PREFERENCE = "print_job_message_preference"; 52 53 private Drawable mListDivider; 54 55 private final PrintJobStateChangeListener mPrintJobStateChangeListener = 56 new PrintJobStateChangeListener() { 57 @Override 58 public void onPrintJobStateChanged(PrintJobId printJobId) { 59 updateUi(); 60 } 61 }; 62 63 private PrintManager mPrintManager; 64 65 private Preference mPrintJobPreference; 66 private Preference mMessagePreference; 67 68 private PrintJobId mPrintJobId; 69 private PrintJob mPrintJob; 70 71 @Override 72 protected int getMetricsCategory() { 73 return MetricsLogger.PRINT_JOB_SETTINGS; 74 } 75 76 @Override 77 public void onCreate(Bundle icicle) { 78 super.onCreate(icicle); 79 80 addPreferencesFromResource(R.xml.print_job_settings); 81 mPrintJobPreference = findPreference(PRINT_JOB_PREFERENCE); 82 mMessagePreference = findPreference(PRINT_JOB_MESSAGE_PREFERENCE); 83 84 mPrintManager = ((PrintManager) getActivity().getSystemService( 85 Context.PRINT_SERVICE)).getGlobalPrintManagerForUser( 86 getActivity().getUserId()); 87 88 getActivity().getActionBar().setTitle(R.string.print_print_job); 89 90 processArguments(); 91 92 setHasOptionsMenu(true); 93 } 94 95 @Override 96 public void onViewCreated(View view, Bundle savedInstanceState) { 97 super.onViewCreated(view, savedInstanceState); 98 getListView().setEnabled(false); 99 } 100 101 @Override 102 public void onResume() { 103 super.onResume(); 104 mPrintManager.addPrintJobStateChangeListener( 105 mPrintJobStateChangeListener); 106 updateUi(); 107 } 108 109 @Override 110 public void onPause() { 111 super.onPause(); 112 mPrintManager.removePrintJobStateChangeListener( 113 mPrintJobStateChangeListener); 114 } 115 116 @Override 117 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 118 super.onCreateOptionsMenu(menu, inflater); 119 120 PrintJob printJob = getPrintJob(); 121 if (printJob == null) { 122 return; 123 } 124 125 if (!printJob.getInfo().isCancelling()) { 126 MenuItem cancel = menu.add(0, MENU_ITEM_ID_CANCEL, Menu.NONE, 127 getString(R.string.print_cancel)); 128 cancel.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 129 } 130 131 if (printJob.isFailed()) { 132 MenuItem restart = menu.add(0, MENU_ITEM_ID_RESTART, Menu.NONE, 133 getString(R.string.print_restart)); 134 restart.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 135 } 136 } 137 138 @Override 139 public boolean onOptionsItemSelected(MenuItem item) { 140 switch (item.getItemId()) { 141 case MENU_ITEM_ID_CANCEL: { 142 getPrintJob().cancel(); 143 finish(); 144 return true; 145 } 146 147 case MENU_ITEM_ID_RESTART: { 148 getPrintJob().restart(); 149 finish(); 150 return true; 151 } 152 } 153 154 return super.onOptionsItemSelected(item); 155 } 156 157 private void processArguments() { 158 String printJobId = getArguments().getString(EXTRA_PRINT_JOB_ID); 159 mPrintJobId = PrintJobId.unflattenFromString(printJobId); 160 if (mPrintJobId == null) { 161 finish(); 162 } 163 } 164 165 private PrintJob getPrintJob() { 166 if (mPrintJob == null) { 167 mPrintJob = mPrintManager.getPrintJob(mPrintJobId); 168 } 169 return mPrintJob; 170 } 171 172 private void updateUi() { 173 PrintJob printJob = getPrintJob(); 174 175 if (printJob == null) { 176 finish(); 177 return; 178 } 179 180 if (printJob.isCancelled() || printJob.isCompleted()) { 181 finish(); 182 return; 183 } 184 185 PrintJobInfo info = printJob.getInfo(); 186 187 switch (info.getState()) { 188 case PrintJobInfo.STATE_QUEUED: 189 case PrintJobInfo.STATE_STARTED: { 190 if (!printJob.getInfo().isCancelling()) { 191 mPrintJobPreference.setTitle(getString( 192 R.string.print_printing_state_title_template, info.getLabel())); 193 } else { 194 mPrintJobPreference.setTitle(getString( 195 R.string.print_cancelling_state_title_template, info.getLabel())); 196 } 197 } break; 198 199 case PrintJobInfo.STATE_FAILED: { 200 mPrintJobPreference.setTitle(getString( 201 R.string.print_failed_state_title_template, info.getLabel())); 202 } break; 203 204 case PrintJobInfo.STATE_BLOCKED: { 205 if (!printJob.getInfo().isCancelling()) { 206 mPrintJobPreference.setTitle(getString( 207 R.string.print_blocked_state_title_template, info.getLabel())); 208 } else { 209 mPrintJobPreference.setTitle(getString( 210 R.string.print_cancelling_state_title_template, info.getLabel())); 211 } 212 } break; 213 } 214 215 mPrintJobPreference.setSummary(getString(R.string.print_job_summary, 216 info.getPrinterName(), DateUtils.formatSameDayTime( 217 info.getCreationTime(), info.getCreationTime(), DateFormat.SHORT, 218 DateFormat.SHORT))); 219 220 switch (info.getState()) { 221 case PrintJobInfo.STATE_QUEUED: 222 case PrintJobInfo.STATE_STARTED: { 223 mPrintJobPreference.setIcon(R.drawable.ic_print); 224 } break; 225 226 case PrintJobInfo.STATE_FAILED: 227 case PrintJobInfo.STATE_BLOCKED: { 228 mPrintJobPreference.setIcon(R.drawable.ic_print_error); 229 } break; 230 } 231 232 String stateReason = info.getStateReason(); 233 if (!TextUtils.isEmpty(stateReason)) { 234 if (getPreferenceScreen().findPreference(PRINT_JOB_MESSAGE_PREFERENCE) == null) { 235 getPreferenceScreen().addPreference(mMessagePreference); 236 } 237 mMessagePreference.setSummary(stateReason); 238 getListView().setDivider(null); 239 } else { 240 getPreferenceScreen().removePreference(mMessagePreference); 241 getListView().setDivider(mListDivider); 242 } 243 244 getActivity().invalidateOptionsMenu(); 245 } 246} 247