19ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang/*
29ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * Copyright (C) 2009 The Android Open Source Project
39ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang *
49ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * Licensed under the Apache License, Version 2.0 (the "License");
59ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * you may not use this file except in compliance with the License.
69ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * You may obtain a copy of the License at
79ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang *
89ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang *      http://www.apache.org/licenses/LICENSE-2.0
99ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang *
109ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * Unless required by applicable law or agreed to in writing, software
119ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * distributed under the License is distributed on an "AS IS" BASIS,
129ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * See the License for the specific language governing permissions and
149ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang * limitations under the License.
159ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang */
169ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
179ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangpackage com.android.phone;
189ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
199ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport android.content.Context;
209ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport android.os.AsyncResult;
219ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport android.os.Handler;
229ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport android.os.Message;
239ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport android.preference.CheckBoxPreference;
249ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport android.util.AttributeSet;
259ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport android.util.Log;
269ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
279ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangimport com.android.internal.telephony.Phone;
289ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
299ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhangpublic class Use2GOnlyCheckBoxPreference extends CheckBoxPreference {
309ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    private static final String LOG_TAG = "Use2GOnlyCheckBoxPreference";
319ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    private static final boolean DBG = true;
329ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
339ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    private Phone mPhone;
349ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    private MyHandler mHandler;
359ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
369ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    public Use2GOnlyCheckBoxPreference(Context context) {
379ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        this(context, null);
389ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    }
399ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
409ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    public Use2GOnlyCheckBoxPreference(Context context, AttributeSet attrs) {
419ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        this(context, attrs,com.android.internal.R.attr.checkBoxPreferenceStyle);
429ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    }
439ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
449ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    public Use2GOnlyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
459ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        super(context, attrs, defStyle);
46546a00dd3bb35abfcd44c696cd810073a084b43cWink Saville        mPhone = PhoneApp.getPhone();
479ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        mHandler = new MyHandler();
489ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        mPhone.getPreferredNetworkType(
499ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                mHandler.obtainMessage(MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
509ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    }
519ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
529ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    @Override
539ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    protected void  onClick() {
549ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        super.onClick();
559ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
569ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        int networkType = isChecked() ? Phone.NT_MODE_GSM_ONLY : Phone.NT_MODE_WCDMA_PREF;
579ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        Log.i(LOG_TAG, "set preferred network type="+networkType);
58e64151a3e3c27689f242fc59aa7d888cb70310f6Wink Saville        android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
59e64151a3e3c27689f242fc59aa7d888cb70310f6Wink Saville                android.provider.Settings.Secure.PREFERRED_NETWORK_MODE, networkType);
609ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        mPhone.setPreferredNetworkType(networkType, mHandler
619ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
629ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang   }
639ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
649ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    private class MyHandler extends Handler {
659ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
669ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        private static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0;
679ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        private static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 1;
689ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
699ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        @Override
709ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        public void handleMessage(Message msg) {
719ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            switch (msg.what) {
729ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                case MESSAGE_GET_PREFERRED_NETWORK_TYPE:
739ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                    handleGetPreferredNetworkTypeResponse(msg);
749ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                    break;
759ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
769ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                case MESSAGE_SET_PREFERRED_NETWORK_TYPE:
779ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                    handleSetPreferredNetworkTypeResponse(msg);
789ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                    break;
799ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            }
809ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        }
819ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
829ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        private void handleGetPreferredNetworkTypeResponse(Message msg) {
839ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            AsyncResult ar = (AsyncResult) msg.obj;
849ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
859ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            if (ar.exception == null) {
869ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                int type = ((int[])ar.result)[0];
875c7d3167b8372b040d6c0a695f7c0822d80b2c21Wink Saville                if (type != Phone.NT_MODE_GSM_ONLY) {
885c7d3167b8372b040d6c0a695f7c0822d80b2c21Wink Saville                    // Allow only NT_MODE_GSM_ONLY or NT_MODE_WCDMA_PREF
895c7d3167b8372b040d6c0a695f7c0822d80b2c21Wink Saville                    type = Phone.NT_MODE_WCDMA_PREF;
905c7d3167b8372b040d6c0a695f7c0822d80b2c21Wink Saville                }
919ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                Log.i(LOG_TAG, "get preferred network type="+type);
929ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                setChecked(type == Phone.NT_MODE_GSM_ONLY);
93e64151a3e3c27689f242fc59aa7d888cb70310f6Wink Saville                android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
94e64151a3e3c27689f242fc59aa7d888cb70310f6Wink Saville                        android.provider.Settings.Secure.PREFERRED_NETWORK_MODE, type);
959ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            } else {
969ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                // Weird state, disable the setting
979ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                Log.i(LOG_TAG, "get preferred network type, exception="+ar.exception);
989ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                setEnabled(false);
999ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            }
1009ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        }
1019ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
1029ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        private void handleSetPreferredNetworkTypeResponse(Message msg) {
1039ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            AsyncResult ar = (AsyncResult) msg.obj;
1049ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang
1059ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            if (ar.exception != null) {
1069ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                // Yikes, error, disable the setting
1079ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                setEnabled(false);
1089ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                // Set UI to current state
1099ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                Log.i(LOG_TAG, "set preferred network type, exception=" + ar.exception);
1109ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                mPhone.getPreferredNetworkType(obtainMessage(MESSAGE_GET_PREFERRED_NETWORK_TYPE));
1119ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            } else {
1129ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang                Log.i(LOG_TAG, "set preferred network type done");
1139ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang            }
1149ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang        }
1159ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang    }
1169ed35b1e94dbfef3ba7dbfc9add957b504e1dab0Chouting Zhang}
117