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.os.Bundle;
21import android.print.PrintJob;
22import android.print.PrintJobId;
23import android.print.PrintJobInfo;
24import android.print.PrintManager;
25import android.print.PrintManager.PrintJobStateChangeListener;
26import android.support.v7.preference.Preference;
27import android.text.TextUtils;
28import android.text.format.DateUtils;
29import android.view.LayoutInflater;
30import android.view.Menu;
31import android.view.MenuInflater;
32import android.view.MenuItem;
33import android.view.View;
34
35import android.view.ViewGroup;
36import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
37import com.android.settings.R;
38import com.android.settings.SettingsPreferenceFragment;
39
40import java.text.DateFormat;
41
42/**
43 * Fragment for management of a print job.
44 */
45public 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    public 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