/* * Copyright (C) 2010 beworx.com * * 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.bwx.bequick.handlers; import static com.bwx.bequick.Constants.TAG; import java.util.ArrayList; import java.util.HashMap; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.provider.Settings; import android.util.Log; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.AdapterView.OnItemClickListener; import com.bwx.bequick.Constants; import com.bwx.bequick.MainSettingsActivity; import com.bwx.bequick.R; import com.bwx.bequick.fwk.Setting; import com.bwx.bequick.fwk.SettingHandler; public class RingerSettingHandler extends SettingHandler implements OnItemClickListener { class RingerStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { updateState(); } } // cache private RingerStateReceiver mReceiver; private IntentFilter mFilter; private Dialog mDialog; public RingerSettingHandler(Setting setting) { super(setting); } @Override public void activate(MainSettingsActivity activity) { mActivity = activity; IntentFilter filter = mFilter; if (filter == null) { filter = new IntentFilter(); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION); mFilter = filter; mReceiver = new RingerStateReceiver(); } // register receiver activity.registerReceiver(mReceiver, mFilter); updateState(); } @Override public void deactivate() { // unregister receiver mActivity.unregisterReceiver(mReceiver); // dismiss dialog if (mDialog != null) { mDialog.dismiss(); mDialog = null; } } private Dialog createDialog() { if (mDialog != null) return mDialog; // create dialog Dialog dialog = new Dialog(mActivity); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCanceledOnTouchOutside(true); dialog.setContentView(R.layout.simple_list_view); // prepare values ArrayList<HashMap<String, Object>> values = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> value; value = new HashMap<String, Object>(); value.put("icon", R.drawable.ic_silent); value.put("text", mActivity.getString(R.string.txt_ringer_silent)); values.add(value); value = new HashMap<String, Object>(); value.put("icon", R.drawable.ic_vibro); value.put("text", mActivity.getString(R.string.txt_ringer_vibro)); values.add(value); value = new HashMap<String, Object>(); value.put("icon", R.drawable.ic_sound); value.put("text", mActivity.getString(R.string.txt_ringer_sound)); values.add(value); value = new HashMap<String, Object>(); value.put("icon", R.drawable.ic_vibro_sound); value.put("text", mActivity.getString(R.string.txt_ringer_vibrosound)); values.add(value); SimpleAdapter adapter = new SimpleAdapter(mActivity, values, R.layout.row_ringer_mode, new String[] {"icon", "text"}, new int[] {R.id.icon, R.id.text}); ListView view = (ListView) dialog.findViewById(R.id.list); view.setAdapter(adapter); view.setOnItemClickListener(this); return dialog; } @Override public void onSelected(int buttonIndex) { if (buttonIndex == 0) { try { Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS); mActivity.startActivity(intent); } catch (Exception e1) { Log.d(TAG, "No handler for ACTION_SOUND_SETTINGS -> showing ACTION_DISPLAY_SETTINGS instead"); try { Intent intent = new Intent(Settings.ACTION_DISPLAY_SETTINGS); mActivity.startActivity(intent); } catch (Exception e2) { Log.d(TAG, "No handler for ACTION_DISPLAY_SETTINGS -> just showing dialog"); // this is version 1.5 mDialog = createDialog(); mDialog.show(); } } } else { mDialog = createDialog(); mDialog.show(); } } @Override public void onSwitched(boolean isSwitched) { AudioManager manager = (AudioManager) mActivity.getSystemService(Context.AUDIO_SERVICE); if (manager == null) return; // change audio settings manager.setRingerMode(isSwitched ? AudioManager.RINGER_MODE_NORMAL : AudioManager.RINGER_MODE_SILENT); // ringer notification is sent by Android itself validateState(manager); } private void validateState(AudioManager manager) { int ringer = manager.getRingerMode(); if (ringer != AudioManager.RINGER_MODE_SILENT && ringer != AudioManager.RINGER_MODE_VIBRATE) { // if volume is zero set it to medium int volume = manager.getStreamVolume(AudioManager.STREAM_RING); if (volume == 0) { manager.setStreamVolume(AudioManager.STREAM_RING, 4, 0); manager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, 4, 0); } } // send internal volume changed notification mActivity.sendBroadcast(new Intent(Constants.ACTION_VOLUME_UPDATED)); } private void updateState() { final AudioManager manager = (AudioManager) mActivity.getSystemService(Context.AUDIO_SERVICE); if (manager == null) return; int ringer = manager.getRingerMode(); int vibro = manager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); int descr; int icon; boolean silent = false; if (ringer == AudioManager.RINGER_MODE_SILENT) { descr = R.string.txt_ringer_silent; icon = R.drawable.ic_silent; silent = true; } else if (ringer == AudioManager.RINGER_MODE_NORMAL) { if (vibro == AudioManager.VIBRATE_SETTING_ON) { descr = R.string.txt_ringer_vibrosound; icon = R.drawable.ic_vibro_sound; } else { descr = R.string.txt_ringer_sound; icon = R.drawable.ic_sound; } } else { descr = R.string.txt_ringer_vibro; icon = R.drawable.ic_vibro; } // update setting values Setting setting = mSetting; setting.descr = mActivity.getString(descr); setting.iconId = icon; setting.checked = !silent; setting.updateView(); } @Override public void onValueChanged(int value) { // do nothing } public void onItemClick(AdapterView<?> arg0, View arg1, int index, long arg3) { AudioManager manager = (AudioManager) mActivity.getSystemService(Context.AUDIO_SERVICE); if (manager != null) { int ringerMode = AudioManager.RINGER_MODE_NORMAL; int vibroMode = AudioManager.VIBRATE_SETTING_ON; switch(index) { case 0: // silent ringerMode = AudioManager.RINGER_MODE_SILENT; vibroMode = AudioManager.VIBRATE_SETTING_ONLY_SILENT; break; case 1: // vibro ringerMode = AudioManager.RINGER_MODE_VIBRATE; vibroMode = AudioManager.VIBRATE_SETTING_ON; break; case 2: // sound ringerMode = AudioManager.RINGER_MODE_NORMAL; vibroMode = AudioManager.VIBRATE_SETTING_OFF; break; case 3: // sound and vibro ringerMode = AudioManager.RINGER_MODE_NORMAL; vibroMode = AudioManager.VIBRATE_SETTING_ON; break; } // update manager modes // update manager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, vibroMode); manager.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, vibroMode); manager.setRingerMode(ringerMode); validateState(manager); } mDialog.hide(); } }