blob: 7c147585e31ba3f6a65a9fef1061cde8fdcdaa83 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
* Copyright (C) 2016 Mopria Alliance, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.bips.ui;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.android.bips.BuiltInPrintService;
import com.android.bips.R;
import com.android.bips.discovery.DiscoveredPrinter;
import com.android.bips.discovery.Discovery;
import com.android.bips.discovery.ManualDiscovery;
/**
* Presents a list of printers and the ability to add a new one
*/
public class ManualPrintersFragment extends PreferenceFragment implements ServiceConnection,
Discovery.Listener {
private static final String TAG = ManualPrintersFragment.class.getSimpleName();
private static final boolean DEBUG = false;
private static final int ORDER_LAST = Integer.MAX_VALUE - 1;
private BuiltInPrintService mLocalPrint;
private ManualDiscovery mManualDiscovery;
private AddManualPrinterDialog mDialog;
@Override
public void onCreate(Bundle in) {
if (DEBUG) Log.d(TAG, "onCreate");
super.onCreate(in);
getContext().bindService(new Intent(getContext(), BuiltInPrintService.class), this,
Context.BIND_AUTO_CREATE);
}
@Override
public void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy");
if (mManualDiscovery != null) {
mManualDiscovery.stop(this);
}
getContext().unbindService(this);
super.onDestroy();
}
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
if (DEBUG) Log.d(TAG, "onServiceConnected");
mLocalPrint = BuiltInPrintService.getInstance();
// Set up the UI now that we have a bound service
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
setPreferenceScreen(screen);
AddPrinterPreference addPrinterPreference = new AddPrinterPreference();
screen.addPreference(addPrinterPreference);
registerForContextMenu(getView().findViewById(android.R.id.list));
mManualDiscovery = mLocalPrint.getManualDiscovery();
mManualDiscovery.start(this);
// Simulate a click on add printer since that is likely what the user came here to do.
if (mManualDiscovery.getPrinters().isEmpty()) {
addPrinterPreference.onPreferenceClick(addPrinterPreference);
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mLocalPrint = null;
}
@Override
public void onPrinterFound(DiscoveredPrinter printer) {
if (DEBUG) Log.d(TAG, "onPrinterFound: " + printer);
PreferenceScreen screen = getPreferenceScreen();
// Do not add duplicates
for (int i = 0; i < screen.getPreferenceCount(); i++) {
if (screen.getPreference(i) instanceof ManualPrinterPreference) {
ManualPrinterPreference preference = (ManualPrinterPreference) screen
.getPreference(i);
if (preference.printer.path.equals(printer.path)) {
// We have it already, proceed
return;
}
}
}
screen.addPreference(new ManualPrinterPreference(getContext(), printer));
}
@Override
public void onPrinterLost(DiscoveredPrinter printer) {
if (DEBUG) Log.d(TAG, "onPrinterLost: " + printer);
PreferenceScreen screen = getPreferenceScreen();
for (int i = 0; i < screen.getPreferenceCount(); i++) {
Preference preference = screen.getPreference(i);
if (preference instanceof ManualPrinterPreference) {
if (((ManualPrinterPreference) preference).printer.getUri()
.equals(printer.getUri())) {
screen.removePreference(preference);
break;
}
}
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenu.ContextMenuInfo menuInfo) {
if (view instanceof ListView) {
int position = ((AdapterView.AdapterContextMenuInfo) menuInfo).position;
Preference preference = getPreferenceScreen().getPreference(position);
if (preference instanceof ManualPrinterPreference) {
final DiscoveredPrinter printer = ((ManualPrinterPreference) preference).printer;
menu.setHeaderTitle(printer.name);
MenuItem forgetItem = menu.add(Menu.NONE, R.string.forget_printer,
Menu.NONE, R.string.forget_printer);
forgetItem.setOnMenuItemClickListener(menuItem -> {
mManualDiscovery.removeManualPrinter(printer);
return true;
});
}
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (mDialog != null && mDialog.isShowing()) {
mDialog.dismiss();
}
}
private static class ManualPrinterPreference extends Preference {
final DiscoveredPrinter printer;
ManualPrinterPreference(Context context, DiscoveredPrinter printer) {
super(context);
this.printer = printer;
setLayoutResource(R.layout.printer_item);
setTitle(printer.name);
setSummary(printer.path.getHost());
setIcon(R.drawable.ic_printer);
}
}
private class AddPrinterPreference extends Preference
implements Preference.OnPreferenceClickListener {
AddPrinterPreference() {
super(ManualPrintersFragment.this.getContext());
setTitle(R.string.add_manual_printer);
setIcon(R.drawable.ic_menu_add);
setOrder(ORDER_LAST);
setPersistent(false);
setOnPreferenceClickListener(this);
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (DEBUG) Log.d(TAG, "onPreferenceClick for addPrinterPreference");
mDialog = new AddManualPrinterDialog(getContext(), mManualDiscovery);
mDialog.show();
return true;
}
}
}