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