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