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