1a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato/*
2a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * Copyright (C) 2010 The Android Open Source Project
3a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato *
4a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * you may not use this file except in compliance with the License.
6a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * You may obtain a copy of the License at
7a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato *
8a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato *
10a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * Unless required by applicable law or agreed to in writing, software
11a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * See the License for the specific language governing permissions and
14a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato * limitations under the License.
15a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato */
16a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
17a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratopackage com.android.systemui.statusbar.policy;
18a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
19a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.content.BroadcastReceiver;
20a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.content.ContentResolver;
21a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.content.Context;
22a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.content.Intent;
23a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.content.IntentFilter;
24c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onoratoimport android.os.AsyncTask;
25a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.os.RemoteException;
26a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.os.ServiceManager;
275ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle;
28a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.provider.Settings;
29a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.util.Slog;
30a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratoimport android.widget.CompoundButton;
31a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
32a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onoratopublic class AirplaneModeController extends BroadcastReceiver
33a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        implements CompoundButton.OnCheckedChangeListener {
34a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    private static final String TAG = "StatusBar.AirplaneModeController";
35a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
36a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    private Context mContext;
37a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    private CompoundButton mCheckBox;
38a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
39a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    private boolean mAirplaneMode;
40a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
41a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    public AirplaneModeController(Context context, CompoundButton checkbox) {
42a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        mContext = context;
43a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        mAirplaneMode = getAirplaneMode();
44a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        mCheckBox = checkbox;
45a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        checkbox.setChecked(mAirplaneMode);
46a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        checkbox.setOnCheckedChangeListener(this);
47a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
48a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        IntentFilter filter = new IntentFilter();
49a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
50a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        context.registerReceiver(this, filter);
51a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
52a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    }
53a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
54a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    public void release() {
55a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        mContext.unregisterReceiver(this);
56a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    }
57a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
58a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    public void onCheckedChanged(CompoundButton view, boolean checked) {
59a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        if (checked != mAirplaneMode) {
60a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato            mAirplaneMode = checked;
61a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato            unsafe(checked);
62a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        }
63a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    }
64a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
65a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    public void onReceive(Context context, Intent intent) {
66a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
67a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato            final boolean enabled = intent.getBooleanExtra("state", false);
68a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato            if (enabled != mAirplaneMode) {
69a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato                mAirplaneMode = enabled;
70a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato                mCheckBox.setChecked(enabled);
71a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato            }
72a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        }
73a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    }
74a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
75a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    private boolean getAirplaneMode() {
76a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato        ContentResolver cr = mContext.getContentResolver();
77c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate        return 0 != Settings.Global.getInt(cr, Settings.Global.AIRPLANE_MODE_ON, 0);
78a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    }
79a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
80a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    // TODO: Fix this racy API by adding something better to TelephonyManager or
81a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    // ConnectivityService.
82c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato    private void unsafe(final boolean enabled) {
83c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato        AsyncTask.execute(new Runnable() {
84c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                public void run() {
85c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate                    Settings.Global.putInt(
86c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                            mContext.getContentResolver(),
87c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate                            Settings.Global.AIRPLANE_MODE_ON,
88c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                            enabled ? 1 : 0);
89c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
90c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                    intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
91c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                    intent.putExtra("state", enabled);
925ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                    mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
93c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                }
94c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato            });
95a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato    }
96a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato}
97a8e34189073c8f29f8e95db488b9a2a81019721eJoe Onorato
98