1436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby/*
2436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Copyright (C) 2011 The Android Open Source Project
3436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby *
4436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
5436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * you may not use this file except in compliance with the License.
6436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * You may obtain a copy of the License at
7436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby *
8436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
9436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby *
10436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Unless required by applicable law or agreed to in writing, software
11436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
12436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * See the License for the specific language governing permissions and
14436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * limitations under the License.
15436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */
16436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
17436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambypackage com.android.settings.bluetooth;
18436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
19436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.app.AlertDialog;
20436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothProfile;
21436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.content.Context;
22436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.content.DialogInterface;
23436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.widget.Toast;
24436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
25436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport com.android.settings.R;
26f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settings.bluetooth.DockService.DockBluetoothCallback;
27689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWestimport com.android.settings.search.Index;
28689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWestimport com.android.settings.search.SearchIndexableRaw;
29f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.LocalBluetoothManager;
30f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
31f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.Utils.ErrorListener;
32436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
33436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby/**
34436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Utils is a helper class that contains constants for various
35436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Android resource IDs, debug logging flags, and static methods
36436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * for creating dialogs.
37436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */
38f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkpublic final class Utils {
39f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    static final boolean V = com.android.settingslib.bluetooth.Utils.V; // verbose logging
40f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    static final boolean D =  com.android.settingslib.bluetooth.Utils.D;  // regular logging
41436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
42436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private Utils() {
43436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
44436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
45436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public static int getConnectionStateSummary(int connectionState) {
46436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        switch (connectionState) {
47436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        case BluetoothProfile.STATE_CONNECTED:
48436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            return R.string.bluetooth_connected;
49436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        case BluetoothProfile.STATE_CONNECTING:
50436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            return R.string.bluetooth_connecting;
51436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        case BluetoothProfile.STATE_DISCONNECTED:
52436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            return R.string.bluetooth_disconnected;
53436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        case BluetoothProfile.STATE_DISCONNECTING:
54436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            return R.string.bluetooth_disconnecting;
55436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        default:
56436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            return 0;
57436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
58436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
59436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
60436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    // Create (or recycle existing) and show disconnect dialog.
61436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    static AlertDialog showDisconnectDialog(Context context,
62436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            AlertDialog dialog,
63436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            DialogInterface.OnClickListener disconnectListener,
64436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            CharSequence title, CharSequence message) {
65436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (dialog == null) {
66436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            dialog = new AlertDialog.Builder(context)
67436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    .setPositiveButton(android.R.string.ok, disconnectListener)
68436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    .setNegativeButton(android.R.string.cancel, null)
69436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    .create();
70436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        } else {
71436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            if (dialog.isShowing()) {
72436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                dialog.dismiss();
73436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
74436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            // use disconnectListener for the correct profile(s)
75436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            CharSequence okText = context.getText(android.R.string.ok);
76436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            dialog.setButton(DialogInterface.BUTTON_POSITIVE,
77436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    okText, disconnectListener);
78436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
79436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        dialog.setTitle(title);
80436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        dialog.setMessage(message);
81436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        dialog.show();
82436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return dialog;
83436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
84436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
85436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    // TODO: wire this up to show connection errors...
86436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    static void showConnectingError(Context context, String name) {
87436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        // if (!mIsConnectingErrorPossible) {
88436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        //     return;
89436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        // }
90436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        // mIsConnectingErrorPossible = false;
91436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
92436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        showError(context, name, R.string.bluetooth_connecting_error_message);
93436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
94436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
95436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    static void showError(Context context, String name, int messageResId) {
96436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        String message = context.getString(messageResId, name);
97f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        LocalBluetoothManager manager = getLocalBtManager(context);
98bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim        Context activity = manager.getForegroundActivity();
99bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim        if(manager.isForegroundActivity()) {
100bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim            new AlertDialog.Builder(activity)
101436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                .setTitle(R.string.bluetooth_error_title)
102436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                .setMessage(message)
103436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                .setPositiveButton(android.R.string.ok, null)
104436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                .show();
105bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim        } else {
106bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim            Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
107bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim        }
108436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
109689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest
110689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest    /**
111689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest     * Update the search Index for a specific class name and resources.
112689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest     */
113689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest    public static void updateSearchIndex(Context context, String className, String title,
114689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest            String screenTitle, int iconResId, boolean enabled) {
115689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest        SearchIndexableRaw data = new SearchIndexableRaw(context);
116689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest        data.className = className;
117689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest        data.title = title;
118689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest        data.screenTitle = screenTitle;
119689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest        data.iconResId = iconResId;
120689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest        data.enabled = enabled;
121689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest
122689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest        Index.getInstance(context).updateFromSearchIndexableData(data);
123689d2ce29b3093c32d1d2b70caa6fb36a4ecefcbPauloftheWest    }
124f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk
125f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    public static LocalBluetoothManager getLocalBtManager(Context context) {
126f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        return LocalBluetoothManager.getInstance(context, mOnInitCallback);
127f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    }
128f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk
129f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    private static final ErrorListener mErrorListener = new ErrorListener() {
130f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        @Override
131f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        public void onShowError(Context context, String name, int messageResId) {
132f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk            showError(context, name, messageResId);
133f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        }
134f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    };
135f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk
136f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    private static final BluetoothManagerCallback mOnInitCallback = new BluetoothManagerCallback() {
137f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        @Override
138f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        public void onBluetoothManagerInitialized(Context appContext,
139f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk                LocalBluetoothManager bluetoothManager) {
140f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk            bluetoothManager.getEventManager().registerCallback(
141f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk                    new DockBluetoothCallback(appContext));
142f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk            com.android.settingslib.bluetooth.Utils.setErrorListener(mErrorListener);
143f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk        }
144f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monk    };
145436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby}
146