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