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