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().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         if (!mPrintJob.getInfo().isCancelling()) {
    116             MenuItem cancel = menu.add(0, MENU_ITEM_ID_CANCEL, Menu.NONE,
    117                     getString(R.string.print_cancel));
    118             cancel.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    119         }
    120 
    121         if (mPrintJob.isFailed()) {
    122             MenuItem restart = menu.add(0, MENU_ITEM_ID_RESTART, Menu.NONE,
    123                     getString(R.string.print_restart));
    124             restart.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    125         }
    126     }
    127 
    128     @Override
    129     public boolean onOptionsItemSelected(MenuItem item) {
    130         switch (item.getItemId()) {
    131             case MENU_ITEM_ID_CANCEL: {
    132                 mPrintJob.cancel();
    133                 finish();
    134                 return true;
    135             }
    136 
    137             case MENU_ITEM_ID_RESTART: {
    138                 mPrintJob.restart();
    139                 finish();
    140                 return true;
    141             }
    142         }
    143 
    144         return super.onOptionsItemSelected(item);
    145     }
    146 
    147     private void processArguments() {
    148         String printJobId = getArguments().getString(EXTRA_PRINT_JOB_ID);
    149         mPrintJobId = PrintJobId.unflattenFromString(printJobId);
    150         if (mPrintJobId == null) {
    151             finish();
    152         }
    153     }
    154 
    155     private void updateUi() {
    156         mPrintJob = mPrintManager.getPrintJob(mPrintJobId);
    157 
    158         if (mPrintJob == null) {
    159             finish();
    160             return;
    161         }
    162 
    163         if (mPrintJob.isCancelled() || mPrintJob.isCompleted()) {
    164             finish();
    165             return;
    166         }
    167 
    168         PrintJobInfo info = mPrintJob.getInfo();
    169 
    170         switch (info.getState()) {
    171             case PrintJobInfo.STATE_QUEUED:
    172             case PrintJobInfo.STATE_STARTED: {
    173                 if (!mPrintJob.getInfo().isCancelling()) {
    174                     mPrintJobPreference.setTitle(getString(
    175                             R.string.print_printing_state_title_template, info.getLabel()));
    176                 } else {
    177                     mPrintJobPreference.setTitle(getString(
    178                             R.string.print_cancelling_state_title_template, info.getLabel()));
    179                 }
    180             } break;
    181 
    182             case PrintJobInfo.STATE_FAILED: {
    183                 mPrintJobPreference.setTitle(getString(
    184                         R.string.print_failed_state_title_template, info.getLabel()));
    185             } break;
    186 
    187             case PrintJobInfo.STATE_BLOCKED: {
    188                 if (!mPrintJob.getInfo().isCancelling()) {
    189                     mPrintJobPreference.setTitle(getString(
    190                             R.string.print_blocked_state_title_template, info.getLabel()));
    191                 } else {
    192                     mPrintJobPreference.setTitle(getString(
    193                             R.string.print_cancelling_state_title_template, info.getLabel()));
    194                 }
    195             } break;
    196         }
    197 
    198         mPrintJobPreference.setSummary(getString(R.string.print_job_summary,
    199                 info.getPrinterName(), DateUtils.formatSameDayTime(
    200                         info.getCreationTime(), info.getCreationTime(), DateFormat.SHORT,
    201                         DateFormat.SHORT)));
    202 
    203         switch (info.getState()) {
    204             case PrintJobInfo.STATE_QUEUED:
    205             case PrintJobInfo.STATE_STARTED: {
    206                 mPrintJobPreference.setIcon(com.android.internal.R.drawable.ic_print);
    207             } break;
    208 
    209             case PrintJobInfo.STATE_FAILED:
    210             case PrintJobInfo.STATE_BLOCKED: {
    211                 mPrintJobPreference.setIcon(com.android.internal.R.drawable.ic_print_error);
    212             } break;
    213         }
    214 
    215         String stateReason = info.getStateReason();
    216         if (!TextUtils.isEmpty(stateReason)) {
    217             if (getPreferenceScreen().findPreference(PRINT_JOB_MESSAGE_PREFERENCE) == null) {
    218                 getPreferenceScreen().addPreference(mMessagePreference);
    219             }
    220             mMessagePreference.setSummary(stateReason);
    221             getListView().setDivider(null);
    222         } else {
    223             getPreferenceScreen().removePreference(mMessagePreference);
    224             getListView().setDivider(mListDivider);
    225         }
    226 
    227         getActivity().invalidateOptionsMenu();
    228     }
    229 }
    230